Nhờ các anh chị giúp code lọc gọn dữ liệu

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Văn Toàn 1996

Thành viên hoạt động
Tham gia
5/6/23
Bài viết
102
Được thích
22
Chào các anh chị Diễn đàn. Em cần rút gọn dữ liệu như hình mô tả bên dưới . Vùng Data: B4:E1000
- Nếu giá trị của dòng cột B ="" thì không chạy code dòng đó
- Nếu giá trị của dòng cột D >0 hoặc giá trị của dòng cột E không phải là số thì không cần lọc xuất ra vẫn giữ nguyên như cũ
- Nếu giá trị của dòng cột D ="" thì lọc cộng dồn cột giá phụ và xuất ra kèm ô ghi chú như hình bên dưới
Em xin cảm ơn


1685936103163.png
 

File đính kèm

  • Loc du lieu.xlsm
    10.8 KB · Đọc: 8
Giải pháp
Xài đỡ code này trong khi chờ code khác hay hơn:

PHP:
Option Explicit
Sub test()
Dim lr&, i&, j&, k&, rng, key
Dim res(1 To 10000, 1 To 5), dic As Object, id As String
lr = Cells(Rows.Count, "C").End(xlUp).Row
rng = Range("B4:E" & lr).Value
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(rng)
    If rng(i, 3) > 0 Or Not IsNumeric(rng(i, 4)) Then
        k = k + 1
        For j = 1 To 4
            res(k, j) = rng(i, j)
        Next
    Else
        id = rng(i, 2) & "|" & rng(i, 4)
        If Not dic.exists(id) Then
            k = k + 1
            For j = 1 To 4
                res(k, j) = rng(i, j)
            Next
            dic.Add id, 1
        Else
            dic(id) = dic(id) + 1
        End If
    End If...
Xài đỡ code này trong khi chờ code khác hay hơn:

PHP:
Option Explicit
Sub test()
Dim lr&, i&, j&, k&, rng, key
Dim res(1 To 10000, 1 To 5), dic As Object, id As String
lr = Cells(Rows.Count, "C").End(xlUp).Row
rng = Range("B4:E" & lr).Value
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(rng)
    If rng(i, 3) > 0 Or Not IsNumeric(rng(i, 4)) Then
        k = k + 1
        For j = 1 To 4
            res(k, j) = rng(i, j)
        Next
    Else
        id = rng(i, 2) & "|" & rng(i, 4)
        If Not dic.exists(id) Then
            k = k + 1
            For j = 1 To 4
                res(k, j) = rng(i, j)
            Next
            dic.Add id, 1
        Else
            dic(id) = dic(id) + 1
        End If
    End If
Next
If k = 0 Then Exit Sub
For Each key In dic.keys
    If dic(key) > 1 Then
        For i = 1 To k
            If key = res(i, 2) & "|" & res(i, 4) Then
                res(i, 5) = res(i, 4) & " x " & dic(key)
                res(i, 4) = res(i, 4) * dic(key)
                Exit For
            End If
        Next
    End If
Next
Range("H4:L10000").ClearContents
Range("H4").Resize(k, 5).Value = res
End Sub
 

File đính kèm

  • Loc du lieu.xlsm
    19.7 KB · Đọc: 14
Upvote 0
Giải pháp
Thử đoạn code này xem
Rich (BB code):
Sub Loc()
    Dim i, j, k, l, lr As Long
    
    lr = Cells(Rows.Count, "C").End(xlUp).Row
    For i = 2 To lr
        If Cells(i, "D").Value > 0 Or Not IsNumeric(Cells(i, "E").Value) Then
           GoTo Nexti
        End If
        k = Cells(i, "E").Value
        l = 1
        For j = i + 1 To lr
            If Cells(i, "C").Value = Cells(j, "C").Value And Cells(j, "E").Value = k Then
                Cells(i, "E").Value = Cells(i, "E").Value + Cells(j, "E").Value
                Rows(j).Delete
                lr = lr - 1
                j = j - 1
                l = l + 1
            End If
        Next j
        If l > 1 Then
        Cells(i, "F").Value = k & "x" & l
        End If
Nexti:
   Next i
End Sub
 
Upvote 0
Xài đỡ code này trong khi chờ code khác hay hơn:

PHP:
Option Explicit
Sub test()
Dim lr&, i&, j&, k&, rng, key
Dim res(1 To 10000, 1 To 5), dic As Object, id As String
lr = Cells(Rows.Count, "C").End(xlUp).Row
rng = Range("B4:E" & lr).Value
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(rng)
    If rng(i, 3) > 0 Or Not IsNumeric(rng(i, 4)) Then
        k = k + 1
        For j = 1 To 4
            res(k, j) = rng(i, j)
        Next
    Else
        id = rng(i, 2) & "|" & rng(i, 4)
        If Not dic.exists(id) Then
            k = k + 1
            For j = 1 To 4
                res(k, j) = rng(i, j)
            Next
            dic.Add id, 1
        Else
            dic(id) = dic(id) + 1
        End If
    End If
Next
If k = 0 Then Exit Sub
For Each key In dic.keys
    If dic(key) > 1 Then
        For i = 1 To k
            If key = res(i, 2) & "|" & res(i, 4) Then
                res(i, 5) = res(i, 4) & " x " & dic(key)
                res(i, 4) = res(i, 4) * dic(key)
                Exit For
            End If
        Next
    End If
Next
Range("H4:L10000").ClearContents
Range("H4").Resize(k, 5).Value = res
End Sub
dạ cảm ơn anh ạ. Code đúng ý em luôn. Anh có thêm cho em phần ghi chú Min,Max . Nếu cột giá Phụ (cột E ) <=50 thì "Min" ngược lại là "max"
Em chân thành cảm ơn anh ạ .

1685949360129.png
Bài đã được tự động gộp:

Thử đoạn code này xem
Rich (BB code):
Sub Loc()
    Dim i, j, k, l, lr As Long
   
    lr = Cells(Rows.Count, "C").End(xlUp).Row
    For i = 2 To lr
        If Cells(i, "D").Value > 0 Or Not IsNumeric(Cells(i, "E").Value) Then
           GoTo Nexti
        End If
        k = Cells(i, "E").Value
        l = 1
        For j = i + 1 To lr
            If Cells(i, "C").Value = Cells(j, "C").Value And Cells(j, "E").Value = k Then
                Cells(i, "E").Value = Cells(i, "E").Value + Cells(j, "E").Value
                Rows(j).Delete
                lr = lr - 1
                j = j - 1
                l = l + 1
            End If
        Next j
        If l > 1 Then
        Cells(i, "F").Value = k & "x" & l
        End If
Nexti:
   Next i
End Sub
Em chân thành cảm ơn anh ạ. Giờ em đang dùng điện thoại để tối em ngồi máy em xem . cảm ơn anh nhiều ạ
 
Upvote 0
dạ cảm ơn anh ạ. Code đúng ý em luôn. Anh có thêm cho em phần ghi chú Min,Max . Nếu cột giá Phụ (cột E ) <=50 thì "Min" ngược lại là "max"
Đơn giản mà, nếu bạn hiểu cách code nó vận hành thì bổ sung trong vòng 1 nốt nhạc thôi

PHP:
res(i, 5) = res(i, 4) & " x " & dic(key)
Mới
PHP:
res(i, 5) = res(i, 4) & " x " & dic(key) & IIf(res(i, 4) <= 50, " Min", " Max")
 
Upvote 0
Web KT

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

Back
Top Bottom