Tổng hợp dữ liệu từ nhiều sheet

Liên hệ QC

maixuanvuong276

Thành viên mới
Tham gia
28/8/13
Bài viết
31
Được thích
3
Giới tính
Nam
Nghề nghiệp
Human
Nhờ các cao nhân giúp mình gộp dữ liệu từ sheet 1 sang sheet 2, các SP trùng nhau thì cộng dồn lại, kq mong muốn như sheet2 trong file. Chân thành cảmơnạ!
 

File đính kèm

  • Data.xlsm
    13.9 KB · Đọc: 24
Nhờ các cao nhân giúp mình gộp dữ liệu từ sheet 1 sang sheet 2, các SP trùng nhau thì cộng dồn lại, kq mong muốn như sheet2 trong file. Chân thành cảmơnạ!
thử cái code này.
Mã:
Sub gop()
Dim i As Long, lr As Long, dic As Object, a As Long, arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long
Set dic = CreateObject("scripting.dictionary")
With Sheets("sheet1")
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 2 Then
       arr = .Range("B3:G" & lr).Value
       For i = 1 To UBound(arr)
           dk = arr(i, 1)
           If Not dic.exists(dk) Then
              a = a + 1
              dic.Add dk, a
              For j = 1 To 6
                  kq(a, j) = arr(i, j)
              Next j
           Else
              b = dic.Item(dk)
              kq(b, 4) = kq(b, 4) + arr(i, 4)
              kq(b, 6) = kq(b, 6) + arr(i, 6)
           End If
    Next i
  End If
End With
With Sheets("sheet2")
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 2 Then
       arr = .Range("B3:G" & lr).Value
       For i = 1 To UBound(arr)
           dk = arr(i, 1)
           If Not dic.exists(dk) Then
              a = a + 1
              dic.Add dk, a
              For j = 1 To 6
                  kq(a, j) = arr(i, j)
              Next j
           Else
              b = dic.Item(dk)
              kq(b, 4) = kq(b, 4) + arr(i, 4)
              kq(b, 6) = kq(b, 6) + arr(i, 6)
           End If
    Next i
  End If
   lr = .Range("j" & Rows.Count).End(xlUp).Row
   If lr > 2 Then .Range("J3:O" & lr).ClearContents
   If a Then .Range("j3:o3").Resize(a).Value = kq
End With
Set dic = Nothing
End Sub
 
Upvote 0
thử cái code này.
Mã:
Sub gop()
Dim i As Long, lr As Long, dic As Object, a As Long, arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long
Set dic = CreateObject("scripting.dictionary")
With Sheets("sheet1")
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 2 Then
       arr = .Range("B3:G" & lr).Value
       For i = 1 To UBound(arr)
           dk = arr(i, 1)
           If Not dic.exists(dk) Then
              a = a + 1
              dic.Add dk, a
              For j = 1 To 6
                  kq(a, j) = arr(i, j)
              Next j
           Else
              b = dic.Item(dk)
              kq(b, 4) = kq(b, 4) + arr(i, 4)
              kq(b, 6) = kq(b, 6) + arr(i, 6)
           End If
    Next i
  End If
End With
With Sheets("sheet2")
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 2 Then
       arr = .Range("B3:G" & lr).Value
       For i = 1 To UBound(arr)
           dk = arr(i, 1)
           If Not dic.exists(dk) Then
              a = a + 1
              dic.Add dk, a
              For j = 1 To 6
                  kq(a, j) = arr(i, j)
              Next j
           Else
              b = dic.Item(dk)
              kq(b, 4) = kq(b, 4) + arr(i, 4)
              kq(b, 6) = kq(b, 6) + arr(i, 6)
           End If
    Next i
  End If
   lr = .Range("j" & Rows.Count).End(xlUp).Row
   If lr > 2 Then .Range("J3:O" & lr).ClearContents
   If a Then .Range("j3:o3").Resize(a).Value = kq
End With
Set dic = Nothing
End Sub
Tks bạn nhiều, bạn ơi còn Thiếu hàng tính tổng cộng, bạn giúp mình luôn đc hk! cảm ơn bạn trc ạ!
 
Upvote 0
Thử dùng Power Query nhé.
Kết quả ở sheet PowerQuery.
Click phải chuột vào dùng dữ liệu chọn refresh.
 

File đính kèm

  • Data.xlsm
    237.9 KB · Đọc: 32
