Hỏi về VBA rút trích dữ liệu không trùng lặp giữa 2 sheet?

Liên hệ QC

thanhphuongvip

Mới học VBA, hỏi ngu anh chị đừng chửi ạ
Tham gia
16/1/10
Bài viết
136
Được thích
22
Nhờ anh em giúp đỡ!

Mình có file Excel gồm 2 sheet GUI HANG và THANH TOAN rồi, trong 2 sheet đều có Mã vận đơn, công việc bây giờ là lấy mỗi Mã vận đơn ở sheet GUI HANG dò vào cột Mã vận đơn ở sheet THANH TOAN, nếu Mã vận đơn nào dò có thì thôi (tức là đã thanh toán rồi), còn mã nào dò không có thì trích toàn bộ thông tin ra sheet thứ 3 mang tên Ma Van Don Chua Thanh Toan để theo dõi (Dữ liệu ở sheet thứ 3 sẽ biến đổi khi dữ liệu ở 1 trong 2 sheet kia biến thôi)

Mục đích của công việc trên là giúp đối chiếu giữa Mã vận đơn bên gửi hàng và bên chuyển phát nhanh thanh toán, xem mã nào chưa đc thanh toán thì đòi tiền lại. Mục đích là vậy.
Xin cảm ơn rất nhiều!


214910
[/URL]
 

File đính kèm

  • DOI CHIEU 2.xlsb
    101.6 KB · Đọc: 14
Nhờ anh em giúp đỡ!

Mình có file Excel gồm 2 sheet GUI HANG và THANH TOAN rồi, trong 2 sheet đều có Mã vận đơn, công việc bây giờ là lấy mỗi Mã vận đơn ở sheet GUI HANG dò vào cột Mã vận đơn ở sheet THANH TOAN, nếu Mã vận đơn nào dò có thì thôi (tức là đã thanh toán rồi), còn mã nào dò không có thì trích toàn bộ thông tin ra sheet thứ 3 mang tên Ma Van Don Chua Thanh Toan để theo dõi (Dữ liệu ở sheet thứ 3 sẽ biến đổi khi dữ liệu ở 1 trong 2 sheet kia biến thôi)

Mục đích của công việc trên là giúp đối chiếu giữa Mã vận đơn bên gửi hàng và bên chuyển phát nhanh thanh toán, xem mã nào chưa đc thanh toán thì đòi tiền lại. Mục đích là vậy.
Xin cảm ơn rất nhiều!


214910
[/URL]
Bạn test xem sao
Mã:
Sub Loc()
Dim Gui
Dim Thanhtoan
Dim Kq
Dim i, j, k
Thanhtoan = Sheet2.Range("a20", Sheet2.Range("a1000000").End(xlUp))
Gui = Sheet1.Range("a3", Sheet1.Range("h1000000").End(xlUp))
ReDim Kq(1 To UBound(Gui), 1 To UBound(Gui, 2))
With CreateObject("Scripting.dictionary")
    For i = 1 To UBound(Thanhtoan)
        .Item(Thanhtoan(i, 1)) = ""
    Next i
    For i = 1 To UBound(Gui)
        If .exists(CStr(Gui(i, 4))) = False Then
            k = k + 1
            Kq(k, 1) = k
            For j = 2 To UBound(Gui, 2)
                Kq(k, j) = Gui(i, j)
            Next j
        End If
    Next i
End With
With Sheet3
    .Range("a4").Resize(UBound(Kq), UBound(Kq, 2)).ClearContents
    .Range("a4").Resize(k, UBound(Kq, 2)) = Kq
End With
End Sub
 
Upvote 0
Nhờ anh em giúp đỡ!

Mình có file Excel gồm 2 sheet GUI HANG và THANH TOAN rồi, trong 2 sheet đều có Mã vận đơn, công việc bây giờ là lấy mỗi Mã vận đơn ở sheet GUI HANG dò vào cột Mã vận đơn ở sheet THANH TOAN, nếu Mã vận đơn nào dò có thì thôi (tức là đã thanh toán rồi), còn mã nào dò không có thì trích toàn bộ thông tin ra sheet thứ 3 mang tên Ma Van Don Chua Thanh Toan để theo dõi (Dữ liệu ở sheet thứ 3 sẽ biến đổi khi dữ liệu ở 1 trong 2 sheet kia biến thôi)

