Ứng dụng hàm SUMIFS trong VBA

Liên hệ QC

huunguyenfi

Thành viên mới
Tham gia
10/1/12
Bài viết
25
Được thích
5
Giới tính
Nam
Xin chào Các Anh Chị ,

Thay vì sử dụng hàm Sumifs trực tiếp trên excel nhưng vì dữ liệu quá lớn nên mình muốn học cách chạy hàm này trong VBA . Mình lần mò làm theo trên net chỉ nhưng cả ngày vẫn chưa chạy được . Anh chị nào biết làm ơn xem qua file đính kèm và hướng đãn giúp mình với ạh . Xin cám ơn nhiều .
 

File đính kèm

  • sumifs vba.xlsm
    34.4 KB · Đọc: 65
Bạn chạy thử xem
PHP:
Sub sumifs()
    Dim dic As Object, sArr(), dArr()
    Dim i As Long, j As Long, lr As Long, Row As Long, Col As Long, R1 As Long, C1 As Long, a As Long, b As Long
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheets("tonghop")
            lr = .Range("B" & Rows.Count).End(xlUp).Row
        sArr = .Range("B1:AI" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
        For i = 4 To R1
            dic.Item(sArr(i, 1)) = i - 3
        Next i
        For i = 4 To C1
            dic.Item(sArr(1, i)) = i - 1
        Next i
    End With
    With Sheets("sl")
        lr = .Range("E" & Rows.Count).End(xlUp).Row
        sArr = .Range("E4:I" & lr).Value
        For i = 1 To UBound(sArr)
             a = dic.Item(sArr(i, 1))
             b = dic.Item(sArr(i, 4))
             If a > 0 Then
                dArr(a, 1) = sArr(i, 2)
                dArr(a, 2) = sArr(i, 3)
             End If
             If a > 0 And b > 0 Then
                dArr(a, b) = dArr(a, b) + sArr(i, 5)
                dArr(a, C1) = dArr(a, C1) + sArr(i, 5)
             End If
        Next i
    End With
        Sheets("tonghop").Range("C4").Resize(R1, C1).Value = dArr
    Set dic = Nothing
End Sub
Em thêm dữ liệu vào dòng có tô màu đỏ nó sẽ không hiện dữ liệu ạ
 

File đính kèm

  • báo cáo 01-2020 (1).xlsm
    31.2 KB · Đọc: 5
Upvote 0
dạ, em thấy rồi ạ, cho em hỏi chút nữa là: trên sheet tổng hợp ở cột màu xanh C và D không tự động điền khi chạy code được không ạ, khi không có dữ liệu 1 trong 3 cột đó thì không hiện kết quả ạ
chưa hiểu ý bạn lắm, bạn nói rõ hơn được không? không có dữ liệu 1 trong 3 cột nào? của sheet nào?
 
Upvote 0
em có ghi chú trong file nhờ a xem giùm ạ
Bạn thử xem
PHP:
Sub sumifs()
    Dim dic As Object, sArr(), dArr()
    Dim i As Long, j As Long, lr As Long, Row As Long, Col As Long, R1 As Long, C1 As Long, a As Long, b As Long
    Dim TMP$
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheets("tonghop")
            lr = .Range("B" & Rows.Count).End(xlUp).Row
        sArr = .Range("B1:AI" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
            
        For i = 4 To R1
            TMP = sArr(i, 1) & sArr(i, 2) & sArr(i, 3)
            If Not dic.Exists(TMP) Then dic.Add TMP, i - 3
        Next i
        For i = 4 To C1
            dic.Add sArr(1, i), i - 3
        Next i
    End With
    With Sheets("sl")
        lr = .Range("E" & Rows.Count).End(xlUp).Row
        sArr = .Range("E4:I" & lr).Value
        For i = 1 To UBound(sArr)
            TMP = sArr(i, 1) & sArr(i, 2) & sArr(i, 3)
             a = dic.Item(TMP)
             b = dic.Item(sArr(i, 4))
             If a > 0 And b > 0 Then
                dArr(a, b) = dArr(a, b) + sArr(i, 5)
                dArr(a, C1 - 2) = dArr(a, C1 - 2) + sArr(i, 5)
             End If
        Next i
    End With
        Sheets("tonghop").Range("E4").Resize(R1, C1 - 2).Value = dArr
    Set dic = Nothing
End Sub
 
Upvote 0
Bạn thử xem
PHP:
Sub sumifs()
    Dim dic As Object, sArr(), dArr()
    Dim i As Long, j As Long, lr As Long, Row As Long, Col As Long, R1 As Long, C1 As Long, a As Long, b As Long
    Dim TMP$
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheets("tonghop")
            lr = .Range("B" & Rows.Count).End(xlUp).Row
        sArr = .Range("B1:AI" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
           
        For i = 4 To R1
            TMP = sArr(i, 1) & sArr(i, 2) & sArr(i, 3)
            If Not dic.Exists(TMP) Then dic.Add TMP, i - 3
        Next i
        For i = 4 To C1
            dic.Add sArr(1, i), i - 3
        Next i
    End With
    With Sheets("sl")
        lr = .Range("E" & Rows.Count).End(xlUp).Row
        sArr = .Range("E4:I" & lr).Value
        For i = 1 To UBound(sArr)
            TMP = sArr(i, 1) & sArr(i, 2) & sArr(i, 3)
             a = dic.Item(TMP)
             b = dic.Item(sArr(i, 4))
             If a > 0 And b > 0 Then
                dArr(a, b) = dArr(a, b) + sArr(i, 5)
                dArr(a, C1 - 2) = dArr(a, C1 - 2) + sArr(i, 5)
             End If
        Next i
    End With
        Sheets("tonghop").Range("E4").Resize(R1, C1 - 2).Value = dArr
    Set dic = Nothing
End Sub
dạ, được rồi ạ, em cảm ơn anh ạ
 
Upvote 0
Bạn thử xem
PHP:
Sub sumifs()
    Dim dic As Object, sArr(), dArr()
    Dim i As Long, j As Long, lr As Long, Row As Long, Col As Long, R1 As Long, C1 As Long, a As Long, b As Long
    Dim TMP$
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheets("tonghop")
            lr = .Range("B" & Rows.Count).End(xlUp).Row
        sArr = .Range("B1:AI" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
           
        For i = 4 To R1
            TMP = sArr(i, 1) & sArr(i, 2) & sArr(i, 3)
            If Not dic.Exists(TMP) Then dic.Add TMP, i - 3
        Next i
        For i = 4 To C1
            dic.Add sArr(1, i), i - 3
        Next i
    End With
    With Sheets("sl")
        lr = .Range("E" & Rows.Count).End(xlUp).Row
        sArr = .Range("E4:I" & lr).Value
        For i = 1 To UBound(sArr)
            TMP = sArr(i, 1) & sArr(i, 2) & sArr(i, 3)
             a = dic.Item(TMP)
             b = dic.Item(sArr(i, 4))
             If a > 0 And b > 0 Then
                dArr(a, b) = dArr(a, b) + sArr(i, 5)
                dArr(a, C1 - 2) = dArr(a, C1 - 2) + sArr(i, 5)
             End If
        Next i
    End With
        Sheets("tonghop").Range("E4").Resize(R1, C1 - 2).Value = dArr
    Set dic = Nothing
End Sub
nhờ anh xem giùm em code của anh em ứng dụng vào file này không chạy được ạ, nhờ anh xem và sửa giùm em với ạ
 

File đính kèm

  • FROM .xlsb
    560.8 KB · Đọc: 4
Upvote 0
Xài đỡ cái này:
Mã:
Sub TinhTong()
Dim lr&, i&, j&, k&, rng, arr(1 To 100000, 1 To 23), id As String
Dim dic As Object, key, s
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Chi_Tiet_nhap")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    rng = .Range("E6:P" & lr).Value
    For i = 1 To UBound(rng)
        id = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 12)
        If Not dic.exists(id) Then
            dic.Add id, IIf(IsEmpty(rng(i, 7)), 0, rng(i, 7)) & "|" & 0
        Else
            dic(id) = (Split(dic(id), "|")(0) + IIf(IsEmpty(rng(i, 7)), 0, rng(i, 7))) & "|" & 0
        End If
    Next
End With
With Sheets("Chi_Tiet_xuat")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    rng = .Range("E6:P" & lr).Value
    For i = 1 To UBound(rng)
        id = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 12)
        If Not dic.exists(id) Then
            dic.Add id, 0 & "|" & IIf(IsEmpty(rng(i, 8)), 0, rng(i, 8))
        Else
            dic(id) = Split(dic(id), "|")(0) & "|" & (Split(dic(id), "|")(1) + IIf(IsEmpty(rng(i, 8)), 0, rng(i, 8)))
        End If
    Next
End With
For Each key In dic.keys
        k = k + 1: s = Split(key & "|" & dic(key), "|")
        arr(k, 1) = k: arr(k, 3) = s(0): arr(k, 4) = s(1): arr(k, 5) = s(2)
        Select Case s(3)
            Case "BTP"
                arr(k, 15) = s(4): arr(k, 19) = s(5)
            Case "WAS"
                arr(k, 16) = s(4): arr(k, 23) = s(5)
            Case "HTA"
                arr(k, 17) = s(4)
            Case "TPA"
                arr(k, 18) = s(4): arr(k, 20) = s(5)
            Case "HUY"
                arr(k, 21) = s(5)
            Case "XLL"
                arr(k, 22) = s(5)
        End Select
Next
With Sheets("TONG_HOP")
    .Range("A5:W1000").ClearContents
    .Range("a5").Resize(k, 23).Value = arr
End With
End Sub
 

File đính kèm

  • FROM .xlsb
    562.9 KB · Đọc: 14
  • Yêu thích
Reactions: th7
Upvote 0
Xài đỡ cái này:
Mã:
Sub TinhTong()
Dim lr&, i&, j&, k&, rng, arr(1 To 100000, 1 To 23), id As String
Dim dic As Object, key, s
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Chi_Tiet_nhap")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    rng = .Range("E6:P" & lr).Value
    For i = 1 To UBound(rng)
        id = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 12)
        If Not dic.exists(id) Then
            dic.Add id, IIf(IsEmpty(rng(i, 7)), 0, rng(i, 7)) & "|" & 0
        Else
            dic(id) = (Split(dic(id), "|")(0) + IIf(IsEmpty(rng(i, 7)), 0, rng(i, 7))) & "|" & 0
        End If
    Next
End With
With Sheets("Chi_Tiet_xuat")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    rng = .Range("E6:P" & lr).Value
    For i = 1 To UBound(rng)
        id = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 12)
        If Not dic.exists(id) Then
            dic.Add id, 0 & "|" & IIf(IsEmpty(rng(i, 8)), 0, rng(i, 8))
        Else
            dic(id) = Split(dic(id), "|")(0) & "|" & (Split(dic(id), "|")(1) + IIf(IsEmpty(rng(i, 8)), 0, rng(i, 8)))
        End If
    Next
