Nhờ code VBA coppy từ sheet này sang sheet kia có điều kiện

Liên hệ QC

kacalic

Thành viên mới
Tham gia
13/1/16
Bài viết
18
Được thích
1
Nhờ các anh chị trên diễn đàn hỗ trợ giúp mình với ạ. ý mình như thế này ạ. khi mình nhấn nút update nơi sheet 1. thì nó sẽ sẽ check bên sheet 2 những dòng nào có bên sheet 2 mà chưa có bên sheet 1 thì sẽ coppy sang sheet1
thứ hai là tìm dòng cuối cùng nơi sheet1 để paste vào
 

File đính kèm

Nhờ các anh chị trên diễn đàn hỗ trợ giúp mình với ạ. ý mình như thế này ạ. khi mình nhấn nút update nơi sheet 1. thì nó sẽ sẽ check bên sheet 2 những dòng nào có bên sheet 2 mà chưa có bên sheet 1 thì sẽ coppy sang sheet1
thứ hai là tìm dòng cuối cùng nơi sheet1 để paste vào
Dòng ở bên sheet 2 đã có ở bên sheet 1 là theo điều kiện nào bạn? DV, Account,...
Bạn dùng lệnh đếm theo điều kiện đó? Nếu đếm có thì bỏ qua, nếu đếm không thì xác định dòng cuối cùng, copy đưa qua
Ví dụ: Mình đếm theo điều kiện DV
PHP:
Sub Copy()
    Dim s1 As Worksheet, s2 As Worksheet
    Set s1 = Sheets(1)
    Set s2 = Sheets(2)
    With s1
        Dim r As Long
        For r = 3 To .Range("C" & .Cells.Rows.Count).End(xlUp).Row
            Dim m As String
            m = .Range("B" & r).Value
            If WorksheetFunction.CountIf(s2.Range("B:B"), m) = 0 Then
                Dim rc As Long
                rc = s2.Range("C" & .Cells.Rows.Count).End(xlUp).Row + 1
                .Range("A" & r).EntireRow.Copy s2.Range("A" & rc)
               
            End If
        Next
    End With
End Sub
 
Lần chỉnh sửa cuối:
Dòng ở bên sheet 2 đã có ở bên sheet 1 là theo điều kiện nào bạn? DV, Account,...
Bạn dùng lệnh đếm theo điều kiện đó? Nếu đếm có thì bỏ qua, nếu đếm không thì xác định dòng cuối cùng, copy đưa qua
Ví dụ: Mình đếm theo điều kiện DV
PHP:
Sub Copy()
    Dim s1 As Worksheet, s2 As Worksheet
    Set s1 = Sheets(1)
    Set s2 = Sheets(2)
    With s1
        Dim r As Long
        For r = 3 To .Range("C" & .Cells.Rows.Count).End(xlUp).Row
            Dim m As String
            m = .Range("B" & r).Value
            If WorksheetFunction.CountIf(s2.Range("B:B"), m) = 0 Then
                Dim rc As Long
                rc = s2.Range("C" & .Cells.Rows.Count).End(xlUp).Row + 1
                .Range("A" & r).EntireRow.Copy s2.Range("A" & rc)
              
            End If
        Next
    End With
End Sub
Theo điều kiện là account bạn ơi.....
Bài đã được tự động gộp:

Dòng ở bên sheet 2 đã có ở bên sheet 1 là theo điều kiện nào bạn? DV, Account,...
Bạn dùng lệnh đếm theo điều kiện đó? Nếu đếm có thì bỏ qua, nếu đếm không thì xác định dòng cuối cùng, copy đưa qua
Ví dụ: Mình đếm theo điều kiện DV
PHP:
Sub Copy()
    Dim s1 As Worksheet, s2 As Worksheet
    Set s1 = Sheets(1)
    Set s2 = Sheets(2)
    With s1
        Dim r As Long
        For r = 3 To .Range("C" & .Cells.Rows.Count).End(xlUp).Row
            Dim m As String
            m = .Range("B" & r).Value
            If WorksheetFunction.CountIf(s2.Range("B:B"), m) = 0 Then
                Dim rc As Long
                rc = s2.Range("C" & .Cells.Rows.Count).End(xlUp).Row + 1
                .Range("A" & r).EntireRow.Copy s2.Range("A" & rc)
              
            End If
        Next
    End With
