nvthanhdienbien
Thành viên mới

- Tham gia
- 22/4/16
- Bài viết
- 28
- Được thích
- -9
Ma01 | Mã 01 |
630902 | 03 |
=DSUM(A:C,C1,E15:F16) |
Sub ViDuXaiDSUM()
Dim Rws As Long, Col As Integer, Dg As Long
Dim WF As Object, CSDL As Range
Set WF = Application.WorksheetFunction
Set CSDL = [B2].CurrentRegion
[E15].Value = [A1].Value: [F15].Value = [B1].Value
For Dg = 2 To 5
[E16].Value = Cells(Dg, "G").Value
For Col = 8 To 11 'Côt H => K '
[F16].Value = Cells(1, Col).Value
Cells(Dg, Col).Value = WF.DSum(CSDL, [C1], [E15:F16])
Next Col
Next Dg
End Sub
1. Sao biết "không ổn"? Chỉ ra trường hợp tính đúng và trường hợp tính sai (không ổn)Trong file excel này mình có sử dụng công thức sumifs bằng vba, nhưng thấy không được ổn lắm, bác nào giúp mình cách viết code gọn hơn được không ạ
Xin cảm ơn
1. Sao biết "không ổn"? Chỉ ra trường hợp tính đúng và trường hợp tính sai (không ổn)
2. Nhờ viết gọn hơn hay chỉnh các chỗ "không được ổn" kia.
Mình muốn tinh gọn theo hướng sử dụng dictionary để các dòng sử dụng hàm sunifs kia thanhf1 dòng thôi bạn1. Sao biết "không ổn"? Chỉ ra trường hợp tính đúng và trường hợp tính sai (không ổn)
2. Nhờ viết gọn hơn hay chỉnh các chỗ "không được ổn" kia.
Theo gợi ý của bạn @BuiQuangThuan, làm trong lúc rảnh.Mình muốn tinh gọn theo hướng sử dụng dictionary để các dòng sử dụng hàm sunifs kia thanhf1 dòng thôi bạn
Sub SumIFS()
Dim i&, j&, Lr&, t&, k&, C
Dim Arr(), KQ(), S
Dim Dic As Object, Key
Dim Sh As Worksheet, Ws As Worksheet
Set Sh = Sheets("Sheet1")
Lr = Sh.Range("A1000000").End(xlUp).Row
Arr = Sh.Range("A2:C" & Lr).Value
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Arr)
Key = Arr(i, 1) & "#" & Arr(i, 2)
If Not Dic.Exists(Key) Then
t = t + 1: Dic.Add (Key), t
Dic(Key) = i
Else
Dic(Key) = Dic(Key) & "," & i
End If
Next i
Set Ws = Sheets("Sheet2")
Lr = Ws.Range("A1000000").End(xlUp).Row
C = Ws.Cells(1, Columns.Count).End(xlToLeft).Column
ReDim KQ(1 To Lr - 1, 1 To C - 1)
For i = 2 To Lr
For j = 2 To C
Key = Ws.Cells(i, 1) & "#" & Ws.Cells(1, j)
If Dic.Exists(Key) Then
S = Split(Dic(Key), ",")
For k = LBound(S) To UBound(S)
KQ(i - 1, j - 1) = Arr(S(k), 3) + KQ(i - 1, j - 1)
Next k
End If
Next j
Next i
Ws.Range("B2").Resize(Lr - 1, C - 1) = KQ
Set Dic = Nothing
MsgBox "Done"
End Sub
Cám ơn bạn rất nhiềuTheo gợi ý của bạn @BuiQuangThuan, làm trong lúc rảnh.
Bạn chủ thớt tham khảo: Code dùng Dictionary dài hơn code của bạn.
Mã:Sub SumIFS() Dim i&, j&, Lr&, t&, k&, C Dim Arr(), KQ(), S Dim Dic As Object, Key Dim Sh As Worksheet, Ws As Worksheet Set Sh = Sheets("Sheet1") Lr = Sh.Range("A1000000").End(xlUp).Row Arr = Sh.Range("A2:C" & Lr).Value Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(Arr) Key = Arr(i, 1) & "#" & Arr(i, 2) If Not Dic.Exists(Key) Then t = t + 1: Dic.Add (Key), t Dic(Key) = i Else Dic(Key) = Dic(Key) & "," & i End If Next i Set Ws = Sheets("Sheet2") Lr = Ws.Range("A1000000").End(xlUp).Row C = Ws.Cells(1, Columns.Count).End(xlToLeft).Column ReDim KQ(1 To Lr - 1, 1 To C - 1) For i = 2 To Lr For j = 2 To C Key = Ws.Cells(i, 1) & "#" & Ws.Cells(1, j) If Dic.Exists(Key) Then S = Split(Dic(Key), ",") For k = LBound(S) To UBound(S) KQ(i - 1, j - 1) = Arr(S(k), 3) + KQ(i - 1, j - 1) Next k End If Next j Next i Ws.Range("B2").Resize(Lr - 1, C - 1) = KQ Set Dic = Nothing MsgBox "Done" End Sub