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

Liên hệ QC
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

  • VBA.xlsx
    10.8 KB · Đọc: 6
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

  • DangVaQua.xlsm
    16.1 KB · Đọc: 8
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