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
thử cái code này.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ạ!
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 ạ!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
được rồi bạn! tks bạn nhiều nhé!Cái đấy viết công thức vào là được mà.
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.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
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
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ạnThử 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.
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.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ị lỗi chỗ item rồi bạn ơiSao 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
Vâng anh, chắc chắn là đượccá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
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.Thử làm 1 VD cho xem đi
tổng hợp được data ở file bất kỳ đang đóng mà ko biết tên SheetSư 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 (gộp) nhiều sheet của 1 file Excel, nhiều file trong folder bằng Power Query nâng cao
I. Tổng hợp (gộp) nhiều sheet trong 1 file Thông thường và với trình độ căn bản, khi muốn gộp (tổng hợp) nhiều sheet trên cùng 1 file Excel bằng Power query, các bạn tạo mỗi sheet 1 query con, sau đó Append chúng lại với nhau. Như vậy sẽ có nhiều query con mất công quản lý chúng. Các cách làm...www.giaiphapexcel.com
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.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
khó sử dụng lắm + chạy chậmThằ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.