Nhờ chỉnh sữa code copy tù1 1 sheet ra nhiều sheet

Liên hệ QC

Hoangkhang01213

Thành viên mới
Tham gia
9/6/18
Bài viết
30
Được thích
0
Chào mọi người mình có một vấn đề không biết làm sau nhờ mọi người hổ trợ với, mình có một file mẫu có 2 sheet "data1" và BT(28)
1. Trong file có một code VBA copy sheet và số lượng sheet cần copy do mình chọn lệnh tắt Ctrl+shift+H để mở hợp thoại,
mình muốn nhờ các bạn sửa code giúp mình là khi copy ra thì cũng đồng thời đánh số thứ tự các sheet vừa copy ra(kể cả sheet nguồn) và số thứ tự đó được đánh tại các ô P1 của các sheet.

2. Mục đích là để mình có thể dựa vào số thứ tự đó kết hợp hàm VLOOKUP để dò tìm ký hiệu mẫu từ sheet đa ta nếu các bạn có ý hay hơn nhờ các bạn tư vấn giúp minh
em xĩn cảm ơn các bạn
trước
 

File đính kèm

Chào mọi người mình có một vấn đề không biết làm sau nhờ mọi người hổ trợ với, mình có một file mẫu có 2 sheet "data1" và BT(28)
1. Trong file có một code VBA copy sheet và số lượng sheet cần copy do mình chọn lệnh tắt Ctrl+shift+H để mở hợp thoại,
mình muốn nhờ các bạn sửa code giúp mình là khi copy ra thì cũng đồng thời đánh số thứ tự các sheet vừa copy ra(kể cả sheet nguồn) và số thứ tự đó được đánh tại các ô P1 của các sheet.

2. Mục đích là để mình có thể dựa vào số thứ tự đó kết hợp hàm VLOOKUP để dò tìm ký hiệu mẫu từ sheet đa ta nếu các bạn có ý hay hơn nhờ các bạn tư vấn giúp minh
em xĩn cảm ơn các bạn
trước
Bạn có chắc là số thứ tự gán vào ô P1 không?
※ Hiện tại đang gán vào ô A1。
 
dạ số thứ tự thì gắn vào ô P1 ạ lý do sheet ddata1 đó khi chọn copy em sẽ không chọn sheet nguồn là sheet data1, bởi lý do là ô Z1 trong sheet BT28 đang tham chiếu vào đó ạ
Tôi chưa kiểm tra hết các trường hợp, bạn thử code dưới xem được chưa?!
Mã:
Private Sub CommandButton1_Click()
Dim i As Byte, ShCuoi As Byte, shc&
On Error Resume Next
    ShCuoi = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    For i = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = ShCuoi + i
        Sheets(Sheets.Count).[P1] = ShCuoi + i
    Next i
    shc = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    Sheets(ComboBox1.Value).Name = shc + 1
    Unload Me
End Sub
 
Tôi chưa kiểm tra hết các trường hợp, bạn thử code dưới xem được chưa?!
Mã:
Private Sub CommandButton1_Click()
Dim i As Byte, ShCuoi As Byte, shc&
On Error Resume Next
    ShCuoi = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    For i = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = ShCuoi + i
        Sheets(Sheets.Count).[P1] = ShCuoi + i
    Next i
    shc = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    Sheets(ComboBox1.Value).Name = shc + 1
    Unload Me
End Sub
code chạy rất đúng nhu cầu ạ em cảm ơn rất nhiều
 
Lần chỉnh sửa cuối:
code chạy rất đúng nhu cầu ạ em cảm ơn rất nhiều
nhưng mà a có thể chỉnh chút xíu nửa là kiểu như sheet nguồn tên là "BT" thì các sheet được copy ra sẽ là BT 1, BT 2, Bt3, ..., được không như vậy đở nhầm hơn nếu như khaonr thời gian sau cần copy ra thêm thì đở rối
code chạy rất đúng nhu cầu ạ em cảm ơn rất nhiều
Nhưng mà a có thể chỉnh chút xíu nửa là kiểu như sheet nguồn tên là "BT" thì các sheet được copy ra sẽ là BT 1, BT 2, Bt3, ..., được không như vậy đở nhầm hơn nếu như khaonr thời gian sau cần copy ra thêm thì đở rối
 
Nhưng mà a có thể chỉnh chút xíu nửa là kiểu như sheet nguồn tên là "BT" thì các sheet được copy ra sẽ là BT 1, BT 2, Bt3, ..., được không như vậy đở nhầm hơn nếu như khaonr thời gian sau cần copy ra thêm thì đở rối
Sửa lại một chút như thế này
Mã:
Private Sub CommandButton1_Click()
Dim i As Byte, ShCuoi As Byte, shc&, ii&
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False
If Left(ComboBox1.Value, 2) = "BT" Then
    For ii = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "BT " & ShCuoi + ii
        Sheets(Sheets.Count).[P1] = "BT " & ShCuoi + ii
    Next ii
Else
    ShCuoi = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    For i = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = ShCuoi + i
        Sheets(Sheets.Count).[P1] = ShCuoi + i
    Next i
    shc = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    Sheets(ComboBox1.Value).Name = shc + 1