Upvote 0
thử cái code này.
Mã:
Sub gop()
Dim i As Long, lr As Long, dic As Object, a As Long, arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long
Set dic = CreateObject("scripting.dictionary")
With Sheets("sheet1")
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 2 Then
       arr = .Range("B3:G" & lr).Value
       For i = 1 To UBound(arr)
           dk = arr(i, 1)
           If Not dic.exists(dk) Then
              a = a + 1
              dic.Add dk, a
              For j = 1 To 6
                  kq(a, j) = arr(i, j)
              Next j
           Else
              b = dic.Item(dk)
              kq(b, 4) = kq(b, 4) + arr(i, 4)
              kq(b, 6) = kq(b, 6) + arr(i, 6)
           End If
    Next i
  End If
End With
With Sheets("sheet2")
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 2 Then
       arr = .Range("B3:G" & lr).Value
       For i = 1 To UBound(arr)
           dk = arr(i, 1)
           If Not dic.exists(dk) Then
              a = a + 1
              dic.Add dk, a
              For j = 1 To 6
                  kq(a, j) = arr(i, j)
              Next j
           Else
              b = dic.Item(dk)
              kq(b, 4) = kq(b, 4) + arr(i, 4)
              kq(b, 6) = kq(b, 6) + arr(i, 6)
           End If
    Next i
  End If
   lr = .Range("j" & Rows.Count).End(xlUp).Row
   If lr > 2 Then .Range("J3:O" & lr).ClearContents
   If a Then .Range("j3:o3").Resize(a).Value = kq
End With
Set dic = Nothing
End Sub
Sao bạn không làm một vòng lặp duyệt qua các Sh để lấy dữ liệu vào mảng.
Xin phép bạn tôi sửa lại code như sau:
Mã:
Sub gop()
Dim i As Long, lr As Long, dic As Object, a As Long, C&, D&, tong&
Dim arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long
Dim Sh As Worksheet, rng As Range
Set dic = CreateObject("scripting.dictionary")
For Each Sh In Worksheets
    lr = Sh.Range("C" & Rows.Count).End(xlUp).Row
    Set rng = Sh.Range("A1:G" & lr)
        Set Item = rng.Find("Tên SP")
            If Not Item Is Nothing Then
                D = Item.Row + 1
                    arr = Sh.Range("B" & D, "G" & lr).Value
                        For i = 1 To UBound(arr)
                            dk = arr(i, 1)
                                If Not dic.exists(dk) Then
                                   a = a + 1
                                   dic.Add dk, a
                                   For j = 1 To 6
                                       kq(a, j) = arr(i, j)
                                   Next j
                                Else
                                   b = dic.Item(dk)
                                   kq(b, 4) = kq(b, 4) + arr(i, 4)
                                   kq(b, 6) = kq(b, 6) + arr(i, 6)
                                End If
                                   tong = tong + arr(i, 6)
                                   kq(a + 1, 1) = "TÔNG CÔNG"
                                   kq(a + 1, 6) = tong
                        Next i
            End If
Next Sh

With Sheets("sheet2")
    .Range("J16").Resize(1000, 6).ClearContents
   If a Then .Range("J16").Resize(a + 1, 6).Value = kq
   .Range("J16").Resize(a + 1, 6).Borders.LineStyle = 1
End With
Set dic = Nothing
MsgBox "xong"
End Sub
 
Upvote 0
Thử dùng Power Query nhé.
Kết quả ở sheet PowerQuery.
Click phải chuột vào dùng dữ liệu chọn refresh.
cái này hay đấy ... mà nó có tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên Sheet ko bạn
có nghĩa lấy dữ liệu Files đang đóng mà ko biết trước tên Sheet mà có nhiêu lấy hết

VD vầy: D:\Data.xlsx ... ko biết trong đó có nhiêu Sheet ... xong tổng hợp nó lại
 
Upvote 0
Sao bạn không làm một vòng lặp duyệt qua các Sh để lấy dữ liệu vào mảng.
Xin phép bạn tôi sửa lại code như sau:
Bạn thụt đầu dòng bị lố. Chắc là chưa biết rõ vì sao cần phải thụt đầu dòng nhỉ? Bên trong With... End With, If...End If và các vòng lặp For...Next, Do... Loop,... thì mới thụt 1 tab để cho dễ dò code, biết được code bên trong chúng đến đâu là kết thúc.
 
