Nhờ giúp đỡ VBA: Tổng hợp dữ liệu ở nhiều bảng với điều kiện dòng nào xuất hiện nhiều lần hơn (1 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

chickenguy

Thành viên mới
Tham gia
13/9/11
Bài viết
2
Được thích
0
Edit: Xin lỗi mọi người, mình đã đính kèm file mẫu ạ
Nhờ các bạn giúp mình code VBA theo mong muốn như sau. Mình cảm ơn ạ.
Capture.PNG
 

File đính kèm

Lần chỉnh sửa cuối:
Vả quá, xài đỡ cái này:
PHP:
Option Explicit
Sub TEST()
Dim lr&, i&, k&, col&, b1, b2, rng, res(1 To 10000, 1 To 2)
Dim dic As Object, key
Set dic = CreateObject("Scripting.Dictionary")
lr = WorksheetFunction.Max(Cells(Rows.Count, "A").End(xlUp).Row, Cells(Rows.Count, "D").End(xlUp).Row)
rng = Range("A3:E" & lr).Value
For i = 1 To UBound(rng)
    If Not dic.exists(rng(i, 1)) Then
        dic.Add rng(i, 1), "1|0"
    Else
        dic(rng(i, 1)) = Split(dic(rng(i, 1)), "|")(0) + 1 & "|" & Split(dic(rng(i, 1)), "|")(1)
    End If
    If Not dic.exists(rng(i, 4)) Then
        dic.Add rng(i, 4), "0|1"
    Else
        dic(rng(i, 4)) = Split(dic(rng(i, 4)), "|")(0) & "|" & Split(dic(rng(i, 4)), "|")(1) + 1
    End If
Next
For Each key In dic.keys
    b1 = Split(dic(key), "|")(0): b2 = Split(dic(key), "|")(1)
    For i = 1 To UBound(rng)
        If b1 >= b2 Then col = 2 Else col = 5
        If rng(i, col - 1) = key Then
            k = k + 1: res(k, 1) = key: res(k, 2) = rng(i, col)
        End If
    Next
Next
Range("G3:H10000").ClearContents
Range("G3").Resize(k, 2).Value = res
End Sub
 

File đính kèm

Upvote 0
Vả quá, xài đỡ cái này:
PHP:
Option Explicit
Sub TEST()
Dim lr&, i&, k&, col&, b1, b2, rng, res(1 To 10000, 1 To 2)
Dim dic As Object, key
Set dic = CreateObject("Scripting.Dictionary")
lr = WorksheetFunction.Max(Cells(Rows.Count, "A").End(xlUp).Row, Cells(Rows.Count, "D").End(xlUp).Row)
rng = Range("A3:E" & lr).Value
For i = 1 To UBound(rng)
    If Not dic.exists(rng(i, 1)) Then
        dic.Add rng(i, 1), "1|0"
    Else
        dic(rng(i, 1)) = Split(dic(rng(i, 1)), "|")(0) + 1 & "|" & Split(dic(rng(i, 1)), "|")(1)
    End If
    If Not dic.exists(rng(i, 4)) Then
        dic.Add rng(i, 4), "0|1"
    Else
        dic(rng(i, 4)) = Split(dic(rng(i, 4)), "|")(0) & "|" & Split(dic(rng(i, 4)), "|")(1) + 1
    End If
Next
For Each key In dic.keys
    b1 = Split(dic(key), "|")(0): b2 = Split(dic(key), "|")(1)
    For i = 1 To UBound(rng)
        If b1 >= b2 Then col = 2 Else col = 5
        If rng(i, col - 1) = key Then
            k = k + 1: res(k, 1) = key: res(k, 2) = rng(i, col)
        End If
    Next
Next
Range("G3:H10000").ClearContents
Range("G3").Resize(k, 2).Value = res
End Sub
Sao không lưu array mà cứ để dấu rồi lại tách.Bài này nếu dữ liệu tầm 10k loại và 100k dòng thì 2 cái vòng lặp ở cuối sẽ chậm như rùa.
 
Lần chỉnh sửa cuối:
Upvote 0
Sao không lưu array mà cứ để dấu rồi lại tách.
Mình dùng 3 vòng lặp, trong đó:

Vòng lặp 1: tạo dic, sau khi duyệt xong thì có dạng:
A, 6|1 (A xuất hiện 6 lần bảng 1 và 1 lần bảng 2)
B, 1|2 (B xuất hiện 1 lần bảng 1 và 2 lần bảng 2)

Vòng lặp 2: Duyệt qua từng key A,B
Vòng lặp 3: lồng trong vòng lặp 2, so sánh từng dòng với key để lọc

Bạn có cách nào nhanh hơn xin thỉnh giáo.
 
Upvote 0
Vả quá, xài đỡ cái này:
PHP:
Option Explicit
Sub TEST()
Dim lr&, i&, k&, col&, b1, b2, rng, res(1 To 10000, 1 To 2)
Dim dic As Object, key
Set dic = CreateObject("Scripting.Dictionary")
lr = WorksheetFunction.Max(Cells(Rows.Count, "A").End(xlUp).Row, Cells(Rows.Count, "D").End(xlUp).Row)
rng = Range("A3:E" & lr).Value
For i = 1 To UBound(rng)
    If Not dic.exists(rng(i, 1)) Then
        dic.Add rng(i, 1), "1|0"
    Else
        dic(rng(i, 1)) = Split(dic(rng(i, 1)), "|")(0) + 1 & "|" & Split(dic(rng(i, 1)), "|")(1)
    End If
    If Not dic.exists(rng(i, 4)) Then
        dic.Add rng(i, 4), "0|1"
    Else
        dic(rng(i, 4)) = Split(dic(rng(i, 4)), "|")(0) & "|" & Split(dic(rng(i, 4)), "|")(1) + 1
    End If
Next
For Each key In dic.keys
    b1 = Split(dic(key), "|")(0): b2 = Split(dic(key), "|")(1)
    For i = 1 To UBound(rng)
        If b1 >= b2 Then col = 2 Else col = 5
        If rng(i, col - 1) = key Then
            k = k + 1: res(k, 1) = key: res(k, 2) = rng(i, col)
        End If
    Next
Next
Range("G3:H10000").ClearContents
Range("G3").Resize(k, 2).Value = res
End Sub

Vả quá, xài đỡ cái này:
PHP:
Option Explicit
Sub TEST()
Dim lr&, i&, k&, col&, b1, b2, rng, res(1 To 10000, 1 To 2)
Dim dic As Object, key
Set dic = CreateObject("Scripting.Dictionary")
lr = WorksheetFunction.Max(Cells(Rows.Count, "A").End(xlUp).Row, Cells(Rows.Count, "D").End(xlUp).Row)
rng = Range("A3:E" & lr).Value
For i = 1 To UBound(rng)
    If Not dic.exists(rng(i, 1)) Then
        dic.Add rng(i, 1), "1|0"
    Else
        dic(rng(i, 1)) = Split(dic(rng(i, 1)), "|")(0) + 1 & "|" & Split(dic(rng(i, 1)), "|")(1)
    End If
    If Not dic.exists(rng(i, 4)) Then
        dic.Add rng(i, 4), "0|1"
    Else
        dic(rng(i, 4)) = Split(dic(rng(i, 4)), "|")(0) & "|" & Split(dic(rng(i, 4)), "|")(1) + 1
    End If
Next
For Each key In dic.keys
    b1 = Split(dic(key), "|")(0): b2 = Split(dic(key), "|")(1)
    For i = 1 To UBound(rng)
        If b1 >= b2 Then col = 2 Else col = 5
        If rng(i, col - 1) = key Then
            k = k + 1: res(k, 1) = key: res(k, 2) = rng(i, col)
        End If
    Next
Next
Range("G3:H10000").ClearContents
Range("G3").Resize(k, 2).Value = res
End Sub
Mình cảm ơn bạn nhiều
Bài đã được tự động gộp:

Sao không lưu array mà cứ để dấu rồi lại tách.Bài này nếu dữ liệu tầm 10k loại và 100k dòng thì 2 cái vòng lặp ở cuối sẽ chậm như rùa.
Đúng là dữ liệu cần xử lý của mình có khoảng 40k loại và 150k dòng. Bạn có cách nào xử lý không ạ
 
Upvote 0
Web KT

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

Back
Top Bottom