Sao Chép Dữ Liệu Theo Điều Kiện

Liên hệ QC

LamNA

Thành viên tích cực
Tham gia
3/6/14
Bài viết
897
Được thích
720
Giới tính
Nam
Nghề nghiệp
Quản Lý Cửa Hàng
Chào anh chị GPE
Em có 1 file cần lọc dữ liệu ra từng loại hàng nhỏ để xử lý công việc như đính kèm, từng sheet em có chú thích, nhờ anh chị xem hỗ trợ code tự động lọc và sao chép dữ liệu nguồn theo từng điều kiện giúp em nhe.
Em cám ơn
 

File đính kèm

  • Copy Du Lieu Theo Đieu Kien.xlsb
    27.5 KB · Đọc: 29
Em nhờ anh HieuCD hỗ trợ giúp em gán dữ liệu 2 sheet "HB" và sheet "K" khi gán kết quả sẽ lọc bỏ các mã hàng trùng, đồng thời cột Số Lượng sẽ tính tổng tham chiếu ở sheet "TK" như hàm sumifs với 2 điều kiện "Mã Hàng" và "Mã Shop"
Em cám ơn
Viết code riêng hay chung với code trước?
File gởi không cho viết code
 
Upvote 0

File đính kèm

  • loc_khong... (1).xlsb
    20.7 KB · Đọc: 18
Upvote 0
Dạ viết chung code trước nhe anh, em xin lỗi quên mở, em gửi lại anh
Mã:
Sub TachKiemKe()
  Dim Sh As Worksheet
  Dim sArr As Variant, shArr As Variant, cArr As Variant
  Dim Res As Variant, S As Variant, Arr As Variant
  Dim NH As String, Kho As Integer, LH As String
  Dim key As String, key2 As String
  Dim i As Long, ik As Long, k As Long, rk As Long, n As Byte, j As Byte, jk As Byte
  
  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("DK")
    shArr = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row).Value
    cArr = .Range("P2:AC" & .Range("P" & Rows.Count).End(xlUp).Row).Value 'mang cac cot cac sheet
  End With
 
  For n = 1 To UBound(shArr) 'tao mang dieu kien cac sheet
    If shArr(n, 1) = Empty And n > 1 Then shArr(n, 1) = shArr(n - 1, 1)
    If shTest(shArr(n, 1)) Then
      For j = 4 To 12
        If shArr(n, j) <> Empty Then shArr(n, 3) = shArr(n, 3) & "," & shArr(n, j)
      Next j
    Else
      shArr(n, 1) = "No Exit"
    End If
  Next n
 
  With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(sArr) 'Lay dòng cua tung sheet
      NH = sArr(i, 12): Kho = sArr(i, 6): LH = sArr(i, 10)
      For n = 1 To UBound(shArr)
        If shArr(n, 1) = "No Exit" Then GoTo Tiep
        If shArr(n, 2) <> Empty Then
          If InStr(shArr(n, 2), NH) = 0 Or NH = Empty Then GoTo Tiep
        End If
        If shArr(n, 3) <> Empty Then
          If InStr(shArr(n, 3), Kho) = 0 Or Kho = Empty Then GoTo Tiep
        End If
        If shArr(n, 13) <> Empty Then
          If (Not (shArr(n, 14) = Empty) And LH <> Empty) Or _
              (shArr(n, 14) = Empty And LH = Empty) Then GoTo Tiep
        End If
        key = shArr(n, 1)
        If Not .exists(key) Then .Add key, "a," & i Else .Item(key) = .Item(key) & "," & i
