[Hỏi] Sử dụng mảng thay vì công thức Sumif trong tổng hợp số liệu (1 người xem)

Liên hệ QC

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

hoanganhdl

Thành viên hoạt động
Tham gia
10/2/09
Bài viết
135
Được thích
74
Nghề nghiệp
Kế toán viên
Mình có 1 file trong đó có 1 sheet Data, một sheet Tonghop, để tập hợp dữ liệu vào sheet Tonghop có thể dùng công thức Sumif nhưng mình đang nghiên cứu về mảng, đọc bài của các tiền bối thì nghe lỗ tai lùng bùng, mắt nhòe hết cả +-+-+-+ . Thôi thì thực tế công việc đem lên hỏi luôn cho dễ mường tượng. Nhờ thây cô, ace GPE giúp đỡ }}}}}
 
Chỉ nên lấy những cột cần fải lấy thôi:
PHP:
Option Explicit
Sub TongHopSoLieu()
 Dim Dict As Object, Arr(), Tmp
 Dim J As Long, W As Long, Rws As Long, Dm As Byte
 
 With Sheets("Data").[B2]
    Rws = .CurrentRegion.Rows.Count:                    Arr() = .Resize(Rws, 9).Value
 End With
 Set Dict = CreateObject("Scripting.Dictionary"):       ReDim dArr(1 To Rws, 1 To 5)
 For J = 1 To UBound(Arr())
    Tmp = Arr(J, 9):                                    If Tmp = "" Then Exit For
    If Not Dict.Exists(Tmp) Then
        W = 1 + W:                                      Dict.Add Tmp, W
        dArr(W, 1) = W:                                 dArr(W, 2) = Tmp
        For Dm = 3 To 5
            dArr(W, Dm) = Arr(J, Dm)
        Next Dm
    Else
        For Dm = 3 To 5
            dArr(Dict.Item(Tmp), Dm) = dArr(Dict.Item(Tmp), Dm) + Arr(J, Dm)
        Next Dm
    End If
 Next J
 Randomize
 If W Then
    With Sheets("TongHop").[a2]
        .CurrentRegion.Offset(1).ClearContents
        .Resize(W, 5).Value = dArr()
        .Offset(-1).Resize(, 5).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
    End With
 End If
End Sub
 
Upvote 0
Bài này rõ ràng là công việc của Pivot Table. Học nguyên lý xử dữ liệu không lo học, đi tìm mấy trò vẽ vời.
 
Lần chỉnh sửa cuối:
Upvote 0
Cả 2 bài #2 và #3 đều không hẳn là đùng tinh thần mảng.
Nếu muốn dùng đit to thì bên key chứa số mã, bên item dùng 1 mảng chứa số tổng.

Đại khái:

Dim mngRong(1 to 3) as Double, mng As Variant

If Not Dic.Exists(key) Then Dic.Add key, mngRong
mng = Dic.Item(key)
mng(1) = mng(1) + ...
mng(2) = mng(2) + ...
mng(3) = mng(3) + ...
Dic.Item(key) = mng

Sau khi tổng hết rồi thì

Redim Arr(0 to Dic.Count-1, 0 to 3)
for i = 0 to Dic.Count - 1
Arr(i, 0) = Dic.Keys(i)
mng = Dic.Items(i)
for j = 1 to 3
Arr(i, j) = mng(j)
next j
next i

Tôi chỉ nói trên tinh thần mảng thôi. Còn cách nào hữu hiuệ, hay ho hơn thì tôi không lý tới.
 
Upvote 0
Bài này rõ ràng là công việc của Pivot Table. Học nguyên lý xử dữ liệu không lo học, đi tìm mấy trò vẽ vời.
Cảm ơn góp ý của bạn. Bài của bạn rất có ích trong quá trình nghiên cứu về mảng của mình. Rất có tính xây dựng. -\\/.
 
Upvote 0
Chỉ nên lấy những cột cần fải lấy thôi:
PHP:
Option Explicit
Sub TongHopSoLieu()
 Dim Dict As Object, Arr(), Tmp
 Dim J As Long, W As Long, Rws As Long, Dm As Byte
 
 With Sheets("Data").[B2]
    Rws = .CurrentRegion.Rows.Count:                    Arr() = .Resize(Rws, 9).Value
 End With
 Set Dict = CreateObject("Scripting.Dictionary"):       ReDim dArr(1 To Rws, 1 To 5)
 For J = 1 To UBound(Arr())
    Tmp = Arr(J, 9):                                    If Tmp = "" Then Exit For
    If Not Dict.Exists(Tmp) Then
        W = 1 + W:                                      Dict.Add Tmp, W
        dArr(W, 1) = W:                                 dArr(W, 2) = Tmp
        For Dm = 3 To 5
            dArr(W, Dm) = Arr(J, Dm)
        Next Dm
    Else
        For Dm = 3 To 5
            dArr(Dict.Item(Tmp), Dm) = dArr(Dict.Item(Tmp), Dm) + Arr(J, Dm)
        Next Dm
    End If
 Next J
 Randomize
 If W Then
    With Sheets("TongHop").[a2]
        .CurrentRegion.Offset(1).ClearContents
        .Resize(W, 5).Value = dArr()
        .Offset(-1).Resize(, 5).Interior.ColorIndex = 34 + 9 * Rnd() \ 1
    End With
 End If
End Sub
Cho mình hỏi sao câu lệnh If Tmp = "" Then Exit For này ko có Endif mà vẫn ko báo lỗi vậy?
 
Upvote 0
Cho mình hỏi sao câu lệnh If Tmp = "" Then Exit For này ko có Endif mà vẫn ko báo lỗi vậy?

Theo luật chung, End "Block" dùng để trình dịch biết biên giới của một khối lệnh. Trong VBA, End If dùng để báo giới hạn của block/khói lệnh của If

Tuy nhiên, VBA cũng có một kiểu khác cho If, cho phép gói gọn lệnh trong 1 dòng. Nếu lệnh chỉ gồm 1 dòng thì có thể viết thẳng ngay sau Then, và không cần End If
 
Upvote 0

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

Back
Top Bottom