End If
    Unload Me
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 
Sửa lại một chút như thế này
Mã:
Private Sub CommandButton1_Click()
Dim i As Byte, ShCuoi As Byte, shc&, ii&
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False
If Left(ComboBox1.Value, 2) = "BT" Then
    For ii = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "BT " & ShCuoi + ii
        Sheets(Sheets.Count).[P1] = "BT " & ShCuoi + ii
    Next ii
Else
    ShCuoi = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    For i = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = ShCuoi + i
        Sheets(Sheets.Count).[P1] = ShCuoi + i
    Next i
    shc = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    Sheets(ComboBox1.Value).Name = shc + 1
End If
    Unload Me
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Code đã đúng như nhu cầu rồi ạ cảm ơn anh đã hổ trợ em rất nhiệt tình
 
Sửa lại một chút như thế này
Mã:
Private Sub CommandButton1_Click()
Dim i As Byte, ShCuoi As Byte, shc&, ii&
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False
If Left(ComboBox1.Value, 2) = "BT" Then
    For ii = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "BT " & ShCuoi + ii
        Sheets(Sheets.Count).[P1] = "BT " & ShCuoi + ii
    Next ii
Else
    ShCuoi = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    For i = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = ShCuoi + i
        Sheets(Sheets.Count).[P1] = ShCuoi + i
    Next i
    shc = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    Sheets(ComboBox1.Value).Name = shc + 1
End If
    Unload Me
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Bạn THÓC rất chịu khó chứ he. Tôi mà thấy yêu cầu ẩu ẩu thế này là có ý kiến liền: BT 1, BT 2, Bt3
Cứ suy luận logic thì cứ sau 2 cái BT với chỉ số viết rời 1 dấu cách, thì sẽ có 1 Bt (t viết thường) đánh số dính liền?
 
Tôi mà thấy yêu cầu ẩu ẩu thế này là có ý kiến liền: BT 1, BT 2, Bt3
Cứ suy luận logic thì cứ sau 2 cái BT với chỉ số viết rời 1 dấu cách, thì sẽ có 1 Bt (t viết thường) đánh số dính liền?
-0-0-0-
Đúng logic của người viết code bác hả?
Em đang "quởn" nên vừa làm, vừa đoán ý thớt!
 
Bạn THÓC rất chịu khó chứ he. Tôi mà thấy yêu cầu ẩu ẩu thế này là có ý kiến liền: BT 1, BT 2, Bt3
Cứ suy luận logic thì cứ sau 2 cái BT với chỉ số viết rời 1 dấu cách, thì sẽ có 1 Bt (t viết thường) đánh số dính liền?
Cở này bị kiểm toán dí quá nên xem chưa có kỹ sẽ để ý hơn cho những lần sau cảm ơn bạn đã góp ý
 
Bạn THÓC rất chịu khó chứ he. Tôi mà thấy yêu cầu ẩu ẩu thế này là có ý kiến liền: BT 1, BT 2, Bt3
Cứ suy luận logic thì cứ sau 2 cái BT với chỉ số viết rời 1 dấu cách, thì sẽ có 1 Bt (t viết thường) đánh số dính liền?
Người ta được đãi bánh trái trước bạn ơi. Cứ khen đúng trước rồi yêu cầu chỉnh sửa sau. Dẫu bánh vẽ nhưng người trong cuộc khó nhận ra.

code chạy rất đúng nhu cầu ạ em cảm ơn rất nhiều
Nhưng mà a có thể chỉnh chút xíu nửa là kiểu như sheet nguồn tên là "BT" thì các sheet được copy ra sẽ là BT 1, BT 2, Bt3, ..., được không như vậy đở nhầm hơn nếu như khaonr thời gian sau cần copy ra thêm thì đở rối
 
Sửa lại một chút như thế này
Mã:
Private Sub CommandButton1_Click()
Dim i As Byte, ShCuoi As Byte, shc&, ii&
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False
If Left(ComboBox1.Value, 2) = "BT" Then
    For ii = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "BT " & ShCuoi + ii
        Sheets(Sheets.Count).[P1] = "BT " & ShCuoi + ii
    Next ii
Else
    ShCuoi = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    For i = 1 To ScrollBar1.Value
        Sheets(ComboBox1.Value).Copy After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = ShCuoi + i
        Sheets(Sheets.Count).[P1] = ShCuoi + i
    Next i
    shc = IIf(WorksheetFunction.IsNumber(Val(Sheets(Sheets.Count).Name)), Val(Sheets(Sheets.Count).Name), 0)
    Sheets(ComboBox1.Value).Name = shc + 1
End If
    Unload Me
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
mà anh ơi trong quá trình sử dụng em thấy thế này khi em copy lần thứ nhất VD: copy ra 3 sheet song code đếm thứ tự từ 1 đến 3 ở ô P1, nhưng khi em sửa tên sheet nguồn hoặc em copy ra thêm vài sheet nửa thì code không đếm tiếp mà lại đếm lại từ đầu, anh chỉnh giúp em cho nó tiếp tục đếm lênh khi mình copy tiếp không anh hoặc là cho cái chổ để người dùng nhập số bắt đầu đếm tiếp không anh, nhờ anh chỉnh giúp em cảm ơn trước
 
