So sánh hai dữ liệu trùng nhau bằng VBA

Liên hệ QC

ducmagic88

Thành viên chính thức
Tham gia
14/4/20
Bài viết
65
Được thích
4
Các bác ơi, cho em hỏi với ạ, bây giờ e có 2 sheet:
- Sheet1 là dữ liệu phát sinh, trong này tên khách hàng sẽ bị trùng nhau do từng lần phát sinh mua hàng
- Sheet4 là danh sách tên khách hàng
Mong muốn: Bây giờ em muốn xử lý sheet1 để thành 1 mảng không trùng tên khách hàng và so sánh với sheet4. Sau khi so sánh với sheet4 tên khách hàng nào sheet1 và sheet4 trùng nhau thì cho phép in còn không có thì bỏ qua. Các bác giúp em với ạ, em cảm ơn!
Lưu ý: Trong file em gửi ở dưới đây em đang viết code ở module1 và tên sub là "In_hang_loat" ạ.
 

File đính kèm

  • FILE_CONG_NO_VBA - Copy.xlsm
    199.5 KB · Đọc: 18
Sửa lại dữ liệu cho chuẩn hoá đi bạn rồi mới tính tới viết code xử lý.
Mở cái DM_KH của bạn lên là thấy xong rồi. Mã KH mà bạn dùng luôn nguyên cái tên dài sọc với số lượng ký tự không đồng nhất, dấu tiếng Việt, ký tự đặc biệt (dấu gạch nối "-": trong truy vấn sẽ bị hiểu thành dấu trừ).
Mã KH bạn "phải" thiết kế giống dạng mã số chứng từ đang có trong file bạn đó: BH14509. Bạn tham khảo code tạo mã của bác SA_DQ đó.
- Không dấu
- Không khoảng trắng
- Cố định số ký tự.

Nếu bây giờ xử lý code cho bạn thì tôi biết nhiều người làm được nhưng đó chỉ là giải pháp mì ăn liền thôi, để phát triển ứng dụng thêm nữa thì sau này chết chắc đó.
 
Upvote 0
Các bác ơi, cho em hỏi với ạ, bây giờ e có 2 sheet:
- Sheet1 là dữ liệu phát sinh, trong này tên khách hàng sẽ bị trùng nhau do từng lần phát sinh mua hàng
- Sheet4 là danh sách tên khách hàng
Mong muốn: Bây giờ em muốn xử lý sheet1 để thành 1 mảng không trùng tên khách hàng và so sánh với sheet4. Sau khi so sánh với sheet4 tên khách hàng nào sheet1 và sheet4 trùng nhau thì cho phép in còn không có thì bỏ qua. Các bác giúp em với ạ, em cảm ơn!
Lưu ý: Trong file em gửi ở dưới đây em đang viết code ở module1 và tên sub là "In_hang_loat" ạ.

Tôi lấy được danh sách những khách hàng trùng trong list khách hàng
Các bác ơi, cho em hỏi với ạ, bây giờ e có 2 sheet:
- Sheet1 là dữ liệu phát sinh, trong này tên khách hàng sẽ bị trùng nhau do từng lần phát sinh mua hàng
- Sheet4 là danh sách tên khách hàng
Mong muốn: Bây giờ em muốn xử lý sheet1 để thành 1 mảng không trùng tên khách hàng và so sánh với sheet4. Sau khi so sánh với sheet4 tên khách hàng nào sheet1 và sheet4 trùng nhau thì cho phép in còn không có thì bỏ qua. Các bác giúp em với ạ, em cảm ơn!
Lưu ý: Trong file em gửi ở dưới đây em đang viết code ở module1 và tên sub là "In_hang_loat" ạ.

Theo ý hiểu tôi đã lấy ra những khách hàng trùng trong list DM_KH và đưa nó vào ô C1 trong Sheets("CHI_TIET_131") còn phần in bạn làm đi nhé

