Bạn dùng AutoFilter để lọc nhé!A/C viết dùm em code lọc dữ liệu này nhé!
(câu hỏi cụ thể trong file đính kèm)
Sub Locdulieu()
Dim enR As Long
Range("A3:D65536").Clear
enR = Sheets("Data").[A65536].End(xlUp).Row
With Sheets("Data").Range("A1:A" & enR).Resize(, 4)
.AutoFilter Field:=3, Criteria1:=Range("E1")
.SpecialCells(xlCellTypeVisible).Copy Range("A3")
.AutoFilter
End With
Range([a4], [a4].End(xlDown)) = [row(a:a)]
End Sub
Nói thiệt, bài này mà dùng PivotTable mới là nhanh và chuẩn nhấtA/C viết dùm em code lọc dữ liệu này nhé!
(câu hỏi cụ thể trong file đính kèm)
Nói thiệt, bài này mà dùng PivotTable mới là nhanh và chuẩn nhất
Còn muốn code kiết gì đó, cứ dùng AutoFilter hoặc Advanced Filter mà làm ---> Record macro quá trình lọc rồi xem và chỉnh lại code
------------
Bạn MinhCong nếu dùng Sub để lọc thì phải thật chú ý vùng dữ liệu: Phải chỉ chính xác vùng dữ liệu ấy nằm tại sheet nào, nếu không thì hậu quả có thể không lường trước được! Ví dụ đứng tại sheet Data mà chạy code thì sao?
Ngoài ra code của bạn còn 1 lỗi rất nặng khi dùng End(xlDown) ---> Nếu MÃ không tồn tại thì.... Ẹc... Ẹc...
Theo sự góp ý của anh NDU mình sửa lại code như sau:Thưa thầy, thú thật việc chỉnh code của em vẫn còn yếu lắm. Thu thì em có thể làm được. Nhưng sửa cho gọn hơn thì..........vẫn abc lắm thầy ơi. Hu hu.........
Em cũng đang cố để học ah!
Xin thầy tư vấn thêm. Thầy có thể viết dùm em code tối ưu hơn? Em tạo ví dụ này để học mà.
Sub Locdulieu()
Dim enR As Long
Sheets("Loc").Range("A3:D65536").Clear
enR = Sheets("Data").[a65536].End(xlUp).Row
With Sheets("Data").Range("A1:A" & enR).Resize(, 4)
.AutoFilter Field:=3, Criteria1:=Sheets("Loc").Range("E1")
.SpecialCells(12).Copy Sheets("Loc").Range("A3")
.AutoFilter
End With
Sheets("Loc").Range(Sheets("Loc").[a4], Sheets("Loc").[a65536].End(xlUp)) = Sheets("Loc").[row(a:a)]
End Sub
Theo mình, bài này đưa vào sự kiện của sheetTheo sự góp ý của anh NDU mình sửa lại code như sau:
Mã:Sub Locdulieu() Dim enR As Long Sheets("Loc").Range("A3:D65536").Clear enR = Sheets("Data").[a65536].End(xlUp).Row With Sheets("Data").Range("A1:A" & enR).Resize(, 4) .AutoFilter Field:=3, Criteria1:=Sheets("Loc").Range("E1") .SpecialCells(12).Copy Sheets("Loc").Range("A3") .AutoFilter End With Sheets("Loc").Range(Sheets("Loc").[a4], Sheets("Loc").[a65536].End(xlUp)) = Sheets("Loc").[row(a:a)] End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Vung As Range, Ws As Worksheet
Set Ws = Sheets("data")
Set Vung = Ws.Range(Ws.[b1], Ws.[b1000].End(xlUp))
If Target.Address = "$E$1" Then
[a1].CurrentRegion.Clear
If Application.WorksheetFunction.CountIf(Vung.Offset(0, 1), Target.Value) = 0 Then MsgBox ("Không có MHH này"): Exit Sub
With Vung
.Offset(0, -1).Resize(, 4).AutoFilter 3, [e1]
.Offset(0, 1).EntireColumn.Hidden = True
.Offset(0, -1).Resize(, 4).SpecialCells(12).Copy [a1]
.AutoFilter
End With
Ws.Cells.EntireColumn.Hidden = False
Range([a2], [a2].End(xlDown)) = [row(A:A)]
End If
End Sub
Ít ra củng phải vầy:Thưa thầy, thú thật việc chỉnh code của em vẫn còn yếu lắm. Thu thì em có thể làm được. Nhưng sửa cho gọn hơn thì..........vẫn abc lắm thầy ơi. Hu hu.........
Em cũng đang cố để học ah!
Xin thầy tư vấn thêm. Thầy có thể viết dùm em code tối ưu hơn? Em tạo ví dụ này để học mà.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$1" Then
Range("A:C").Clear
With Sheets("Data")
With .Range("A1").CurrentRegion
.AutoFilter 3, Target
Union(.Resize(, 2), .Resize(, 1).Offset(, 3)).SpecialCells(12).Copy Range("A1")
.AutoFilter
End With
End With
With Range("A1").CurrentRegion
If .Rows.Count > 1 Then _
Intersect(.Cells, .Offset(1)).Resize(, 1) = Evaluate("ROW(R:R)")
End With
End If
End Sub
Private Sub ComboBox1_Click()
Range("A:C").Clear
With Sheets("Data").Range("A1").CurrentRegion
.AutoFilter 3, ComboBox1.Text
Union(.Resize(, 2), .Resize(, 1).Offset(, 3)).SpecialCells(12).Copy Range("A1")
.AutoFilter
End With
With Range("A1").CurrentRegion
If .Rows.Count > 1 Then _
Intersect(.Cells, .Offset(1)).Resize(, 1) = Evaluate("ROW(R:R)")
End With
End Sub
Private Sub ComboBox1_DropButtonClick()
With Sheets("Data").Range("A1").CurrentRegion
ComboBox1.List() = UniqueList(Intersect(.Cells, .Offset(1, 2)).Resize(, 1))
End With
End Sub
Private Function UniqueList(sArray)
Dim Tmp, Item
Tmp = sArray
With CreateObject("Scripting.Dictionary")
For Each Item In Tmp
If Item <> "" And Not .Exists(CStr(Item)) Then
.Add Item, ""
End If
Next
UniqueList = .Keys
End With
End Function
Thày Ndu xin cho hỏi đoạn Code này
Có tác dụng gì thế?PHP:If .Rows.Count > 1 Then _ Intersect(.Cells, .Offset(1)).Resize(, 1) = Evaluate("ROW(R:R)") End With End If
Tôi vẫn chưa hiểu nghĩa của nó là gì?
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2