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
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
Bạn hỏi trên GPE thôi nhé. Lần sau tôi không trả lời tin nhắn đâu.

Chú ý: Bạn dùng tiếng Việt có dấu nên phải rất chú ý. Nếu hiện tại bạn đang dùng unicode tổ hợp (dựng sẵn) thì về sau cũng phải dùng unicode tổ hợp (dựng sẵn). Và chỉ chữ hoa như hiện tại vì tôi không convert dữ liệu.
Mã:
Option Explicit

Private Sub AddToDic(dic As Object, ByVal key As String, ByVal row As Long)
Dim item() As Long
    If Not dic.exists(key) Then
        ReDim item(1 To 1)
    Else
        item = dic.item(key)
        ReDim Preserve item(1 To UBound(item) + 1)
    End If
    item(UBound(item)) = row
    dic.item(key) = item
End Sub

Sub copyDL()
Dim k As Long, r As Long, c As Long
Dim Arr(), item() As Long, result(), sh As Worksheet, dic As Object
    With ThisWorkbook.Worksheets("Master")
        k = .Cells(Rows.Count, "A").End(xlUp).row
        If k < 2 Then Exit Sub
        Arr = .Range("A2:F" & k).Value
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = vbTextCompare
    For r = 1 To UBound(Arr)
        If Arr(r, 6) = "K" Then
            AddToDic dic, "K", r
        Else
            AddToDic dic, "HB", r
        End If
        Select Case Arr(r, 3)
            Case "PK":
                If Arr(r, 6) = "K" Then
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "PK_K_" & Arr(r, 5), r
                End If
            Case ChrW(272) & "I" & ChrW(7878) & "N GIA D" & ChrW(7908) & "NG"
                If Arr(r, 6) = "K" Then
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "GD_K_" & Arr(r, 5), r
                Else
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "GD_" & Arr(r, 5), r
                End If
            Case ChrW(272) & "I" & ChrW(7878) & "N L" & ChrW(7840) & "NH"
                If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "DL_" & Arr(r, 5), r
            Case ChrW(272) & "I" & ChrW(7878) & "N T" & ChrW(7916)
                If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "DT_" & Arr(r, 5), r
            Case "PK", "DV"
                If Arr(r, 6) <> "K" Then
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "PK_DV_" & Arr(r, 5), r
                End If
            Case "ĐTDĐ", "MTB", "MTXT"
                If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "DTDD_MTB_MTXT_" & Arr(r, 5), r
        End Select
    Next r
    For Each sh In ThisWorkbook.Worksheets
        If dic.exists(sh.Name) Then
            item = dic.item(sh.Name)
            ReDim result(1 To UBound(item), 1 To 6)
            For r = 1 To UBound(result)
                k = item(r)
                For c = 1 To 6
                    result(r, c) = Arr(k, c)
                Next c
            Next r
            sh.Range("A2:F100000").Clear
            With sh.Range("A2").Resize(UBound(result), 6)
                .Value = result
                .Borders.LineStyle = xlContinuous
            End With
        End If
    Next sh
    
    Set dic = Nothing
End Sub
 
Upvote 0
Bạn hỏi trên GPE thôi nhé. Lần sau tôi không trả lời tin nhắn đâu.

Chú ý: Bạn dùng tiếng Việt có dấu nên phải rất chú ý. Nếu hiện tại bạn đang dùng unicode tổ hợp (dựng sẵn) thì về sau cũng phải dùng unicode tổ hợp (dựng sẵn). Và chỉ chữ hoa như hiện tại vì tôi không convert dữ liệu.
Mã:
Option Explicit

Private Sub AddToDic(dic As Object, ByVal key As String, ByVal row As Long)
Dim item() As Long
    If Not dic.exists(key) Then
        ReDim item(1 To 1)
    Else
        item = dic.item(key)
        ReDim Preserve item(1 To UBound(item) + 1)
    End If
    item(UBound(item)) = row
    dic.item(key) = item
End Sub