Upvote 0
Sao bạn không làm một vòng lặp duyệt qua các Sh để lấy dữ liệu vào mảng.
Xin phép bạn tôi sửa lại code như sau:
Mã:
Sub gop()
Dim i As Long, lr As Long, dic As Object, a As Long, C&, D&, tong&
Dim arr, kq(1 To 1000, 1 To 6), b As Long, dk As String, j As Long
Dim Sh As Worksheet, rng As Range
Set dic = CreateObject("scripting.dictionary")
For Each Sh In Worksheets
    lr = Sh.Range("C" & Rows.Count).End(xlUp).Row
    Set rng = Sh.Range("A1:G" & lr)
        Set Item = rng.Find("Tên SP")
            If Not Item Is Nothing Then
                D = Item.Row + 1
                    arr = Sh.Range("B" & D, "G" & lr).Value
                        For i = 1 To UBound(arr)
                            dk = arr(i, 1)
                                If Not dic.exists(dk) Then
                                   a = a + 1
                                   dic.Add dk, a
                                   For j = 1 To 6
                                       kq(a, j) = arr(i, j)
                                   Next j
                                Else
                                   b = dic.Item(dk)
                                   kq(b, 4) = kq(b, 4) + arr(i, 4)
                                   kq(b, 6) = kq(b, 6) + arr(i, 6)
                                End If
                                   tong = tong + arr(i, 6)
                                   kq(a + 1, 1) = "TÔNG CÔNG"
                                   kq(a + 1, 6) = tong
                        Next i
            End If
Next Sh

With Sheets("sheet2")
    .Range("J16").Resize(1000, 6).ClearContents
   If a Then .Range("J16").Resize(a + 1, 6).Value = kq
   .Range("J16").Resize(a + 1, 6).Borders.LineStyle = 1
End With
Set dic = Nothing
MsgBox "xong"
End Sub
bị lỗi chỗ item rồi bạn ơi
 

File đính kèm

  • loi item.JPG
    loi item.JPG
    73.1 KB · Đọc: 8
Upvote 0
cái này hay đấy ... mà nó có tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên Sheet ko bạn
có nghĩa lấy dữ liệu Files đang đóng mà ko biết trước tên Sheet mà có nhiêu lấy hết

VD vầy: D:\Data.xlsx ... ko biết trong đó có nhiêu Sheet ... xong tổng hợp nó lại
Vâng anh, chắc chắn là được
 
Upvote 0
bạn nào sử giúp chỗ lỗi này với ạ
 

File đính kèm

  • loi item.JPG
    loi item.JPG
    73.1 KB · Đọc: 6
  • Data.xlsm
    21.2 KB · Đọc: 0
Upvote 0
Sư phụ @ptm0412 có riêng một Topic về vấn đề này rồi anh ạ, quan trọng nhất là cấu trúc các sheet phải giống nhau. Hoặc giả sử dữ liệu là các Table nữa thì nối chúng lại với nhau trong PQ cũng sẽ dễ dàng hơn.
 
Upvote 0
Sư phụ @ptm0412 có riêng một Topic về vấn đề này rồi anh ạ, quan trọng nhất là cấu trúc các sheet phải giống nhau. Hoặc giả sử dữ liệu là các Table nữa thì nối chúng lại với nhau trong PQ cũng sẽ dễ dàng hơn.
tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên Sheet

dòng trên của Bài số 9

Vậy Trong D:\MyFolder \ ... có 10 file trong đó hãy làm cho Mạnh 1 Button để chọn lấy 1 File bất kỳ ... có cấu trúc dữ liệu như nhau chỉ khác tên Sheet và ko biết trước tên Sheet + số lượng Sheet có trong 1 File
 
Upvote 0
tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên Sheet

dòng trên của Bài số 9

Vậy Trong D:\MyFolder \ ... có 10 file trong đó hãy làm cho Mạnh 1 Button để chọn lấy 1 File bất kỳ ... có cấu trúc dữ liệu như nhau chỉ khác tên Sheet và ko biết trước tên Sheet + số lượng Sheet có trong 1 File
Anh tải mấy file demo đó về rồi đổi đường dẫn, đổi tên tùy thích là được a. Sau đó chọn Data-> Refresh all là được a.
 
Upvote 0

File đính kèm

  • Data (mr MaiXuanVuong276).xlsm
    21.5 KB · Đọc: 4
Upvote 0
Thằng này làm được nhiều thứ đó. Nhưng dữ liệu phải chuẩn chứ dữ liệu mà linh ta linh tinh thì vứt.
khó sử dụng lắm + chạy chậm
ADODB viết cho nó 1 hàm chọn File bất kỳ là lấy hết thôi
chọn file bất kỳ ko biết trước tên Sheet tổng hợp lại là xong
 
Upvote 0
Web KT

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

Back
Top Bottom