Lọc mã hàng theo danh sách cho trước.

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

tambv2012

Thành viên mới
Tham gia
24/9/12
Bài viết
10
Được thích
0
Xin chào các Bạn,

Mình cần các bạn hỗ trợ viết dùm mình code vba lọc Mã Hàng theo danh sách cho trước.

Từ bảng sheet DATA dựa vào Mã Hàng tại sheet Kết Quả cho trước lọc được Mã Hàng theo mẫu kết quả từ ô G2 tại sheet Kết Quả, mong các bạn xem giúp đỡ.


Xin cám ơn các Bạn,


1670736590543.png
 

File đính kèm

  • Loc Ma Hang Theo Yeu Cau - GPE.xlsx
    17.3 KB · Đọc: 18
Xin chào các Bạn,

Mình cần các bạn hỗ trợ viết dùm mình code vba lọc Mã Hàng theo danh sách cho trước.

Từ bảng sheet DATA dựa vào Mã Hàng tại sheet Kết Quả cho trước lọc được Mã Hàng theo mẫu kết quả từ ô G2 tại sheet Kết Quả, mong các bạn xem giúp đỡ.


Xin cám ơn các Bạn,


View attachment 284517
Nhờ các bạn xem hỗ trợ viết giúp mình code lọc dữ liệu với nhé,

Cám ơn các Bạn.
 
Upvote 0
Xin chào các Bạn,

Mình cần các bạn hỗ trợ viết dùm mình code vba lọc Mã Hàng theo danh sách cho trước.

Từ bảng sheet DATA dựa vào Mã Hàng tại sheet Kết Quả cho trước lọc được Mã Hàng theo mẫu kết quả từ ô G2 tại sheet Kết Quả, mong các bạn xem giúp đỡ.


Xin cám ơn các Bạn,


View attachment 284517

Bạn tham khảo :
Mã:
Option Explicit

Sub T_T()
    
    Dim dic As Object
    Dim sheet As Worksheet
    Dim data As Variant, result As Variant
    Dim sCode As String, sCust As String
    Dim i As Long, k As Long, r As Long, c As Long
    Dim dbQty As Double
    
    With ThisWorkbook.Worksheets("DATA")
        r = .Cells(.Rows.Count, "M").End(xlUp).Row
        If (r < 2) Then Exit Sub
        data = .Range("M2:Q" & r).Value
    End With
    
    Set sheet = ThisWorkbook.Worksheets("Ket_Qua")
    r = sheet.Cells(sheet.Rows.Count, "C").End(xlUp).Row + 1
    If (r < 3) Then Exit Sub
    result = sheet.Range("C2:D" & r).Value
    r = UBound(result, 1)
    
    Set dic = CreateObject("Scripting.Dictionary")
    For i = LBound(result, 1) + 1 To UBound(result, 1)
        If (i < r) Then
            dic.Add result(i, 1), i
        Else
            result(i, 1) = "Grand Total"
        End If
    Next i
    
    For i = LBound(data, 1) To UBound(data, 1)
        sCode = data(i, 1)
        dbQty = data(i, 4)
        sCust = data(i, 5)
        If dic.Exists(sCode) Then
            k = dic.Item(sCode)
            If Not dic.Exists(sCust) Then
                c = UBound(result, 2) + 1
                ReDim Preserve result(1 To r, 1 To c)
                dic.Add sCust, c
                result(1, c) = sCust
                result(k, c) = dbQty
            Else
                c = dic.Item(sCust)
                result(k, c) = result(k, c) + dbQty
            End If
            result(r, c) = result(r, c) + dbQty
        End If
    Next i
    c = UBound(result, 2) + 1
    ReDim Preserve result(1 To r, 1 To c)
    result(1, c) = "Grand Total"

    For i = 2 To r
        For k = 3 To c - 1
            result(i, c) = result(i, c) + result(i, k)
        Next k
    Next i

    sheet.Range("G13").Resize(r, c).Value = result
    