End Sub
Nó sẽ dò coi account bên sheet 2 có mà bên sheet 1 ko có thì sẽ coppy sang vào dòng cuối
 
Nhờ các anh chị trên diễn đàn hỗ trợ giúp mình với ạ. ý mình như thế này ạ. khi mình nhấn nút update nơi sheet 1. thì nó sẽ sẽ check bên sheet 2 những dòng nào có bên sheet 2 mà chưa có bên sheet 1 thì sẽ coppy sang sheet1
thứ hai là tìm dòng cuối cùng nơi sheet1 để paste vào
Mã:
Sub update()
Dim arr, arr1, arr2
Dim a As Long, i As Long, b As Long, j As Long
Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
With Sheet2
    arr = .Range("A2:L" & .Range("C" & Rows.Count).End(xlUp).Row).Value
    For i = 1 To UBound(arr, 1)
        If dic.exists(arr(i, 3)) = 0 Then
            dic.Item(arr(i, 3)) = "KK"
        End If
    Next i
End With
With Sheet1
     arr1 = .Range("A3:L" & .Range("C" & Rows.Count).End(xlUp).Row).Value
     ReDim arr2(1 To UBound(arr1, 1), 1 To 12)
     For i = 1 To UBound(arr1, 1)
         If dic.exists(arr1(i, 3)) = 0 Then
            a = a + 1
            For j = 1 To 12
               arr2(a, j) = arr1(i, j)
            Next j
         End If
     Next i
End With
With Sheet2
     b = .Range("C" & Rows.Count).End(xlUp).Row + 1
     If a Then .Range("A" & b).Resize(a, 12).Value = arr2
End With
End Sub
Bạn xem code.
 
Mã:
Sub update()
Dim arr, arr1, arr2
Dim a As Long, i As Long, b As Long, j As Long
Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
With Sheet2
    arr = .Range("A2:L" & .Range("C" & Rows.Count).End(xlUp).Row).Value
    For i = 1 To UBound(arr, 1)
        If dic.exists(arr(i, 3)) = 0 Then
            dic.Item(arr(i, 3)) = "KK"
        End If
    Next i
End With
With Sheet1
     arr1 = .Range("A3:L" & .Range("C" & Rows.Count).End(xlUp).Row).Value
     ReDim arr2(1 To UBound(arr1, 1), 1 To 12)
     For i = 1 To UBound(arr1, 1)
         If dic.exists(arr1(i, 3)) = 0 Then
            a = a + 1
            For j = 1 To 12
               arr2(a, j) = arr1(i, j)
            Next j
         End If
     Next i
End With
With Sheet2
     b = .Range("C" & Rows.Count).End(xlUp).Row + 1
     If a Then .Range("A" & b).Resize(a, 12).Value = arr2
End With
End Sub
Bạn xem code.
Dùng scripting.dictionarynhanh hơn là mình dò từng dòng trong excel nhìu không ạ? Em thấy các thầy toàn dùng scripting.dictionary.
 
Mã:
Sub update()
Dim arr, arr1, arr2
Dim a As Long, i As Long, b As Long, j As Long
Dim dic As Object
Set dic = CreateObject("scripting.dictionary")
With Sheet2
    arr = .Range("A2:L" & .Range("C" & Rows.Count).End(xlUp).Row).Value
    For i = 1 To UBound(arr, 1)
        If dic.exists(arr(i, 3)) = 0 Then
            dic.Item(arr(i, 3)) = "KK"
        End If
    Next i
End With
With Sheet1
     arr1 = .Range("A3:L" & .Range("C" & Rows.Count).End(xlUp).Row).Value
     ReDim arr2(1 To UBound(arr1, 1), 1 To 12)
     For i = 1 To UBound(arr1, 1)
         If dic.exists(arr1(i, 3)) = 0 Then
            a = a + 1
            For j = 1 To 12
               arr2(a, j) = arr1(i, j)
            Next j
         End If
     Next i
End With
With Sheet2
     b = .Range("C" & Rows.Count).End(xlUp).Row + 1
     If a Then .Range("A" & b).Resize(a, 12).Value = arr2
End With
End Sub
Bạn xem code.
Đúng ý mình rồi... cảm ơn bạn nhiều nhiều ạ :):):):):)
 