Mục đích của công việc trên là giúp đối chiếu giữa Mã vận đơn bên gửi hàng và bên chuyển phát nhanh thanh toán, xem mã nào chưa đc thanh toán thì đòi tiền lại. Mục đích là vậy.
Xin cảm ơn rất nhiều!


214910
[/URL]
Bạn xem có đúng không nhé.
Mã:
Sub layma()
    Dim dic As Object, arr, arr1, i As Long, j As Long, lr As Long, a As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Thanh Toan")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("A20:A" & lr).Value
         For i = 1 To UBound(arr, 1)
             If Not dic.exists(arr(i, 1)) Then
                dic.Add arr(i, 1), ""
             End If
         Next i
    End With
    With Sheets("Gui Hang")
         lr = .Range("D" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:h" & lr).Value
         ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
         For i = 1 To UBound(arr, 1)
             If Not dic.exists(arr(i, 4)) Then
                a = a + 1
                For j = 2 To UBound(arr, 2)
                   arr1(a, j) = arr(i, j)
                Next j
                arr1(a, 1) = a
              End If
         Next i
   End With
   With Sheets("Ma Van Don Chua Thanh Toan")
        lr = .Range("D" & Rows.Count).End(xlUp).Row
        If lr > 3 Then .Range("A4:H" & lr).ClearContents
        If a Then .Range("A4:H4").Resize(a).Value = arr1
   End With
End Sub
 

File đính kèm

  • DOI CHIEU 2.xlsb
    107.6 KB · Đọc: 13
Upvote 0
Bạn xem có đúng không nhé.
Mã:
Sub layma()
    Dim dic As Object, arr, arr1, i As Long, j As Long, lr As Long, a As Long
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Thanh Toan")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("A20:A" & lr).Value
         For i = 1 To UBound(arr, 1)
             If Not dic.exists(arr(i, 1)) Then
                dic.Add arr(i, 1), ""
             End If
         Next i
    End With
    With Sheets("Gui Hang")
         lr = .Range("D" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:h" & lr).Value
         ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
         For i = 1 To UBound(arr, 1)
             If Not dic.exists(arr(i, 4)) Then
                a = a + 1
                For j = 2 To UBound(arr, 2)
                   arr1(a, j) = arr(i, j)
                Next j
                arr1(a, 1) = a
              End If
         Next i
   End With
   With Sheets("Ma Van Don Chua Thanh Toan")
        lr = .Range("D" & Rows.Count).End(xlUp).Row
        If lr > 3 Then .Range("A4:H" & lr).ClearContents
        If a Then .Range("A4:H4").Resize(a).Value = arr1
   End With
End Sub
Không được bạn ơi, nó ra hết các dòng trong gửi hàng luôn chứ ko có lọc ra những Mã vận đơn ko tìm thấy ở sheet Thanh Toan. Bạn xem lại giúp mình nhé!
Bài đã được tự động gộp:

Bạn test xem sao
Mã:
Sub Loc()
Dim Gui
Dim Thanhtoan
Dim Kq
Dim i, j, k
Thanhtoan = Sheet2.Range("a20", Sheet2.Range("a1000000").End(xlUp))
Gui = Sheet1.Range("a3", Sheet1.Range("h1000000").End(xlUp))
ReDim Kq(1 To UBound(Gui), 1 To UBound(Gui, 2))
With CreateObject("Scripting.dictionary")
    For i = 1 To UBound(Thanhtoan)
        .Item(Thanhtoan(i, 1)) = ""
    Next i
    For i = 1 To UBound(Gui)
        If .exists(CStr(Gui(i, 4))) = False Then
            k = k + 1
            Kq(k, 1) = k
            For j = 2 To UBound(Gui, 2)
                Kq(k, j) = Gui(i, j)
            Next j
        End If
    Next i
End With
With Sheet3
    .Range("a4").Resize(UBound(Kq), UBound(Kq, 2)).ClearContents
    .Range("a4").Resize(k, UBound(Kq, 2)) = Kq
End With
End Sub
Mình dán một vài dòng vào test thì có lúc được, có lúc báo lỗi như sau:
214949

Mình có gửi file đính kèm!
 

File đính kèm

  • DOI CHIEU 2 (2).xlsb
    96.5 KB · Đọc: 11
Upvote 0
Không được bạn ơi, nó ra hết các dòng trong gửi hàng luôn chứ ko có lọc ra những Mã vận đơn ko tìm thấy ở sheet Thanh Toan. Bạn xem lại giúp mình nhé!
Bài đã được tự động gộp:


Mình dán một vài dòng vào test thì có lúc được, có lúc báo lỗi như sau:
View attachment 214949

Mình có gửi file đính kèm!
Bạn chạy lại sub này xem.
Mã:
Sub layma()
    Dim dic As Object, arr, arr1, i As Long, j As Long, lr As Long, a As Long, dk As String
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Thanh Toan")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("A20:A" & lr).Value
         For i = 1 To UBound(arr, 1)
            dk = arr(i, 1)
             If Not dic.exists(dk) Then
                dic.Add dk, ""
             End If
         Next i
    End With
    With Sheets("Gui Hang")
         lr = .Range("D" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:h" & lr).Value
         ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
         For i = 1 To UBound(arr, 1)
           dk = arr(i, 4)
             If Not dic.exists(dk) Then
                a = a + 1
                For j = 2 To UBound(arr, 2)
                   arr1(a, j) = arr(i, j)
                Next j
                arr1(a, 1) = a
              End If
         Next i
   End With
   With Sheets("Ma Van Don Chua Thanh Toan")
        lr = .Range("D" & Rows.Count).End(xlUp).Row
        If lr > 3 Then .Range("A4:H" & lr).ClearContents
        If a Then .Range("A4:H4").Resize(a).Value = arr1
   End With
End Sub
 
Upvote 0
Không được bạn ơi, nó ra hết các dòng trong gửi hàng luôn chứ ko có lọc ra những Mã vận đơn ko tìm thấy ở sheet Thanh Toan. Bạn xem lại giúp mình nhé!
Bài đã được tự động gộp:


Mình dán một vài dòng vào test thì có lúc được, có lúc báo lỗi như sau:
View attachment 214949

Mình có gửi file đính kèm!
Đây là do không bẫy lỗi trường hợp đã thanh toán hết ( k=""). Phần with sheet3 -> đổi k=ubound(kq) sẽ hết lỗi
 
Upvote 0
Bạn chạy lại sub này xem.
Mã:
Sub layma()
    Dim dic As Object, arr, arr1, i As Long, j As Long, lr As Long, a As Long, dk As String
    Set dic = CreateObject("scripting.dictionary")
    With Sheets("Thanh Toan")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         arr = .Range("A20:A" & lr).Value
         For i = 1 To UBound(arr, 1)
            dk = arr(i, 1)
             If Not dic.exists(dk) Then
                dic.Add dk, ""
             End If
         Next i
    End With
    With Sheets("Gui Hang")
         lr = .Range("D" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:h" & lr).Value
         ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
         For i = 1 To UBound(arr, 1)
           dk = arr(i, 4)
             If Not dic.exists(dk) Then
                a = a + 1
                For j = 2 To UBound(arr, 2)
                   arr1(a, j) = arr(i, j)
                Next j
                arr1(a, 1) = a
              End If
         Next i
   End With
   With Sheets("Ma Van Don Chua Thanh Toan")
        lr = .Range("D" & Rows.Count).End(xlUp).Row
        If lr > 3 Then .Range("A4:H" & lr).ClearContents
        If a Then .Range("A4:H4").Resize(a).Value = arr1
   End With
End Sub
Đã sửa và chạy được, hiện tại chưa thấy lỗi gì, cảm ơn Snow nhé!
Bài đã được tự động gộp:

Đây là do không bẫy lỗi trường hợp đã thanh toán hết ( k=""). Phần with sheet3 -> đổi k=ubound(kq) sẽ hết lỗi
Cảm ơn bạn, để mình sửa lại xem sao! <3
 
Upvote 0
Web KT
Back
Top Bottom