Cần giúp rút gọn code vba (5 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

nvthanhdienbien

Thành viên mới
Tham gia
22/4/16
Bài viết
28
Được thích
-9
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
 

File đính kèm

Thử tìm hiểu viết theo dictionary xem bạn
 
Upvote 0
Mình cho rằng có thể xài DSUM() nhờ bỡi VBA; Ví dụ:

Ma01Mã 01
63090203
=DSUM(A:C,C1,E15:F16)

[td]
13756902372

[/td]

PHP:
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
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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.
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ạn
 
Upvote 0
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
Theo 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
 
Upvote 0
Theo 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
Cám ơn bạn rất nhiều
 
Upvote 1
Thần tượng VBA và DIC quá rồi bỏ lửng những công cụ có sẵn của Excl nhỉ.
VBA làm nhụt chí những người đáng lẽ nên bỏ thì giờ học về các công cụ quản lý của Excel.
Châm ngôn: nếu VBA có thể làm được thì không cần phải học thêm bất cứ gì khác
 
Upvote 0
Web KT

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

Back
Top Bottom