mà anh ơi trong quá trình sử dụng em thấy thế này khi em copy lần thứ nhất VD: copy ra 3 sheet song code đếm thứ tự từ 1 đến 3 ở ô P1, nhưng khi em sửa tên sheet nguồn hoặc em copy ra thêm vài sheet nửa thì code không đếm tiếp mà lại đếm lại từ đầu, anh chỉnh giúp em cho nó tiếp tục đếm lênh khi mình copy tiếp không anh hoặc là cho cái chổ để người dùng nhập số bắt đầu đếm tiếp không anh, nhờ anh chỉnh giúp em cảm ơn trước
Không biết đã đúng ý bạn chưa
Kiểm tra lại xem sao nhé!
[Ấn Ctrl+J để Copy Sheet]
Mã:
Option Explicit
Private Sub UserForm_Initialize()
Dim i As Integer, Arr(), k As Integer
ReDim Arr(1 To Sheets.Count, 1 To 1)
For i = 1 To Sheets.Count
    k = k + 1
    Arr(k, 1) = Sheets(i).Name
Next i
Cbb1.List = Arr
End Sub
Private Sub CmdCancel_Click()
    Unload Me
End Sub
Private Sub CmdOK_Click()
Dim a As Integer, b As Integer, Ws As Worksheet
Dim c As Integer, z As Integer, k As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
c = Sheets.Count
a = Txt1
If a > 0 Then
    If Left(Cbb1.Value, 1) = "D" Then
        For b = 1 To a
            z = Sheets.Count
            Sheets(Cbb1.Value).Copy after:=Sheets(c)
            ActiveSheet.Name = "D" & z
        Next b
        For Each Ws In Worksheets
            If InStr(Ws.Name, "D") > 0 Then
                k = k + 1
                Ws.Name = "Data " & k
                Ws.Range("P1").Value = "Data " & k
            End If
        Next
        Unload Me
    ElseIf Left(Cbb1.Value, 2) = "BT" Then
        For b = 1 To a
            z = Sheets.Count
            Sheets(Cbb1.Value).Copy after:=Sheets(c)
            ActiveSheet.Name = "BT " & z
            ActiveSheet.Range("P1").Value = "BT " & z
        Next b
        For Each Ws In Worksheets
            If InStr(Ws.Name, "B") > 0 Then
                k = k + 1
                Ws.Name = "BT" & k
                Ws.Range("P1").Value = "BT " & k
            End If
        Next
        Unload Me
    End If
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
 

File đính kèm

Không biết đã đúng ý bạn chưa
Kiểm tra lại xem sao nhé!
[Ấn Ctrl+J để Copy Sheet]
Mã:
Option Explicit
Private Sub UserForm_Initialize()
Dim i As Integer, Arr(), k As Integer
ReDim Arr(1 To Sheets.Count, 1 To 1)
For i = 1 To Sheets.Count
    k = k + 1
    Arr(k, 1) = Sheets(i).Name
Next i
Cbb1.List = Arr
End Sub
Private Sub CmdCancel_Click()
    Unload Me
End Sub
Private Sub CmdOK_Click()
Dim a As Integer, b As Integer, Ws As Worksheet
Dim c As Integer, z As Integer, k As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error Resume Next
c = Sheets.Count
a = Txt1
If a > 0 Then
    If Left(Cbb1.Value, 1) = "D" Then
        For b = 1 To a
            z = Sheets.Count
            Sheets(Cbb1.Value).Copy after:=Sheets(c)
            ActiveSheet.Name = "D" & z
        Next b
        For Each Ws In Worksheets
            If InStr(Ws.Name, "D") > 0 Then
                k = k + 1
                Ws.Name = "Data " & k
                Ws.Range("P1").Value = "Data " & k
            End If
        Next
        Unload Me
    ElseIf Left(Cbb1.Value, 2) = "BT" Then
        For b = 1 To a
            z = Sheets.Count
            Sheets(Cbb1.Value).Copy after:=Sheets(c)
            ActiveSheet.Name = "BT " & z
            ActiveSheet.Range("P1").Value = "BT " & z
        Next b
        For Each Ws In Worksheets
            If InStr(Ws.Name, "B") > 0 Then
                k = k + 1
                Ws.Name = "BT" & k
                Ws.Range("P1").Value = "BT " & k
            End If
        Next
        Unload Me
    End If
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Code chạy đúng như ý trên, nhưng tên sheet và số thứ tự đánh trên ô P1 bị ngược nhau anh ơi kiểu như sheet " BT 26 "thì tại ô P1 lại ghi là "BT 2" thay vì là "BT 26" với copy ra khoản 20 sheet thì thấy code chạy hơi chậm một chút anh có thể hiệu chỉnh giúp em được không ạ, em cảm ơn!
 
Web KT

Bài viết mới nhất

Back
Top Bottom