Ứ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
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 .
Đã dùng vba quên hàm excel đi.
 
Upvote 0
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 .
mình đóng góp 1 số ý kiến cho bạn:
1. Khi đưa dữ liệu lên để nhờ người khác viết Code thì cố gắng đưa dữ liệu gần đúng với file của bạn đang dùng để tránh trường hợp khi người khác viết Code xong, bạn đưa vào file của bạn không chạy được lại kêu người khác sửa lại theo bài của bạn, như thế sẽ rất mất thời gian của đôi bên.
2. Dữ liệu đưa lên phải đúng định dạng, bạn kiểm tra lại ô B1, Q2:Q4, Q6:Q9. Đây không phải là định dạng ngày tháng mà là định dạng văn bản. bạn kiểm tra xem nếu viết bằng công thức xem có ra kết quả không?
 
Upvote 0
mình đóng góp 1 số ý kiến cho bạn:
1. Khi đưa dữ liệu lên để nhờ người khác viết Code thì cố gắng đưa dữ liệu gần đúng với file của bạn đang dùng để tránh trường hợp khi người khác viết Code xong, bạn đưa vào file của bạn không chạy được lại kêu người khác sửa lại theo bài của bạn, như thế sẽ rất mất thời gian của đôi bên.
2. Dữ liệu đưa lên phải đúng định dạng, bạn kiểm tra lại ô B1, Q2:Q4, Q6:Q9. Đây không phải là định dạng ngày tháng mà là định dạng văn bản. bạn kiểm tra xem nếu viết bằng công thức xem có ra kết quả không?
Cám ơn phản hồi của bạn . File mình đưa lên đúng là gần đúng với file gốc , chỉ là mình cắt bắt dữ liệu lại thôi . Mình có dùng sumifs từ ô B2:M7 và công thức hoạt động ạh .
 
Upvote 0
Mình có dùng sumifs từ ô B2:M7 và công thức hoạt động ạh
Công thức bạn hoạt động vì định dạng ngày tháng ở cột Q và ở hàng 1 sai giống nhau nên mới có kết quả. bạn kiểm tra lại nhé. Ngoài ra nếu bạn tổng hợp thì dữ liệu ở cột A không nên trùng nhau.
Bài đã được tự động gộp:

Công thức bạn hoạt động vì định dạng ngày tháng ở cột Q và ở hàng 1 sai giống nhau nên mới có kết quả. bạn kiểm tra lại nhé. Ngoài ra nếu bạn tổng hợp thì dữ liệu ở cột A không nên trùng nhau.
Sau khi bạn sửa lại định dạng thì dùng thử code này nhé:

