Xin giúp viết mã VBA gộp dữ liệu từ 2 sheet!

Liên hệ QC

theanhst92

Thành viên hoạt động
Tham gia
31/3/16
Bài viết
134
Được thích
15
Lời đầu tiên cho em xin phép được gửi lời chào đến tất cả mọi người ạ!
Em đang cần dùng mã để gộp dữ liệu tự động cho 2 sheet dữ liệu, mong được mọi người giúp đỡ em với ạ!
Em xin mô tả qua vấn đề như sau:
Hiện tại em có 2 sheet dữ liệu. cả 2 sheet này có cấu trúc giống nhau. giờ em muốn gộp dữ liệu cả 2 sheet này lại vào 1 sheet và tính tổng dữ liệu phát sinh theo điều kiện là ngày, chứng từ và mã hàng.
hy vọng mọi người giúp em với ạ!
 

File đính kèm

  • GOPDL.xlsm
    11.4 KB · Đọc: 19
Lời đầu tiên cho em xin phép được gửi lời chào đến tất cả mọi người ạ!
Em đang cần dùng mã để gộp dữ liệu tự động cho 2 sheet dữ liệu, mong được mọi người giúp đỡ em với ạ!
Em xin mô tả qua vấn đề như sau:
Hiện tại em có 2 sheet dữ liệu. cả 2 sheet này có cấu trúc giống nhau. giờ em muốn gộp dữ liệu cả 2 sheet này lại vào 1 sheet và tính tổng dữ liệu phát sinh theo điều kiện là ngày, chứng từ và mã hàng.
hy vọng mọi người giúp em với ạ!
Chạy code
Mã:
Sub ABC()
  Dim sArr(), Res(), Dic As Object, iNgay, iKey$
  Dim sRow&, i&, k&, iR&, jCol&
 
  For n = 1 To 2
    sRow = sRow + Sheets("DL" & n).Range("I" & Rows.Count).End(xlUp).Row - 3
  Next n
  ReDim Res(1 To sRow, 1 To 9)
  Set Dic = CreateObject("scripting.dictionary")
  jCol = 7
  For n = 1 To 2
    With Sheets("DL" & n)
      sArr = .Range("B5", .Range("I" & Rows.Count).End(xlUp)).Value
    End With
    For i = 1 To UBound(sArr)
      ngay = sArr(i, 1)
      If ngay <> Empty Then
        iKey = Format(sArr(i, 1), "000000") & "|2|" & sArr(i, 2) & "|" & sArr(i, 4)
        If Dic.exists(iKey) = False Then
          k = k + 1
          Dic.Add iKey, k
          For j = 1 To 6
            Res(k, j) = sArr(i, j)
          Next j
          Res(k, 9) = iKey
        End If
        iR = Dic.Item(iKey)
        Res(iR, jCol) = Res(iR, jCol) + sArr(i, 8)
      
        If Dic.exists(ngay) = False Then
          k = k + 1
          Res(k, 9) = Replace(iKey, "|2|", "|1|")
          Dic.Add ngay, ""
        End If
      End If
    Next i
    jCol = jCol + 1
  Next n
  Application.ScreenUpdating = False
  With Sheets("GOP")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("B5:J" & i).ClearContents
    .Range("B4").Resize(k, 9) = Res
    .Range("B4").Resize(k, 9).Sort .Range("J4"), 1, Header:=xlNo
    .Range("J4").Resize(k).ClearContents
  End With
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
Ngoài lề 1 chút: Chủ bài đăng xem nếu có thể áp dụng bộ mã mới như sau (?):

Mã hàngTên hàngĐvtQuy cách=>Mã mới
MH001Hàng hoá 001đôiL=>MH001L_
MH001Hàng hoá 001đôiLM=>MH001LM
MH001Hàng hoá 001đôiLS=>MH001LS
MH001Hàng hoá 001đôiM=>MH001M_
MH001Hàng hoá 001đôiML=>MH001ML
MH001Hàng hoá 001đôiMM=>MH001MM
MH001Hàng hoá 001đôiMS=>MH001MS
MH001Hàng hoá 001đôiS=>MH001S_
MH001Hàng hoá 001đôiSL=>MH001SL
MH001Hàng hoá 001đôiSS=>MH001SS
MH002Hàng hoá 002đôiL=>MH002L_
MH002Hàng hoá 002đôiLM=>MH002LM
MH002Hàng hoá 002đôiLS=>MH002LS
MH002Hàng hoá 002đôiS=>MH002S_
 
Upvote 0
Chạy code
Mã:
Sub ABC()
  Dim sArr(), Res(), Dic As Object, iNgay, iKey$
  Dim sRow&, i&, k&, iR&, jCol&
 
  For n = 1 To 2
    sRow = sRow + Sheets("DL" & n).Range("I" & Rows.Count).End(xlUp).Row - 3
  Next n
  ReDim Res(1 To sRow, 1 To 9)
  Set Dic = CreateObject("scripting.dictionary")
  jCol = 7
  For n = 1 To 2
    With Sheets("DL" & n)
      sArr = .Range("B5", .Range("I" & Rows.Count).End(xlUp)).Value
    End With
    For i = 1 To UBound(sArr)
      ngay = sArr(i, 1)
      If ngay <> Empty Then
        iKey = Format(sArr(i, 1), "000000") & "|2|" & sArr(i, 2) & "|" & sArr(i, 4)
        If Dic.exists(iKey) = False Then
          k = k + 1
          Dic.Add iKey, k
          For j = 1 To 6
            Res(k, j) = sArr(i, j)
          Next j
          Res(k, 9) = iKey
        End If
        iR = Dic.Item(iKey)
        Res(iR, jCol) = Res(iR, jCol) + sArr(i, 8)
     
        If Dic.exists(ngay) = False Then
          k = k + 1
          Res(k, 9) = Replace(iKey, "|2|", "|1|")
          Dic.Add ngay, ""
        End If
      End If
    Next i
    jCol = jCol + 1
  Next n
  Application.ScreenUpdating = False
  With Sheets("GOP")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 4 Then .Range("B5:J" & i).ClearContents
    .Range("B4").Resize(k, 9) = Res
    .Range("B4").Resize(k, 9).Sort .Range("J4"), 1, Header:=xlNo
    .Range("J4").Resize(k).ClearContents
  End With
  Application.ScreenUpdating = True
End Sub
em cảm ơn bác. để em chạy thử ạ!
 
Upvote 0
Web KT

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

Back
Top Bottom