C:
Sub locKhachhang()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
  Dim Dic As Object: Set Dic = CreateObject("Scripting.dictionary")
  Dim ArrData(), ArrKH(), ArrKHPrint()
  Dim i As Long, sKey
    With ThisWorkbook.Sheets("Data")
        ArrData = .Range("E2:E" & .Range("E" & Rows.Count).End(3).Row).Value
          For i = 1 To UBound(ArrData())
              If ArrData(i, 1) <> "" Then
                  sKey = ArrData(i, 1)
                    If Not Dic.exists(sKey) Then
                         Dic.Add sKey, ""
                    End If
              End If
          Next
    End With
    With ThisWorkbook.Sheets("DM_KH")
      ArrKH = .Range("B3:B" & .Range("B" & Rows.Count).End(3).Row).Value
      ReDim ArrKHPrint(1 To UBound(ArrKH, 1), 1 To 1)
        For k = 1 To UBound(ArrKH())
            If Dic.exists(ArrKH(k, 1)) Then
                m = m + 1
               ArrKHPrint(m, 1) = ArrKH(k, 1)
            End If
        Next
    End With
 
    With Sheet2
        For o = LBound(ArrKHPrint, 1) To UBound(ArrKHPrint, 1)
          .[C1].Value = ArrKHPrint(o, 1)    ' -------------->>>>>>>>>>>>>>>> Lay du lieu khach hang TRUng` trong List DM_KH

        Next
    End With
    
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
 
 
  'viec tiep theo in thi` ban tu lam di nhe
End Sub
 
Upvote 0
Sửa lại dữ liệu cho chuẩn hoá đi bạn rồi mới tính tới viết code xử lý.
Mở cái DM_KH của bạn lên là thấy xong rồi. Mã KH mà bạn dùng luôn nguyên cái tên dài sọc với số lượng ký tự không đồng nhất, dấu tiếng Việt, ký tự đặc biệt (dấu gạch nối "-": trong truy vấn sẽ bị hiểu thành dấu trừ).
Mã KH bạn "phải" thiết kế giống dạng mã số chứng từ đang có trong file bạn đó: BH14509. Bạn tham khảo code tạo mã của bác SA_DQ đó.
- Không dấu
- Không khoảng trắng
- Cố định số ký tự.

Nếu bây giờ xử lý code cho bạn thì tôi biết nhiều người làm được nhưng đó chỉ là giải pháp mì ăn liền thôi, để phát triển ứng dụng thêm nữa thì sau này chết chắc đó.
Em cũng tính là sẽ tạo lại mã khách hàng mà do em lười tạo lại userform nên để thế luôn, sau khi bác nói chắc em phải tạo lại ngay :3
 
Upvote 0
Tôi lấy được danh sách những khách hàng trùng trong list khách hàng


Theo ý hiểu tôi đã lấy ra những khách hàng trùng trong list DM_KH và đưa nó vào ô C1 trong Sheets("CHI_TIET_131") còn phần in bạn làm đi nhé

C:
Sub locKhachhang()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
  Dim Dic As Object: Set Dic = CreateObject("Scripting.dictionary")
  Dim ArrData(), ArrKH(), ArrKHPrint()
  Dim i As Long, sKey
    With ThisWorkbook.Sheets("Data")
        ArrData = .Range("E2:E" & .Range("E" & Rows.Count).End(3).Row).Value
          For i = 1 To UBound(ArrData())
              If ArrData(i, 1) <> "" Then
                  sKey = ArrData(i, 1)
                    If Not Dic.exists(sKey) Then
                         Dic.Add sKey, ""
                    End If
              End If
          Next
    End With
    With ThisWorkbook.Sheets("DM_KH")
      ArrKH = .Range("B3:B" & .Range("B" & Rows.Count).End(3).Row).Value
      ReDim ArrKHPrint(1 To UBound(ArrKH, 1), 1 To 1)
        For k = 1 To UBound(ArrKH())
            If Dic.exists(ArrKH(k, 1)) Then
                m = m + 1
               ArrKHPrint(m, 1) = ArrKH(k, 1)
            End If
        Next
    End With

    With Sheet2
        For o = LBound(ArrKHPrint, 1) To UBound(ArrKHPrint, 1)
          .[C1].Value = ArrKHPrint(o, 1)    ' -------------->>>>>>>>>>>>>>>> Lay du lieu khach hang TRUng` trong List DM_KH

        Next
    End With
   
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True


  'viec tiep theo in thi` ban tu lam di nhe
End Sub
bác cho em hỏi 1 chút ạ, vì phần dictionary em chưa có tìm hiểu, mà em thấy code bác viết vậy nên em đoán 1 sub chỉ chứa 1 dictionary đúng không ạ?
 
Upvote 0
Em cũng tính là sẽ tạo lại mã khách hàng mà do em lười tạo lại userform nên để thế luôn, sau khi bác nói chắc em phải tạo lại ngay :3

Dữ liệu mới có chút ít, form cũng chưa nhiều thì lo sửa ngay đi bạn. Sửa luôn cho các dữ liệu nào thuộc dạng danh mục (NCC, Vật tư...).
Dữ liệu tổ chức chuẩn hoá, hợp lý giúp cho việc viết code xử lý, truy vấn dễ dàng hơn rất nhiều.
 
Upvote 1
Web KT
Back
Top Bottom