Nhờ giúp đỡ cách đưa lọc trùng vào Array (5 người xem)

  • Thread starter Thread starter hml89
  • Ngày gửi Ngày gửi
Liên hệ QC

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

hml89

Thành viên tiêu biểu
Tham gia
14/9/12
Bài viết
526
Được thích
392
Giới tính
Nam
Xin chào toàn thể các thấy, anh,chị,em trong diễn đàn.

Mình có tự học và tự làm VBA cơ bản, lần trước mình có học và thực hành qua về Dictionary ( Loại sản phẩm, số lượng). Tuy nhiên mình chỉ biết cách làm 1 key và 1 item thôi. Nếu đề bài mà lọc trùng 2, 3 cột ( loại sản phẩm, đơn vị tính, kho) và số lượng lại cộng có điều kiện thì mình chưa biết làm.
Nhờ các thầy và mọi người hướng dẫn hoặc có bài nào hướng dẫn thì cho mình xin.

Mình cám ơn, chúc mọi người tuần mới vui vẻ.
 
Dạ, thưa chú. Ý của cháu là như này ạ.
Bạn thử công thức này
Mã:
H4:J9=INDEX(B$2:B$10,AGGREGATE(15,6,(ROW($B$2:$B$10)-1)/(COUNTIFS($H$3:$H3,$B$2:$B$10,$I$3:$I3,$C$2:$C$10,$J$3:$J3,$D$2:$D$10)=0)/($E$2:$E$10>10),1))
K4:k9=SUMIFS($E$2:$E$10,$B$2:$B$10,H4,$D$2:$D$10,J4,$E$2:$E$10,">5")
 
Lý thuyết:
- Dictionary là công cụ giúp tra cứu key-item.
- VBA lợi dụng tính chất key duy nhất của dictionary để lọc trùng.
- - ví dụ dữ liệu có AA, BB, CC, AA, CC, AA
- - khi nạp vào Dictionary, thì chỉ nạp được AA, BB, CC --> các phần AA và CC sau đó không nạp được nữa vì Dcitionary chỉ nhận key duy nhất.
- - như vây, sau khi nạp nào Dictionary, ta chỉ cần duyệt lại các keys thì được một danh sách duy nhất.

Thực hành:
Ở GPE, vì có rất nhiều bài ở dạng lọc trùng cho nên đít sần trở thành công cụ rất được ưa chuộng.

Liên hệ giữa đít sần và array:
Ở GPE, array (2 chiều) là công cụ rất được ưa chuộng vì nó có thể chứa dữ liệu để tính toán và tính xong thì chép thẳng vào bảng tính, "tốc độ" khá lý tưởng.
Vì vậy, có rất nhiều bài trong GPE dùng giải thuật dựng một đít-sần chạy song song song với một ả-rầy. Key của đít-sần là dữ liệu cần lọc trùng, mỗi dòng của ả-rầy sẽ chứa dữ liệu tổng, thống kê, vân vân. Với cách thiết kế này, item tương ứng của mỗi key chính là chỉ số dòng của ả-rầy.
 
Dạ, thưa chú. Ý của cháu là như này ạ.
Cơ bản nó là như này:
Mã:
Option Explicit
Sub ABC()
Dim Lr As Long, I As Long, J As Long, K As Long, U1 As Long, U2 As Long
Dim sArr(), dArr(), Dict As Object, Txt As String
Set Dict = CreateObject("Scripting.Dictionary")
With Sheet1
    Lr = .Cells(Rows.Count, "B").End(xlUp).Row
    sArr = .Range("A2:E" & Lr).Value
    U1 = UBound(sArr, 1)
    U2 = UBound(sArr, 2)
    ReDim dArr(1 To U1, 1 To U2)
    For I = 1 To U1
        Txt = sArr(I, 2)
        If Not Dict.Exists(Txt) Then
            K = K + 1
            Dict.Add Txt, K
            For J = 1 To U2
                dArr(K, J) = sArr(I, J)
            Next
        Else
            dArr(Dict.Item(Txt), 5) = sArr(I, 5) + dArr(Dict.Item(Txt), 5)
        End If
    Next
    .Range("H12").Resize(10000, 5).ClearContents
    .Range("H12").Resize(K, U2) = dArr
End With
End Sub
 
Lý thuyết:
- Dictionary là công cụ giúp tra cứu key-item.
- VBA lợi dụng tính chất key duy nhất của dictionary để lọc trùng.
- - ví dụ dữ liệu có AA, BB, CC, AA, CC, AA
- - khi nạp vào Dictionary, thì chỉ nạp được AA, BB, CC --> các phần AA và CC sau đó không nạp được nữa vì Dcitionary chỉ nhận key duy nhất.
- - như vây, sau khi nạp nào Dictionary, ta chỉ cần duyệt lại các keys thì được một danh sách duy nhất.

Thực hành:
Ở GPE, vì có rất nhiều bài ở dạng lọc trùng cho nên đít sần trở thành công cụ rất được ưa chuộng.

Liên hệ giữa đít sần và array:
Ở GPE, array (2 chiều) là công cụ rất được ưa chuộng vì nó có thể chứa dữ liệu để tính toán và tính xong thì chép thẳng vào bảng tính, "tốc độ" khá lý tưởng.
Vì vậy, có rất nhiều bài trong GPE dùng giải thuật dựng một đít-sần chạy song song song với một ả-rầy. Key của đít-sần là dữ liệu cần lọc trùng, mỗi dòng của ả-rầy sẽ chứa dữ liệu tổng, thống kê, vân vân. Với cách thiết kế này, item tương ứng của mỗi key chính là chỉ số dòng của ả-rầy.
Dạ, cháu cũng thấy cơ số bài. Tuy nhiên, mỗi bài lại một cách viết khác nhau. Mà cháu mới biết sơ sơ nên chưa suy nghĩ được logic ạ. Cháu cũng tham gia diễn đàn lâu rồi, cũng chỉ góp ý được các bài có yêu cầu đơn giản. Nay cháu mạnh dạn lắm cháu mới viết lên ngu dốt của mình để đi hỏi, vì cháu có tinh thần giấu dốt cao,lại có tính xấu hổ ạ. Hiii
Bài đã được tự động gộp:

Cơ bản nó là như này:
Mã:
Option Explicit
Sub ABC()
Dim Lr As Long, I As Long, J As Long, K As Long, U1 As Long, U2 As Long
Dim sArr(), dArr(), Dict As Object, Txt As String
Set Dict = CreateObject("Scripting.Dictionary")
With Sheet1
    Lr = .Cells(Rows.Count, "B").End(xlUp).Row
    sArr = .Range("A2:E" & Lr).Value
    U1 = UBound(sArr, 1)
    U2 = UBound(sArr, 2)
    ReDim dArr(1 To U1, 1 To U2)
    For I = 1 To U1
        Txt = sArr(I, 2)
        If Not Dict.Exists(Txt) Then
            K = K + 1
            Dict.Add Txt, K
            For J = 1 To U2
                dArr(K, J) = sArr(I, J)
            Next
        Else
            dArr(Dict.Item(Txt), 5) = sArr(I, 5) + dArr(Dict.Item(Txt), 5)
        End If
    Next
    .Range("H12").Resize(10000, 5).ClearContents
    .Range("H12").Resize(K, U2) = dArr
End With
End Sub
Cám ơn bạn. Mình sẽ đọc và thực hành.
 
Web KT

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

Back
Top Bottom