Nhanh hơn nhiều chứ bạn nó tối ưu được vòng lặp mà.
Bạn ơi giúp mình 1 chút nữa với ạ. Ví dụ: account ở ô B5 (sheet2) đối chiếu sang cột account( sheet1) xem số tiền của nó là báo nhiều thì sẽ copy về ô E5 bên sheet 2. nếu không thấy thì bỏ qua. Tương tự như vậy với các ô B6.B7... file mình đính kèm đó bạn xem cho dể hiểu hơn ạ . cảm ơn bạn nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
Có thể dùng vlookup cụng được nhưng minh đang dùng đọan code lấy dử liệu từ file khác đẩy vô sheet 1. sau đó lại vlookup bằng tay để lấy số tiền nên hơi lâu nên muốn nhờ bạn code để gộp vào 1 nút luôn.
 
Bạn ơi giúp mình 1 chút nữa với ạ. Ví dụ: account ở ô B5 (sheet2) đối chiếu sang cột account( sheet1) xem số tiền của nó là báo nhiều thì sẽ copy về ô E5 bên sheet 2. nếu không thấy thì bỏ qua. Tương tự như vậy với các ô B6.B7... file mình đính kèm đó bạn xem cho dể hiểu hơn ạ . cảm ơn bạn nhiều
Code cho file bài #8
PHP:
Public Sub sGpe()
Dim Dic As Object, sArr(), dArr(), I As Long, R As Long, Rws As Long, Txt As String
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
    For I = 1 To R
        Dic.Item(sArr(I, 1)) = I
    Next I
End With
With Sheet2
    dArr = .Range("B5", .Range("D5").End(xlDown)).Resize(, 4).Value
    R = UBound(dArr)
    For I = 1 To R
        Txt = dArr(I, 1)
        If Dic.Exists(Txt) Then
            Rws = Dic.Item(Txt)
            dArr(I, 2) = sArr(Rws, 2)
            dArr(I, 4) = sArr(Rws, 3)
        End If
    Next I
    .Range("B5").Resize(R, 4) = dArr
End With
Set Dic = Nothing
End Sub
 
Code cho file bài #8
PHP:
Public Sub sGpe()
Dim Dic As Object, sArr(), dArr(), I As Long, R As Long, Rws As Long, Txt As String
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
    For I = 1 To R
        Dic.Item(sArr(I, 1)) = I
    Next I
End With
With Sheet2
    dArr = .Range("B5", .Range("D5").End(xlDown)).Resize(, 4).Value
    R = UBound(dArr)
    For I = 1 To R
        Txt = dArr(I, 1)
        If Dic.Exists(Txt) Then
            Rws = Dic.Item(Txt)
            dArr(I, 2) = sArr(Rws, 2)
            dArr(I, 4) = sArr(Rws, 3)
        End If
    Next I
    .Range("B5").Resize(R, 4) = dArr
End With
Set Dic = Nothing
End Sub
cảm ơn bạn nhiều nhiều lắm ạ ^^
 
Code cho file bài #8
PHP:
Public Sub sGpe()
Dim Dic As Object, sArr(), dArr(), I As Long, R As Long, Rws As Long, Txt As String
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
    For I = 1 To R
        Dic.Item(sArr(I, 1)) = I
    Next I
End With
With Sheet2
    dArr = .Range("B5", .Range("D5").End(xlDown)).Resize(, 4).Value
    R = UBound(dArr)
    For I = 1 To R
        Txt = dArr(I, 1)
        If Dic.Exists(Txt) Then
            Rws = Dic.Item(Txt)
            dArr(I, 2) = sArr(Rws, 2)
            dArr(I, 4) = sArr(Rws, 3)
        End If
    Next I
    .Range("B5").Resize(R, 4) = dArr
End With
Set Dic = Nothing
End Sub
cái này lúc nó đối chiếu thì nó phân biệt chữ in hoa và in thường bạn có sửa lại thành không phân biệt chữ in hoa in thường được không ạ
 
cái này lúc nó đối chiếu thì nó phân biệt chữ in hoa và in thường bạn có sửa lại thành không phân biệt chữ in hoa in thường được không ạ
Bạn thêm câu lệnh này dưới chỗ set dic=....
Mã:
Dic.CompareMode = vbTextCompare
 
Web KT

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

Back
Top Bottom