End Sub
 
Upvote 0
Từ bảng sheet DATA dựa vào Mã Hàng tại sheet Kết Quả cho trước lọc được Mã Hàng theo mẫu kết quả từ ô G2 tại sheet Kết Quả, mong các bạn xem giúp đỡ.
Thêm cách khác tham khảo. Phần Grand tự làm lấy
Mã:
Option Explicit
Sub ABC()
    Dim Dic As Object, sArr(), Res(), aTieuDe(), i&, iRow&, m&
    Set Dic = CreateObject("scripting.dictionary")
    With Sheets("Ket_Qua")
        iRow = .Range("C" & Rows.Count).End(3).Row
        sArr = .Range("C2:D" & iRow).Value
        ReDim Res(1 To UBound(sArr) - 1, 1 To 1000)
        For i = 2 To UBound(sArr)
            Dic(sArr(i, 1)) = i
        Next
    End With
    With Sheets("DATA")
        iRow = .Range("M" & Rows.Count).End(3).Row
        sArr = .Range("A2:Q" & iRow).Value
        For i = 1 To UBound(sArr)
            If Dic.Exists(sArr(i, 13)) = True Then
                If Dic.Exists(sArr(i, 17)) = False Then
                    m = m + 1
                    Dic(sArr(i, 17)) = m
                    ReDim Preserve aTieuDe(1 To m)
                    aTieuDe(m) = sArr(i, 17)
                End If
                Res(Dic(sArr(i, 13)) - 1, Dic(sArr(i, 17))) = Res(Dic(sArr(i, 13)) - 1, Dic(sArr(i, 17))) + sArr(i, 16)
            End If
        Next
    End With
    With Sheets("Ket_Qua")
        .Range("E2").Resize(, UBound(aTieuDe)).Value = aTieuDe
        .Range("E3").Resize(UBound(Res), m + 2).Value = Res
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Một cách khác:
Click vô nút "LOC" để chạy.
PHP:
Option Explicit
Sub locmahang()
Dim lr&, lr2&, lc&, i&, rng, res(), dic As Object
Set dic = CreateObject("scripting.dictionary")
With Sheets("DATA")
    lr = .Cells(Rows.Count, "M").End(xlUp).Row
    rng = .Range("Q2:Q" & lr).Value
    On Error Resume Next
    For i = 1 To UBound(rng)
        dic.Add rng(i, 1), ""
    Next
End With
With Sheets("Ket_Qua")
    lr2 = .Cells(Rows.Count, "C").End(xlUp).Row
    .Range("E2:XX10000").ClearContents
    .Range("E2").Resize(1, dic.Count).Value = dic.keys
    lc = .Range("XX2").End(xlToLeft).Offset(, 1).Column
    .Cells(2, lc).Value = "Grand Total"
    .Range("E3", .Cells(lr2, lc - 1)).Formula = "=SUMIFS(DATA!$P$2:$P$" & lr & ",DATA!$M$2:$M$" & lr & ",$C3,DATA!$Q$2:$Q$" & lr & ",E$2)"
    .Range(.Cells(3, lc), .Cells(lr2, lc)).FormulaR1C1 = "=SUM(RC[" & 5 - lc & "]:RC[-1])"
    .Cells(lr2 + 1, "D").Value = "Grand Total"
    .Range(.Cells(lr2 + 1, "E"), .Cells(lr2 + 1, lc)).FormulaR1C1 = "=SUM(R[" & 2 - lr2 & "]C:R[-1]C)" '"=SUM(  E3:E9)"
    .Range("E3", .Cells(lr2 + 1, lc)).Value = .Range("E3", .Cells(lr2 + 1, lc)).Value
    With .Range("C2", .Cells(lr2 + 1, lc))
        .EntireColumn.AutoFit
        .Borders.LineStyle = xlContinuous
    End With