End With
For Each key In dic.keys
        k = k + 1: s = Split(key & "|" & dic(key), "|")
        arr(k, 1) = k: arr(k, 3) = s(0): arr(k, 4) = s(1): arr(k, 5) = s(2)
        Select Case s(3)
            Case "BTP"
                arr(k, 15) = s(4): arr(k, 19) = s(5)
            Case "WAS"
                arr(k, 16) = s(4): arr(k, 23) = s(5)
            Case "HTA"
                arr(k, 17) = s(4)
            Case "TPA"
                arr(k, 18) = s(4): arr(k, 20) = s(5)
            Case "HUY"
                arr(k, 21) = s(5)
            Case "XLL"
                arr(k, 22) = s(5)
        End Select
Next
With Sheets("TONG_HOP")
    .Range("A5:W1000").ClearContents
    .Range("a5").Resize(k, 23).Value = arr
End With
End Sub
[/QUOTE]

Xài đỡ cái này:
Mã:
Sub TinhTong()
Dim lr&, i&, j&, k&, rng, arr(1 To 100000, 1 To 23), id As String
Dim dic As Object, key, s
Set dic = CreateObject("Scripting.Dictionary")
With Sheets("Chi_Tiet_nhap")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    rng = .Range("E6:P" & lr).Value
    For i = 1 To UBound(rng)
        id = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 12)
        If Not dic.exists(id) Then
            dic.Add id, IIf(IsEmpty(rng(i, 7)), 0, rng(i, 7)) & "|" & 0
        Else
            dic(id) = (Split(dic(id), "|")(0) + IIf(IsEmpty(rng(i, 7)), 0, rng(i, 7))) & "|" & 0
        End If
    Next