Tiep:
      Next n
    Next i
    
    For n = 2 To UBound(cArr)
      key = cArr(n, 1)
      If .exists(key) Then
        S = Split(.Item(key), ",")
        If UBound(S) > 0 Then
          ReDim Res(1 To 2, 1 To UBound(cArr, 2) - 1) 'mang thu tu cot va ket qua cua sheet thu n
          For j = 2 To UBound(cArr, 2)
            jk = ViTriCot(cArr, cArr(n, j)) 'thu tu cot sheet TK
            If jk > 0 Then
              Set Sh = Sheets(cArr(n, 1)) 'set sheet n
              i = Sh.Cells(Rows.Count, j - 1).End(xlUp).Row
              If i > 17 Then Sh.Range(Sh.Cells(18, j - 1), Sh.Cells(i, j - 1)).ClearContents 'xoa ket qua truoc
              ReDim Arr(1 To UBound(S), 1 To 1)
              Res(1, j - 1) = jk 'thu tu cot
              Res(2, j - 1) = Arr 'mang ket qua cua cot j-1
            End If
          Next j
          k = 0
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            If InStr("HB,K", key) Then 'Sheet Hb va K
              key2 = key & "#" & sArr(ik, 1) & "#" & sArr(ik, 3)
              If Not .exists(key2) Then
                k = k + 1
                .Add key2, k
                For j = 1 To UBound(Res, 2) ' gán ket qua cua cot j
                  If Res(1, j) > 0 Then Res(2, j)(k, 1) = sArr(ik, Res(1, j))
                Next j
              Else
                rk = .Item(key2)
                Res(2, 7)(rk, 1) = Res(2, 7)(rk, 1) + sArr(ik, Res(1, 7))
              End If
            Else 'Sheet khac
              For j = 1 To UBound(Res, 2) ' gán ket qua cua cot j
                If Res(1, j) > 0 Then
                  Res(2, j)(i, 1) = sArr(ik, Res(1, j))
                End If
              Next j
            End If
          Next i
Sheets(cArr(n, 1)).Range("C18") = 1
Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sh.Range("A18").Offset(, j - 1).Resize(UBound(S)) = Res(2, j)
            End If
          Next j
        End If
      End If
    Next n
  End With
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mã:
Sub TachKiemKe()
  Dim Sh As Worksheet
  Dim sArr As Variant, shArr As Variant, cArr As Variant
  Dim Res As Variant, S As Variant, Arr As Variant
  Dim NH As String, Kho As Integer, LH As String
  Dim key As String, key2 As String
  Dim i As Long, ik As Long, k As Long, rk As Long, n As Byte, j As Byte, jk As Byte
 
  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("DK")
    shArr = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row).Value
    cArr = .Range("P2:AC" & .Range("P" & Rows.Count).End(xlUp).Row).Value 'mang cac cot cac sheet
  End With

  For n = 1 To UBound(shArr) 'tao mang dieu kien cac sheet
    If shArr(n, 1) = Empty And n > 1 Then shArr(n, 1) = shArr(n - 1, 1)
    If shTest(shArr(n, 1)) Then
      For j = 4 To 12
        If shArr(n, j) <> Empty Then shArr(n, 3) = shArr(n, 3) & "," & shArr(n, j)
      Next j
    Else
      shArr(n, 1) = "No Exit"
    End If
  Next n

  With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(sArr) 'Lay dòng cua tung sheet
      NH = sArr(i, 12): Kho = sArr(i, 6): LH = sArr(i, 10)
      For n = 1 To UBound(shArr)
        If shArr(n, 1) = "No Exit" Then GoTo Tiep
        If shArr(n, 2) <> Empty Then
          If InStr(shArr(n, 2), NH) = 0 Or NH = Empty Then GoTo Tiep
        End If
        If shArr(n, 3) <> Empty Then
          If InStr(shArr(n, 3), Kho) = 0 Or Kho = Empty Then GoTo Tiep
        End If
        If shArr(n, 13) <> Empty Then
          If (Not (shArr(n, 14) = Empty) And LH <> Empty) Or _
              (shArr(n, 14) = Empty And LH = Empty) Then GoTo Tiep
        End If
        key = shArr(n, 1)
        If Not .exists(key) Then .Add key, "a," & i Else .Item(key) = .Item(key) & "," & i