End With
Set dic = Nothing
End Sub
 

File đính kèm

  • Loc Ma Hang Theo Yeu Cau - GPE.xlsm
    31.7 KB · Đọc: 11
Upvote 0
Thêm 1 lựa chọn khác...
Code PIVOT ...
Click CLEAR, RUN...
Mã:
Option Explicit

Sub Run()
    
    Dim fldName, i As Byte
    Call Clear
    
    With CreateObject("ADODB.Recordset")
        .Open ("TRANSFORM SUM([f4]) SELECT f1 as Mã,f2 As Tên,sum(f4) as Tông FROM [Data$m2:q] GROUP BY f1,f2 PIVOT [f5] "), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No"""

        'Write column names
        For Each fldName In .Fields
            i = i + 1
            Sheet2.Cells(13, i + 6) = fldName.Name
            'and format it
            Sheet2.Cells(13, i + 6).Interior.Color = rgbCornflowerBlue
            Sheet2.Cells(13, i + 6).Font.Color = rgbWhite
            Sheet2.Cells(13, i + 6).Font.Italic = True

        Next
        
        Sheet2.Range("g15").CopyFromRecordset .DataSource
        Sheet2.Range("g13").CurrentRegion.EntireColumn.AutoFit
    
    End With
End Sub

Sub Clear()
    Sheet2.Range("g13:z1000").Clear
    Sheet2.Range("g15:o1000").ClearContents

End Sub
 

File đính kèm

  • Loc Ma Hang Theo Yeu Cau 444 GPE.xlsm
    26.7 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Xin chào các Bạn,

Mình cần các bạn hỗ trợ viết dùm mình code vba lọc Mã Hàng theo danh sách cho trước.

Từ bảng sheet DATA dựa vào Mã Hàng tại sheet Kết Quả cho trước lọc được Mã Hàng theo mẫu kết quả từ ô G2 tại sheet Kết Quả, mong các bạn xem giúp đỡ.


Xin cám ơn các Bạn,


View attachment 284517
Góp vui. Thử xem sao.
Mã:
Option Explicit

Sub Loc()
Dim i&, j&, lr&, t&, k&, Z&
Dim Arr(), Arr2(), Res(), S
Dim Dic As Object, DicKH As Object
Dim Sh As Worksheet, Ws As Worksheet
Set Sh = Sheets("DATA")
lr = Sh.Cells(Rows.Count, "M").End(xlUp).Row
Arr = Sh.Range("M2:Q" & lr).Value
Set DicKH = CreateObject("Scripting.Dictionary")
Set Dic = CreateObject("Scripting.Dictionary")
ReDim Res(1 To UBound(Arr), 1 To 100)
For i = 1 To UBound(Arr)
    If Not DicKH.Exists(Arr(i, 5)) Then k = k + 1: DicKH(Arr(i, 5)) = DicKH(Arr(i, 5)) & "," & k
        S = Split(DicKH(Arr(i, 5)), ","): j = S(1) + 2
    If Not Dic.Exists(Arr(i, 1)) Then
        t = t + 1: Dic.Add (Arr(i, 1)), t
        Res(t, 1) = Arr(i, 1): Res(t, 2) = Arr(i, 2)
        Res(t, j) = Arr(i, 4)
    Else
        Z = Dic.Item(Arr(i, 1))
        Res(Z, j) = Arr(i, 4)
    End If
Next i
Set Ws = Sheets("Ket_Qua")
If k Or t Then

Ws.Range("G30").Resize(10000, k + 3).ClearContents
Ws.Range("I30").Resize(1, k) = DicKH.Keys
Ws.Range("G31").Resize(t, k + 3) = Res
End If
Set DicKH = Nothing: Set Dic = Nothing
End Sub
Phần Tính tổng bạn tự làm.
 
Upvote 0
Một cách khác:
Click vô nút "LOC" để chạy.
PHP:
Option Explicit
Sub locmahang()
Dim lr&, lr2&, lc&, i&, rng, res(), dic As Object
Set dic = CreateObject("scripting.dictionary")
With Sheets("DATA")
    lr = .Cells(Rows.Count, "M").End(xlUp).Row
    rng = .Range("Q2:Q" & lr).Value
    On Error Resume Next
    For i = 1 To UBound(rng)
        dic.Add rng(i, 1), ""
    Next
End With
With Sheets("Ket_Qua")
    lr2 = .Cells(Rows.Count, "C").End(xlUp).Row
    .Range("E2:XX10000").ClearContents
    .Range("E2").Resize(1, dic.Count).Value = dic.keys
    lc = .Range("XX2").End(xlToLeft).Offset(, 1).Column
    .Cells(2, lc).Value = "Grand Total"
    .Range("E3", .Cells(lr2, lc - 1)).Formula = "=SUMIFS(DATA!$P$2:$P$" & lr & ",DATA!$M$2:$M$" & lr & ",$C3,DATA!$Q$2:$Q$" & lr & ",E$2)"
    .Range(.Cells(3, lc), .Cells(lr2, lc)).FormulaR1C1 = "=SUM(RC[" & 5 - lc & "]:RC[-1])"
    .Cells(lr2 + 1, "D").Value = "Grand Total"
    .Range(.Cells(lr2 + 1, "E"), .Cells(lr2 + 1, lc)).FormulaR1C1 = "=SUM(R[" & 2 - lr2 & "]C:R[-1]C)" '"=SUM(  E3:E9)"
    .Range("E3", .Cells(lr2 + 1, lc)).Value = .Range("E3", .Cells(lr2 + 1, lc)).Value
    With .Range("C2", .Cells(lr2 + 1, lc))
        .EntireColumn.AutoFit
        .Borders.LineStyle = xlContinuous
    End With
End With
Set dic = Nothing
End Sub

Góp vui. Thử xem sao.
Mã:
Option Explicit

Sub Loc()
Dim i&, j&, lr&, t&, k&, Z&
Dim Arr(), Arr2(), Res(), S
Dim Dic As Object, DicKH As Object
Dim Sh As Worksheet, Ws As Worksheet
Set Sh = Sheets("DATA")
lr = Sh.Cells(Rows.Count, "M").End(xlUp).Row
Arr = Sh.Range("M2:Q" & lr).Value
Set DicKH = CreateObject("Scripting.Dictionary")
Set Dic = CreateObject("Scripting.Dictionary")
ReDim Res(1 To UBound(Arr), 1 To 100)
For i = 1 To UBound(Arr)
    If Not DicKH.Exists(Arr(i, 5)) Then k = k + 1: DicKH(Arr(i, 5)) = DicKH(Arr(i, 5)) & "," & k
        S = Split(DicKH(Arr(i, 5)), ","): j = S(1) + 2
    If Not Dic.Exists(Arr(i, 1)) Then
        t = t + 1: Dic.Add (Arr(i, 1)), t
        Res(t, 1) = Arr(i, 1): Res(t, 2) = Arr(i, 2)
        Res(t, j) = Arr(i, 4)
    Else
        Z = Dic.Item(Arr(i, 1))
        Res(Z, j) = Arr(i, 4)
    End If
Next i
Set Ws = Sheets("Ket_Qua")
If k Or t Then

Ws.Range("G30").Resize(10000, k + 3).ClearContents
Ws.Range("I30").Resize(1, k) = DicKH.Keys
Ws.Range("G31").Resize(t, k + 3) = Res
End If
Set DicKH = Nothing: Set Dic = Nothing
End Sub
Phần Tính tổng bạn tự làm.
M Xin chân thành cám ơn các Bạn Anh/Chị rất nhiều nhé!
 
Upvote 0
Web KT

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

Back
Top Bottom