Sub copyDL()
Dim k As Long, r As Long, c As Long
Dim Arr(), item() As Long, result(), sh As Worksheet, dic As Object
    With ThisWorkbook.Worksheets("Master")
        k = .Cells(Rows.Count, "A").End(xlUp).row
        If k < 2 Then Exit Sub
        Arr = .Range("A2:F" & k).Value
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = vbTextCompare
    For r = 1 To UBound(Arr)
        If Arr(r, 6) = "K" Then
            AddToDic dic, "K", r
        Else
            AddToDic dic, "HB", r
        End If
        Select Case Arr(r, 3)
            Case "PK":
                If Arr(r, 6) = "K" Then
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "PK_K_" & Arr(r, 5), r
                End If
            Case ChrW(272) & "I" & ChrW(7878) & "N GIA D" & ChrW(7908) & "NG"
                If Arr(r, 6) = "K" Then
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "GD_K_" & Arr(r, 5), r
                Else
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "GD_" & Arr(r, 5), r
                End If
            Case ChrW(272) & "I" & ChrW(7878) & "N L" & ChrW(7840) & "NH"
                If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "DL_" & Arr(r, 5), r
            Case ChrW(272) & "I" & ChrW(7878) & "N T" & ChrW(7916)
                If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "DT_" & Arr(r, 5), r
            Case "PK", "DV"
                If Arr(r, 6) <> "K" Then
                    If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "PK_DV_" & Arr(r, 5), r
                End If
            Case "ĐTDĐ", "MTB", "MTXT"
                If (Arr(r, 5) = 10) Or (Arr(r, 5) = 20) Then AddToDic dic, "DTDD_MTB_MTXT_" & Arr(r, 5), r
        End Select
    Next r
    For Each sh In ThisWorkbook.Worksheets
        If dic.exists(sh.Name) Then
            item = dic.item(sh.Name)
            ReDim result(1 To UBound(item), 1 To 6)
            For r = 1 To UBound(result)
                k = item(r)
                For c = 1 To 6
                    result(r, c) = Arr(k, c)
                Next c
            Next r
            sh.Range("A2:F100000").Clear
            With sh.Range("A2").Resize(UBound(result), 6)
                .Value = result
                .Borders.LineStyle = xlContinuous
            End With
        End If
    Next sh
   
    Set dic = Nothing
End Sub
Dạ em cám ơn anh đã hỗ trợ
 