Tiep:
      Next n
    Next i
   
    For n = 2 To UBound(cArr)
      key = cArr(n, 1)
      If .exists(key) Then
        S = Split(.Item(key), ",")
        If UBound(S) > 0 Then
          ReDim Res(1 To 2, 1 To UBound(cArr, 2) - 1) 'mang thu tu cot va ket qua cua sheet thu n
          For j = 2 To UBound(cArr, 2)
            jk = ViTriCot(cArr, cArr(n, j)) 'thu tu cot sheet TK
            If jk > 0 Then
              Set Sh = Sheets(cArr(n, 1)) 'set sheet n
              i = Sh.Cells(Rows.Count, j - 1).End(xlUp).Row
              If i > 17 Then Sh.Range(Sh.Cells(18, j - 1), Sh.Cells(i, j - 1)).ClearContents 'xoa ket qua truoc
              ReDim Arr(1 To UBound(S), 1 To 1)
              Res(1, j - 1) = jk 'thu tu cot
              Res(2, j - 1) = Arr 'mang ket qua cua cot j-1
            End If
          Next j
          k = 0
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            If InStr("HB,K", key) Then 'Sheet Hb va K
              key2 = key & "#" & sArr(ik, 1) & "#" & sArr(ik, 3)
              If Not .exists(key2) Then
                k = k + 1
                .Add key2, k
                For j = 1 To UBound(Res, 2) ' gán ket qua cua cot j
                  If Res(1, j) > 0 Then Res(2, j)(k, 1) = sArr(ik, Res(1, j))
                Next j
              Else
                rk = .Item(key2)
                Res(2, 7)(rk, 1) = Res(2, 7)(rk, 1) + sArr(ik, Res(1, 7))
              End If
            Else 'Sheet khac
              For j = 1 To UBound(Res, 2) ' gán ket qua cua cot j
                If Res(1, j) > 0 Then
                  Res(2, j)(i, 1) = sArr(ik, Res(1, j))
                End If
              Next j
            End If
          Next i
Sheets(cArr(n, 1)).Range("C18") = 1
Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sh.Range("A18").Offset(, j - 1).Resize(UBound(S)) = Res(2, j)
            End If
          Next j
        End If
      End If
    Next n
  End With
  Application.ScreenUpdating = True
End Sub
Em cám ơn anh rất nhiều, code chạy tốt :D
 
Upvote 0
Em cám ơn anh rất nhiều, code chạy tốt :D
Xem lại bài cũ của anh HieuCD tìm hiểu thì thấy code a viết hay, nếu anh rảnh có đi ngang hỗ trợ giải thích chi tiết từng dòng code để em áp dụng sau này nhe
Em cám ơn
Bài đã được tự động gộp:

Mã:
Sub TachKiemKe()
  Dim Sh As Worksheet
  Dim sArr As Variant, shArr As Variant, cArr As Variant
  Dim Res As Variant, S As Variant, Arr As Variant
  Dim NH As String, Kho As Integer, LH As String
  Dim key As String, key2 As String
  Dim i As Long, ik As Long, k As Long, rk As Long, n As Byte, j As Byte, jk As Byte
 
  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("DK")
    shArr = .Range("A2:N" & .Range("A" & Rows.Count).End(xlUp).Row).Value
    cArr = .Range("P2:AC" & .Range("P" & Rows.Count).End(xlUp).Row).Value 'mang cac cot cac sheet
  End With

  For n = 1 To UBound(shArr) 'tao mang dieu kien cac sheet
    If shArr(n, 1) = Empty And n > 1 Then shArr(n, 1) = shArr(n - 1, 1)
    If shTest(shArr(n, 1)) Then
      For j = 4 To 12
        If shArr(n, j) <> Empty Then shArr(n, 3) = shArr(n, 3) & "," & shArr(n, j)
      Next j
    Else
      shArr(n, 1) = "No Exit"
    End If
  Next n

  With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(sArr) 'Lay dòng cua tung sheet
      NH = sArr(i, 12): Kho = sArr(i, 6): LH = sArr(i, 10)
      For n = 1 To UBound(shArr)
        If shArr(n, 1) = "No Exit" Then GoTo Tiep
        If shArr(n, 2) <> Empty Then
          If InStr(shArr(n, 2), NH) = 0 Or NH = Empty Then GoTo Tiep
        End If
        If shArr(n, 3) <> Empty Then
          If InStr(shArr(n, 3), Kho) = 0 Or Kho = Empty Then GoTo Tiep
        End If
        If shArr(n, 13) <> Empty Then
          If (Not (shArr(n, 14) = Empty) And LH <> Empty) Or _
              (shArr(n, 14) = Empty And LH = Empty) Then GoTo Tiep
        End If
        key = shArr(n, 1)
        If Not .exists(key) Then .Add key, "a," & i Else .Item(key) = .Item(key) & "," & i
Tiep:
      Next n
    Next i
   
    For n = 2 To UBound(cArr)
      key = cArr(n, 1)
      If .exists(key) Then
        S = Split(.Item(key), ",")
        If UBound(S) > 0 Then
          ReDim Res(1 To 2, 1 To UBound(cArr, 2) - 1) 'mang thu tu cot va ket qua cua sheet thu n
          For j = 2 To UBound(cArr, 2)
            jk = ViTriCot(cArr, cArr(n, j)) 'thu tu cot sheet TK
            If jk > 0 Then
              Set Sh = Sheets(cArr(n, 1)) 'set sheet n
              i = Sh.Cells(Rows.Count, j - 1).End(xlUp).Row
              If i > 17 Then Sh.Range(Sh.Cells(18, j - 1), Sh.Cells(i, j - 1)).ClearContents 'xoa ket qua truoc
              ReDim Arr(1 To UBound(S), 1 To 1)
              Res(1, j - 1) = jk 'thu tu cot
              Res(2, j - 1) = Arr 'mang ket qua cua cot j-1
            End If
          Next j
          k = 0
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            If InStr("HB,K", key) Then 'Sheet Hb va K
              key2 = key & "#" & sArr(ik, 1) & "#" & sArr(ik, 3)
              If Not .exists(key2) Then
                k = k + 1
                .Add key2, k
                For j = 1 To UBound(Res, 2) ' gán ket qua cua cot j
                  If Res(1, j) > 0 Then Res(2, j)(k, 1) = sArr(ik, Res(1, j))
                Next j
              Else
                rk = .Item(key2)
                Res(2, 7)(rk, 1) = Res(2, 7)(rk, 1) + sArr(ik, Res(1, 7))
              End If
            Else 'Sheet khac
              For j = 1 To UBound(Res, 2) ' gán ket qua cua cot j
                If Res(1, j) > 0 Then
                  Res(2, j)(i, 1) = sArr(ik, Res(1, j))
                End If
              Next j
            End If
          Next i
Sheets(cArr(n, 1)).Range("C18") = 1
Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sh.Range("A18").Offset(, j - 1).Resize(UBound(S)) = Res(2, j)
            End If
          Next j
        End If
      End If
    Next n
  End With
  Application.ScreenUpdating = True
End Sub
Xem lại bài cũ của anh HieuCD tìm hiểu thì thấy code a viết hay, nếu anh rảnh có đi ngang hỗ trợ giải thích chi tiết từng dòng code để em áp dụng sau này nhe
Em cám ơn
 
Upvote 0
Xem lại bài cũ của anh HieuCD tìm hiểu thì thấy code a viết hay, nếu anh rảnh có đi ngang hỗ trợ giải thích chi tiết từng dòng code để em áp dụng sau này nhe
Em cám ơn
Bài đã được tự động gộp:


Xem lại bài cũ của anh HieuCD tìm hiểu thì thấy code a viết hay, nếu anh rảnh có đi ngang hỗ trợ giải thích chi tiết từng dòng code để em áp dụng sau này nhe
Em cám ơn
Lâu quá nên mình quên thuật toán rồi
Code gom kết quả các sheet vào 1 mảng nên khá phức tạp, và khó giải thích cách vận hành
 
Upvote 0
(Bắt chước câu nói của anh nào đó) "Dóc tổ!"
Chưa hiểu (vì đang nhờ giải thích) mà thấy hay?
Có khả năng dóc nhưng mà chưa tổ.
Thấy ra kết quả như mong muốn là cho là hay được rồi, chưa cần phải hiểu.
Chạy vài lần rồi thì mới biết cái "mong muốn" kia có thực sự là mục đích cuối hay không.

Lưu ý: tôi khong hề nói code chạy sai. Nếu thớt nói code chạy được rồi thì có nghĩa là nó chạy đúng và đã làm được cái mà thớt yêu cầu.
Toi chỉ nói là có thể cái thớt cần thiết nó phức tạp hơn cái thớt yêu cầu.
 
Upvote 0
- Thực tế em đang dùng code của anh Hiếu cho file riêng để phục vụ công việc, những lúc rãnh rỗi thì mang nó ra học có thể áp dụng khi cần,
- Code hay có nghĩa nó tuyệt vời đối với bản thân em HƠN SỰ MONG ĐỢI, nhưng đối với anh chị có thể có cách hay hơn. ( Hay không phải hiểu code mà là áp dụng vào file công việc thực tế tốt)
- Việc em khen cũng là tế nhị khích lệ cám ơn các anh đã nhiệt tình hỗ trợ, em không nghĩ lại cho em là "dóc tổ".
 
Upvote 0
Web KT
Back
Top Bottom