Mã:
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
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheet1
            lr = .Range("A" & Rows.Count).End(xlUp).Row
        sArr = .Range("A2:M" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
        For i = 1 To R1
            dic.Item(sArr(i, 1)) = i
        Next i
        
            lr = .Range("P" & Rows.Count).End(xlUp).Row
        sArr = .Range("P2:R" & lr).Value
        For i = 1 To UBound(sArr)
            If dic.Exists(sArr(i, 1)) Then
                Row = dic.Item(sArr(i, 1))
                For Col = 1 To C1
                    If sArr(i, 2) = Cells(1, Col).Value Then dArr(Row, Col - 1) = dArr(Row, Col - 1) + sArr(i, 3)
                Next Col
            End If
        Next i
            .Range("B2").Resize(R1, C1).Value = dArr
    End With
    Set dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Công thức bạn hoạt động vì định dạng ngày tháng ở cột Q và ở hàng 1 sai giống nhau nên mới có kết quả. bạn kiểm tra lại nhé. Ngoài ra nếu bạn tổng hợp thì dữ liệu ở cột A không nên trùng nhau.
Bài đã được tự động gộp:


Sau khi bạn sửa lại định dạng thì dùng thử code này nhé:

Mã:
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
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheet1
            lr = .Range("A" & Rows.Count).End(xlUp).Row
        sArr = .Range("A2:M" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
        For i = 1 To R1
            dic.Item(sArr(i, 1)) = i
        Next i
       
            lr = .Range("P" & Rows.Count).End(xlUp).Row
        sArr = .Range("P2:R" & lr).Value
        For i = 1 To UBound(sArr)
            If dic.Exists(sArr(i, 1)) Then
                Row = dic.Item(sArr(i, 1))
                For Col = 1 To C1
                    If sArr(i, 2) = Cells(1, Col).Value Then dArr(Row, Col - 1) = dArr(Row, Col - 1) + sArr(i, 3)
                Next Col
            End If
        Next i
            .Range("B2").Resize(R1, C1).Value = dArr
    End With
    Set dic = Nothing
End Sub
Cám ơn bạn đã quan tâm . Mình sẽ chỉnh lại . Trùi ui không ngờ cái code nó dài đến vậy .Hèn chi code mình học lóm trên net chẳng đi về đâu .
 
  • Yêu thích
Reactions: th7
Upvote 0
Cám ơn bạn đã quan tâm . Mình sẽ chỉnh lại . Trùi ui không ngờ cái code nó dài đến vậy .Hèn chi code mình học lóm trên net chẳng đi về đâu .
Mình cũng mới học nên viết dài vậy. Các thầy viết còn ngắn hơn ấy
 
Upvote 0
Công thức bạn hoạt động vì định dạng ngày tháng ở cột Q và ở hàng 1 sai giống nhau nên mới có kết quả. bạn kiểm tra lại nhé. Ngoài ra nếu bạn tổng hợp thì dữ liệu ở cột A không nên trùng nhau.
Bài đã được tự động gộp:


Sau khi bạn sửa lại định dạng thì dùng thử code này nhé:

Mã:
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
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheet1
            lr = .Range("A" & Rows.Count).End(xlUp).Row
        sArr = .Range("A2:M" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
        For i = 1 To R1
            dic.Item(sArr(i, 1)) = i
        Next i
       
            lr = .Range("P" & Rows.Count).End(xlUp).Row
        sArr = .Range("P2:R" & lr).Value
        For i = 1 To UBound(sArr)
            If dic.Exists(sArr(i, 1)) Then
                Row = dic.Item(sArr(i, 1))
                For Col = 1 To C1
                    If sArr(i, 2) = Cells(1, Col).Value Then dArr(Row, Col - 1) = dArr(Row, Col - 1) + sArr(i, 3)
                Next Col
            End If
        Next i
            .Range("B2").Resize(R1, C1).Value = dArr
    End With
    Set dic = Nothing
End Sub
Sao bạn không lưu 2 giá trị cột lẫn dòng.Đỡ phải duyệt thêm 1 vòng lặp nữa.
 
Upvote 0
Lưu 2 giá trị cột lẫn dòng là như thế nào bạn nhỉ? Mình chưa rõ cái này lắm. Mong bạn chỉ thêm cho mình. Cám ơn!
Bạn thử mình chưa test nhé.Kiểu là như vậy.
Mã:
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 Sheet1
            lr = .Range("A" & Rows.Count).End(xlUp).Row
        sArr = .Range("A1:M" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
        For i = 2 To R1
            dic.Item(sArr(i, 1)) = i - 1
        Next i
        For i = 2 To C1
            dic.Item(sArr(1, i)) = i - 1
        Next i
        lr = .Range("P" & Rows.Count).End(xlUp).Row
        sArr = .Range("P2:R" & lr).Value
        For i = 1 To UBound(sArr)
             a = dic.Item(sArr(i, 1))
             b = dic.Item(sArr(i, 2))
             If a > 0 And b > 0 Then
                dArr(a, b) = dArr(a, b) + sArr(i, 3)
             End If
        Next i
            .Range("B2").Resize(R1, C1).Value = dArr
    End With
    Set dic = Nothing
End Sub
 
Upvote 0
Dear
Bạn thử mình chưa test nhé.Kiểu là như vậy.
Mã:
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 Sheet1
            lr = .Range("A" & Rows.Count).End(xlUp).Row
        sArr = .Range("A1:M" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
        For i = 2 To R1
            dic.Item(sArr(i, 1)) = i - 1
        Next i
        For i = 2 To C1
            dic.Item(sArr(1, i)) = i - 1
        Next i
        lr = .Range("P" & Rows.Count).End(xlUp).Row
        sArr = .Range("P2:R" & lr).Value
        For i = 1 To UBound(sArr)
             a = dic.Item(sArr(i, 1))
             b = dic.Item(sArr(i, 2))
             If a > 0 And b > 0 Then
                dArr(a, b) = dArr(a, b) + sArr(i, 3)
             End If
        Next i
            .Range("B2").Resize(R1, C1).Value = dArr
    End With
    Set dic = Nothing
End Sub
Công thức bạn hoạt động vì định dạng ngày tháng ở cột Q và ở hàng 1 sai giống nhau nên mới có kết quả. bạn kiểm tra lại nhé. Ngoài ra nếu bạn tổng hợp thì dữ liệu ở cột A không nên trùng nhau.
Bài đã được tự động gộp:


Sau khi bạn sửa lại định dạng thì dùng thử code này nhé:

Mã:
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
    Set dic = CreateObject("Scripting.Dictionary")
    With Sheet1
            lr = .Range("A" & Rows.Count).End(xlUp).Row
        sArr = .Range("A2:M" & lr).Value
        R1 = UBound(sArr, 1)
        C1 = UBound(sArr, 2)
        ReDim dArr(1 To R1, 1 To C1)
        For i = 1 To R1
            dic.Item(sArr(i, 1)) = i
        Next i
       
            lr = .Range("P" & Rows.Count).End(xlUp).Row
        sArr = .Range("P2:R" & lr).Value
        For i = 1 To UBound(sArr)
            If dic.Exists(sArr(i, 1)) Then
                Row = dic.Item(sArr(i, 1))
                For Col = 1 To C1
                    If sArr(i, 2) = Cells(1, Col).Value Then dArr(Row, Col - 1) = dArr(Row, Col - 1) + sArr(i, 3)
                Next Col
            End If
        Next i
            .Range("B2").Resize(R1, C1).Value = dArr
    End With
    Set dic = Nothing
End Sub

Hi, Bạn

3 cột P,Q,R mình chuyển sang sheet 2 được không bạn, mình đang tập tành thử
Mong bạn hỗ trợ

thanks
1601860980754.png
 
Upvote 0
em muốn dò thêm điều kiện ở 2 cột tô màu xanh lá cây nữa ạ
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
 
Upvote 0
Web KT

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

Back
Top Bottom