Nhờ các bạn Lọc đơn giá sản phẩm theo KH

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

ngo15

Thành viên chính thức
Tham gia
24/6/06
Bài viết
75
Được thích
44
Tôi có vấn đề cần lọc đơn giá sản phẩm theo khách hàng bằng VBA như trong file đính kèm, nhờ các bạn giúp đỡ. Đọc nhiều file mẫu về lọc danh sách nhưng tôi chỉ có thể lọc ra danh sách sản phẩm chứ không áp đơn giá theo KH được. Rất mong các bạn giúp đỡ. Xin cám ơn
 

File đính kèm

Tôi có vấn đề cần lọc đơn giá sản phẩm theo khách hàng bằng VBA như trong file đính kèm, nhờ các bạn giúp đỡ. Đọc nhiều file mẫu về lọc danh sách nhưng tôi chỉ có thể lọc ra danh sách sản phẩm chứ không áp đơn giá theo KH được. Rất mong các bạn giúp đỡ. Xin cám ơn
Theo tôi, với những dạng lập báo cáo như thế này thì nên dùng Pivot Table.
 

File đính kèm

Lọc đơn giá

Tôi học ở GPE về hàm SUMPRODUCT và làm giúp file của bạn.Xin tham khảo file kèm theo.
 

File đính kèm

Hình như chưa đúng ý tác giả các Bác ơi!
Vấn đề Bác Ngo15 muốn hỏi là lọc bằng VBA cơ mà.
(Các Bác hướng dẫn tí em cũng muốn học về VBA).
Cảm ơn nhiều nhiều
 
Các bạn giúp dùm mình file này nha
 

File đính kèm

Hình như chưa đúng ý tác giả các Bác ơi!
Vấn đề Bác Ngo15 muốn hỏi là lọc bằng VBA cơ mà.
(Các Bác hướng dẫn tí em cũng muốn học về VBA).
Cảm ơn nhiều nhiều
Vậy thì thử code này ---> Lọc từ A đến Z luôn ---> Muốn lọc từ sheet này sang sheet khác cũng được tuốt
PHP:
Sub Loc()
  Dim Cel1 As Range, Cel2 As Range, Des As Range
  On Error Resume Next
  With Application.InputBox("Chon vung du lieu goc", Type:=8)
    Set Des = Application.InputBox("Chon 1 cell de dat du lieu loc", Type:=8)
    Des.Value = "San pham"
    .Offset(, 0).Resize(, 1).AdvancedFilter 1, , , True
    .Offset(1, 0).Resize(, 1).SpecialCells(12).SpecialCells(2).Copy
    Des(1, 2).PasteSpecial 3, , , True
    .Offset(, 1).Resize(, 1).AdvancedFilter 1, , , True
    .Offset(1, 1).Resize(, 1).SpecialCells(12).SpecialCells(2).Copy
    Des(2, 1).PasteSpecial 3
    .Parent.ShowAllData
    For Each Cel1 In Des.CurrentRegion.Resize(1).SpecialCells(2)
      With .Find(Cel1, LookAt:=xlWhole)
        With Range(.Cells, .Cells.End(xlDown).Offset(-1))
          For Each Cel2 In Des.CurrentRegion.Resize(, 1).SpecialCells(2)
            Des.Parent.Cells(Cel2.Row, Cel1.Column) = .Offset(, 1).Find(Cel2, LookAt:=xlWhole).Offset(, 1)
          Next Cel2
        End With
      End With
    Next Cel1
  End With
End Sub
Xem file
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn bạn, làm phiền bạn hướng dẫn sơ dùm mình cú pháp được không, mình chỉ biết sơ hàm index nên khi lồng hàm max, hàm row vào là mình không hiểu.
Bạn muốn giải thích công thức nào? Những công thức trong file này theo tôi là khá phức tạp, hơn nữa lại là công thức mảng. Bạn nên bắt đầu tìm hiểu từ những công thức đơn giản trước.
Thân!
 
To: ndu96081631. Bạn làm ơn giải thích code hộ với, tôi nghiên cứu mãi vẫn không hiểu. Tôi muốn hiểu được code để áp dụng vào các bài khác. Xin cám ơn
 
To: ndu96081631. Bạn làm ơn giải thích code hộ với, tôi nghiên cứu mãi vẫn không hiểu. Tôi muốn hiểu được code để áp dụng vào các bài khác. Xin cám ơn
Nhìn code thấy ghê thế chứ thật ra chả có gì!
- Mấy cái Application.InputBox thì chắc bạn đã biết
- Đoạn này:
PHP:
    .Offset(, 0).Resize(, 1).AdvancedFilter 1, , , True
    .Offset(1, 0).Resize(, 1).SpecialCells(12).SpecialCells(2).Copy
    Des(1, 2).PasteSpecial 3, , , True