End With
With Sheets("Chi_Tiet_xuat")
    lr = .Cells(Rows.Count, "E").End(xlUp).Row
    rng = .Range("E6:P" & lr).Value
    For i = 1 To UBound(rng)
        id = rng(i, 1) & "|" & rng(i, 2) & "|" & rng(i, 3) & "|" & rng(i, 12)
        If Not dic.exists(id) Then
            dic.Add id, 0 & "|" & IIf(IsEmpty(rng(i, 8)), 0, rng(i, 8))
        Else
            dic(id) = Split(dic(id), "|")(0) & "|" & (Split(dic(id), "|")(1) + IIf(IsEmpty(rng(i, 8)), 0, rng(i, 8)))
        End If
    Next
End With
For Each key In dic.keys
        k = k + 1: s = Split(key & "|" & dic(key), "|")
        arr(k, 1) = k: arr(k, 3) = s(0): arr(k, 4) = s(1): arr(k, 5) = s(2)
        Select Case s(3)
            Case "BTP"
                arr(k, 15) = s(4): arr(k, 19) = s(5)
            Case "WAS"
                arr(k, 16) = s(4): arr(k, 23) = s(5)
            Case "HTA"
                arr(k, 17) = s(4)
            Case "TPA"
                arr(k, 18) = s(4): arr(k, 20) = s(5)
            Case "HUY"
                arr(k, 21) = s(5)
            Case "XLL"
                arr(k, 22) = s(5)
        End Select
Next
With Sheets("TONG_HOP")
    .Range("A5:W1000").ClearContents
    .Range("a5").Resize(k, 23).Value = arr
End With
End Sub
dạ, em cảm ơn bác nhiều ạ
 
Upvote 0
Web KT

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

Back
Top Bottom