Upvote 0
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
Tạo thêm sheet chứa điều kiện lọc, sau nầy khi cần chỉ cần chỉnh bảng điều kiện là chạy điều kiện mới
Mã:
Sub GPE()
  Dim sArr As Variant, shArr As Variant, Res As Variant, S As Variant
  Dim NH As String, Kho As Integer, LH As String
  Dim i As Long, ik As Long, n As Byte, j As Byte
 
  With Sheets("master")
    sArr = .Range("A2:F" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("ListSheet")
    shArr = .Range("A2:E" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
 
  For n = 1 To UBound(shArr)
    With Sheets(shArr(n, 1))
      i = .Range("A" & Rows.Count).End(xlUp).Row
      If i > 1 Then .Range("A2:F" & i).ClearContents
    End With
  Next n
 
  With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(sArr)
      NH = sArr(i, 3): Kho = sArr(i, 5): LH = sArr(i, 6)
      For n = 1 To UBound(shArr)
        If shArr(n, 2) <> Empty Then
          If InStr(shArr(n, 2), NH) = 0 Then GoTo Tiep
        End If
        If shArr(n, 3) <> Empty Then
          If shArr(n, 3) <> Kho Then GoTo Tiep
        End If
        If shArr(n, 4) <> Empty Then
          If (Not (shArr(n, 5) = Empty) And LH <> Empty) Or _
              (shArr(n, 5) = 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 = 1 To UBound(shArr)
      S = Split(.Item(shArr(n, 1)), ",")
      If UBound(S) > 0 Then
        ReDim Res(1 To UBound(S), 1 To 6)
        For i = 1 To UBound(S)
          ik = CLng(S(i))
          For j = 1 To 6
            Res(i, j) = sArr(ik, j)
          Next j
        Next i
        Sheets(shArr(n, 1)).Range("A2:F2").Resize(UBound(Res)) = Res
      End If
    Next n
  End With
End Sub
 

File đính kèm

  • Copy Du Lieu Theo Đieu Kien.xlsb
    46.9 KB · Đọc: 26
Upvote 0
Tạo thêm sheet chứa điều kiện lọc, sau nầy khi cần chỉ cần chỉnh bảng điều kiện là chạy điều kiện mới
Mã:
Sub GPE()
  Dim sArr As Variant, shArr As Variant, Res As Variant, S As Variant
  Dim NH As String, Kho As Integer, LH As String
  Dim i As Long, ik As Long, n As Byte, j As Byte

  With Sheets("master")
    sArr = .Range("A2:F" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("ListSheet")
    shArr = .Range("A2:E" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With

  For n = 1 To UBound(shArr)
    With Sheets(shArr(n, 1))
      i = .Range("A" & Rows.Count).End(xlUp).Row
      If i > 1 Then .Range("A2:F" & i).ClearContents
    End With
  Next n

  With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(sArr)
      NH = sArr(i, 3): Kho = sArr(i, 5): LH = sArr(i, 6)
      For n = 1 To UBound(shArr)
        If shArr(n, 2) <> Empty Then
          If InStr(shArr(n, 2), NH) = 0 Then GoTo Tiep
        End If
        If shArr(n, 3) <> Empty Then
          If shArr(n, 3) <> Kho Then GoTo Tiep
        End If
        If shArr(n, 4) <> Empty Then
          If (Not (shArr(n, 5) = Empty) And LH <> Empty) Or _
              (shArr(n, 5) = 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 = 1 To UBound(shArr)
      S = Split(.Item(shArr(n, 1)), ",")
      If UBound(S) > 0 Then
        ReDim Res(1 To UBound(S), 1 To 6)
        For i = 1 To UBound(S)
          ik = CLng(S(i))
          For j = 1 To 6
            Res(i, j) = sArr(ik, j)
          Next j
        Next i
        Sheets(shArr(n, 1)).Range("A2:F2").Resize(UBound(Res)) = Res
      End If
    Next n
  End With
End Sub

Dạ em cám ơn anh đã quan tâm, em thấy cũng tiện khi có thêm 1 Sheet DK như anh
Em cám ơn
 
Upvote 0
Em xây dựng dựa vào Sheet "DK" như anh HieuCD và đã thêm điều kiện, em đang vướng 1 trường hợp các vùng dữ liệu không đồng bộ về 1 chuẩn nên phải chia nhỏ vùng "ray" trong VBA, do còn hạn chế nên em nhờ anh chị hỗ trợ ạ
chi tiết file đính kèm
Em cám ơn
 

File đính kèm

  • TEST.xlsm
    397.8 KB · Đọc: 6
Lần chỉnh sửa cuối:
Upvote 0
Em xây dựng dựa vào Sheet "DK" như anh HieuCD và đã thêm điều kiện, em đang vướng 1 trường hợp các vùng dữ liệu không đồng bộ về 1 chuẩn nên phải chia nhỏ vùng "ray" trong VBA, do còn hạn chế nên em nhờ anh chị hỗ trợ ạ
chi tiết file đính kèm
Em cám ơn
Tên sheet không chuẩn, đã chỉnh
Tên cột không thống nhất, đã chỉnh
Dữ liệu không đầy đủ do hàm bị lổi, tự lo
Các điều kiện và cấu trúc các sheet không đồng nhất, gán kết quả các cột không liên tục, muốn chạy nhanh thì viết thêm code gán kết quả cho từng sheet.
Tạo thêm bảng cấu trúc các sheet để chỉnh lại tiêu đề cột thống nhất và chạy code chung cho tất cả các sheet
 

File đính kèm

  • TEST.xlsm
    492.6 KB · Đọc: 37
Upvote 0
Tên sheet không chuẩn, đã chỉnh
Tên cột không thống nhất, đã chỉnh
Dữ liệu không đầy đủ do hàm bị lổi, tự lo
Các điều kiện và cấu trúc các sheet không đồng nhất, gán kết quả các cột không liên tục, muốn chạy nhanh thì viết thêm code gán kết quả cho từng sheet.
Tạo thêm bảng cấu trúc các sheet để chỉnh lại tiêu đề cột thống nhất và chạy code chung cho tất cả các sheet
Dạ em cám ơn anh đã hỗ trợ, phải nói là quá tuyệt vời
 
Upvote 0
aN
Tên sheet không chuẩn, đã chỉnh
Tên cột không thống nhất, đã chỉnh
Dữ liệu không đầy đủ do hàm bị lổi, tự lo
Các điều kiện và cấu trúc các sheet không đồng nhất, gán kết quả các cột không liên tục, muốn chạy nhanh thì viết thêm code gán kết quả cho từng sheet.
Tạo thêm bảng cấu trúc các sheet để chỉnh lại tiêu đề cột thống nhất và chạy code chung cho tất cả các sheet

Chào anh HieuCD anh có thể giúp em thêm 1 điều kiện nếu Sheet "TK" rỗng thì dữ liệu các sheet cũng tự xóa đi nhe, em đang vướng khi đổ dữ liệu thì phải xóa đi hết các Sheet thì số liệu mới nhảy đúng.
Em cám ơn
Mình chèn thêm code
Mã:
  Else
                ....... = Empty
            End If

ở cuối mỗi câu lệnh đúng không anh?

Mã:
Sub GPE()
  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 i As Long, ik As Long, n As Byte, j As Byte, jk As Byte
 
  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:M" & .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
          
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            
            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
          Next i
          
          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
Private Function ViTriCot(ByVal cArr As Variant, ByVal tmp) As Byte
  For j = 2 To UBound(cArr, 2)
    If cArr(1, j) = tmp Then ViTriCot = j - 1: Exit Function
  Next j
End Function
Private Function shTest(ByVal str As String) As Boolean
  On Error Resume Next
  Sheets(str).Range("A2") = Empty
  If Err.Number = 0 Then shTest = True
  On Error GoTo 0
End Function
 
Upvote 0
aN


Chào anh HieuCD anh có thể giúp em thêm 1 điều kiện nếu Sheet "TK" rỗng thì dữ liệu các sheet cũng tự xóa đi nhe, em đang vướng khi đổ dữ liệu thì phải xóa đi hết các Sheet thì số liệu mới nhảy đúng.
Em cám ơn
Mình chèn thêm code
Mã:
  Else
                ....... = Empty
            End If

ở cuối mỗi câu lệnh đúng không anh?

Mã:
Sub GPE()
  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 i As Long, ik As Long, n As Byte, j As Byte, jk As Byte

  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:M" & .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
         
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
           
            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
          Next i
         
          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
Private Function ViTriCot(ByVal cArr As Variant, ByVal tmp) As Byte
  For j = 2 To UBound(cArr, 2)
    If cArr(1, j) = tmp Then ViTriCot = j - 1: Exit Function
  Next j
End Function
Private Function shTest(ByVal str As String) As Boolean
  On Error Resume Next
  Sheets(str).Range("A2") = Empty
  If Err.Number = 0 Then shTest = True
  On Error GoTo 0
End Function
Chỉ xóa các cột khai báo trong bảng điều kiện
Mã:
Sub GPE()
  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 i As Long, ik As Long, n As Byte, j As Byte, jk As Byte
 
  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:M" & .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 = 2 To UBound(cArr) 'xóa kêt qua truoc
    If shTest(cArr(n, 1)) Then
      For j = 2 To UBound(cArr, 2)
        If cArr(n, j) <> Empty Then
        With Sheets(cArr(n, 1))  'set sheet n
          i = .Cells(Rows.Count, j - 1).End(xlUp).Row
          If i > 17 Then .Range(.Cells(18, j - 1), .Cells(i, j - 1)).ClearContents 'xoa ket qua truoc
        End With
        End If
      Next j
    End If
  Next n
 
  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
              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
         
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            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
          Next i
         
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sheets(cArr(n, 1)).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
Chỉ xóa các cột khai báo trong bảng điều kiện
Mã:
Sub GPE()
  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 i As Long, ik As Long, n As Byte, j As Byte, jk As Byte

  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:M" & .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 = 2 To UBound(cArr) 'xóa kêt qua truoc
    If shTest(cArr(n, 1)) Then
      For j = 2 To UBound(cArr, 2)
        If cArr(n, j) <> Empty Then
        With Sheets(cArr(n, 1))  'set sheet n
          i = .Cells(Rows.Count, j - 1).End(xlUp).Row
          If i > 17 Then .Range(.Cells(18, j - 1), .Cells(i, j - 1)).ClearContents 'xoa ket qua truoc
        End With
        End If
      Next j
    End If
  Next n

  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
              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
        
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            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
          Next i
        
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sheets(cArr(n, 1)).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

Dạ em thử xóa hết các mục ở "DK" rối bấm chạy code nhưng cũng không thấy nó xóa các dữ liệu ở các sheet.
 
Upvote 0
Chỉ xóa các cột khai báo trong bảng điều kiện
Mã:
Sub GPE()
  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 i As Long, ik As Long, n As Byte, j As Byte, jk As Byte

  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:M" & .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 = 2 To UBound(cArr) 'xóa kêt qua truoc
    If shTest(cArr(n, 1)) Then
      For j = 2 To UBound(cArr, 2)
        If cArr(n, j) <> Empty Then
        With Sheets(cArr(n, 1))  'set sheet n
          i = .Cells(Rows.Count, j - 1).End(xlUp).Row
          If i > 17 Then .Range(.Cells(18, j - 1), .Cells(i, j - 1)).ClearContents 'xoa ket qua truoc
        End With
        End If
      Next j
    End If
  Next n

  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
              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
        
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            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
          Next i
        
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sheets(cArr(n, 1)).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
Dạ em đã fix được lỗi được rồi anh nhe
Em cám ơn
 
Upvote 0
Chỉ xóa các cột khai báo trong bảng điều kiện
Mã:
Sub GPE()
  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 i As Long, ik As Long, n As Byte, j As Byte, jk As Byte

  Application.ScreenUpdating = False
  With Sheets("TK")
    sArr = .Range("A2:M" & .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 = 2 To UBound(cArr) 'xóa kêt qua truoc
    If shTest(cArr(n, 1)) Then
      For j = 2 To UBound(cArr, 2)
        If cArr(n, j) <> Empty Then
        With Sheets(cArr(n, 1))  'set sheet n
          i = .Cells(Rows.Count, j - 1).End(xlUp).Row
          If i > 17 Then .Range(.Cells(18, j - 1), .Cells(i, j - 1)).ClearContents 'xoa ket qua truoc
        End With
        End If
      Next j
    End If
  Next n

  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
              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
        
          For i = 1 To UBound(S) ' gán ket qua cua các cot
            ik = CLng(S(i))
            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
          Next i
        
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sheets(cArr(n, 1)).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
Chào anh, em muốn nối thêm code này để đánh số thứ tự khi có dữ liệu, em nhờ anh hỗ trợ giúp em nhe
Em cám ơn
Mã:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([A18], [A2017].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, 2).Value = Arr
End Sub
 
Upvote 0
Chào anh, em muốn nối thêm code này để đánh số thứ tự khi có dữ liệu, em nhờ anh hỗ trợ giúp em nhe
Em cám ơn
Mã:
Sub STT()
  Dim SrcRng As Range, Arr, i As Long, n As Long
  On Error Resume Next
  Set SrcRng = Range([A18], [A2017].End(xlUp))
  Arr = SrcRng.Value
  For i = 1 To UBound(Arr, 1)
    If Arr(i, 1) <> "" Then
      n = n + 1
      Arr(i, 1) = n
    End If
  Next
  SrcRng.Offset(, 2).Value = Arr
End Sub
Đánh số thứ tự ở sheet nào?
 
Upvote 0
Yêu cầu mới thì lập chủ đề mới. Thớt trước đã nhiều cái tiện thể rồi. Người khác tìm, xem, tham khảo không hiểu tiêu đề và nội dung liên quan như nào...
 
Upvote 0
Yêu cầu mới thì lập chủ đề mới. Thớt trước đã nhiều cái tiện thể rồi. Người khác tìm, xem, tham khảo không hiểu tiêu đề và nội dung liên quan như nào...
Dạ do nó có liên quan với chủ đề này nên đôi khi sẽ không hiểu nên em xin tiếp theo chủ đề này.
Anh thông cảm
 
Upvote 0
Yêu cầu mới thì lập chủ đề mới. Thớt trước đã nhiều cái tiện thể rồi. Người khác tìm, xem, tham khảo không hiểu tiêu đề và nội dung liên quan như nào...
Thêm 2 dòng lệnh vào code
Sheets(cArr(n, 1)).Range("C18") = 1
Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
Mã:
...
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sheets(cArr(n, 1)).Range("A18").Offset(, j - 1).Resize(UBound(S)) = Res(2, j)
            End If
            Sheets(cArr(n, 1)).Range("C18") = 1
            Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
          Next j
        End If
      End If
    Next n
  End With
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Thêm 2 dòng lệnh vào code
Sheets(cArr(n, 1)).Range("C18") = 1
Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
Mã:
...
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sheets(cArr(n, 1)).Range("A18").Offset(, j - 1).Resize(UBound(S)) = Res(2, j)
            End If
            Sheets(cArr(n, 1)).Range("C18") = 1
            Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
          Next j
        End If
      End If
    Next n
  End With
  Application.ScreenUpdating = True
End Sub
Dạ em đã thử và chạy tốt rồi, rất cám ơn anh đã hỗ trợ
 
Upvote 0
Thêm 2 dòng lệnh vào code
Sheets(cArr(n, 1)).Range("C18") = 1
Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
Mã:
...
          For j = 1 To UBound(Res, 2) ' gán ket qua vào sheet n
            If Res(1, j) > 0 Then
              Sheets(cArr(n, 1)).Range("A18").Offset(, j - 1).Resize(UBound(S)) = Res(2, j)
            End If
            Sheets(cArr(n, 1)).Range("C18") = 1
            Sheets(cArr(n, 1)).Range("C18").Resize(UBound(S)).DataSeries
          Next j
        End If
      End If
    Next n
  End With
  Application.ScreenUpdating = True
End Sub
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
 

File đính kèm

  • TEST.xlsb
    697.4 KB · Đọc: 17
Upvote 0
Web KT
Back
Top Bottom