Là dùng Advanced Filter lọc cột KH duy nhất, sao đó Paste Transpose sang nơi cần lọc
- Đoạn này:
PHP:
    .Offset(, 1).Resize(, 1).AdvancedFilter 1, , , True
    .Offset(1, 1).Resize(, 1).SpecialCells(12).SpecialCells(2).Copy
    Des(2, 1).PasteSpecial 3
Cùng dùng Advanced Filter nhưng lọc cột Sản phẩm, cũng paste sang nơi cần lọc nhưng paste bình thường, không Transpose
- .Parent.ShowAllData ---> Sau khi đã có "cái sườn" ta Show All Data
và đến khúc này, ta đã được "cái sườn" như sau:

attachment.php


- Tiếp theo là đoạn:
PHP:
 For Each Cel1 In Des.CurrentRegion.Resize(1).SpecialCells(2)
   With .Find(Cel1, LookAt:=xlWhole)
     With Range(.Cells, .Cells.End(xlDown).Offset(-1))
       For Each Cel2 In Des.CurrentRegion.Resize(, 1).SpecialCells(2)
         Des.Parent.Cells(Cel2.Row, Cel1.Column) = .Offset(, 1).Find(Cel2, LookAt:=xlWhole).Offset(, 1)
       Next Cel2
     End With
   End With
Next Cel1
Chỉ là quét từng em trong "cái sườn" trên rồi tìm trong dử liệu gốc, nếu tìm có thì điền giá trị vào cell tương ứng (gần giống như ta dùng INDEX vậy)
Nói hết chắc dài dòng lắm à nha!
Sorry, tôi làm được nhưng thật sự không giỏi về SƯ PHẠM nên...
 

File đính kèm

  • untitled.JPG
    untitled.JPG
    13.5 KB · Đọc: 59
Bạn giải thích hộ những chỗ tô đỏ với:
1. .Offset(, 0).Resize(, 1).AdvancedFilter 1, , , True
.Offset(1, 0).Resize(, 1).SpecialCells(12).SpecialCells(2).Copy
Des(1, 2).PasteSpecial 3, , , True
2. With Range(.Cells, .Cells.End(xlDown).Offset(-1))
 
Bạn giải thích hộ những chỗ tô đỏ với:
1. .Offset(, 0).Resize(, 1).AdvancedFilter 1, , , True
.Offset(1, 0).Resize(, 1).SpecialCells(12).SpecialCells(2).Copy
Des(1, 2).PasteSpecial 3, , , True
2. With Range(.Cells, .Cells.End(xlDown).Offset(-1))
1> Des(1,2) Tức là dòng 1 cột 2 của Vùng Des
Ví dụ tôi viết
Range("A5:D10")(2,3) tức là dòng 2, cột 3 của vùng A5:D10 <==> cell C6
Cái này tương đương hàm INDEX của công thức Excel
Des(1, 2).PasteSpecial 3, , , True ---> Số 3 tương đương với PasteSpecial\Value.... Chử True ở đây tương đương với Transpose:=True
Mấy vụ này bạn cứ thí nghiệm record macro quá trình copy/paste transpose sẽ thấy ngay ---> Ví dụ tôi Record macro quá trình copy vùng E1:E5 rồi PasteSpecial\Value + Transpose vào G1
PHP:
Sub Macro2()
'
' Macro2 Macro
' Macro recorded 29/05/2009 by Microsoft Cop.
'

'
    Range("E1:E7").Select
    Selection.Copy
    Range("G1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
End Sub
Sau khi rút gọn lại code tôi được:
PHP:
Sub Macro2()
   Range("E1:E7").Copy
   Range("G1").Select
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
End Sub
Rút gọn tiếp:
PHP:
Sub Macro2()
   Range("E1:E7").Copy
   Range("G1").PasteSpecial xlPasteValues, , , True
End Sub
Và rút.. cực gọn:
PHP:
Sub Macro2()
   Range("E1:E7").Copy
   Range("G1").PasteSpecial 3, , , True
End Sub
------------------------
2> With Range(.Cells, .Cells.End(xlDown).Offset(-1))
Ví dụ khác:
Range([A1],[A1].End(xlDown)) sẽ tương đương với việc tôi chọn cell A1, bấm tổ hợp phím Ctrl + Shift + mũi tên xuống...
Vậy
Range([A1],[A1].End(xlDown).Offset(-1)) cũng giống như trên, nhưng sau khi đã Select, sẽ bỏ bớt cell cuối cùng (do có Offset(-1) )
Vậy:
With Range(.Cells, .Cells.End(xlDown).Offset(-1))
Cũng giống như ví dụ trên, nhưng ở đây .Cells là cái gì thì phải xét cái With nằm trên nó là gì nữa
Ví dụ:
PHP:
With Range([A1],[A65536].End(xlUp))
   With Range(.Cells, .Cells.End(xlDown).Offset(-1))
 .......................
</b>Thì cái .Cells này chính là vùng Range([A1],[A65536].End(xlUp)) ở trên
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom