- Tham gia
- 8/6/06
- Bài viết
- 14,637
- Được thích
- 22,970
- Nghề nghiệp
- U80
How to use AutoFilters in Excel VBA Macros
A./ Excel VBA AutoFilters
copying autofilter results intoanother worksheet
B./ Criteria for VBA AutoFilters
Đoạn mã sẽ xếp theo trường [Ho] & chọn ~ người có họ = 'Nguyễn'
c./ Display Excel AutoFilter Criteria
d./ Excel AutoFilters in VBA Using Dates
A./ Excel VBA AutoFilters
Mã:
Option Explicit
[B]Sub AutoFilter()[/B]
' Macro recorded 23/09/2006
Sheets("S0").Select: Range("A1:B13").Select
Selection.AutoFilter
CheckFilter "1"
Selection.AutoFilter Field:=2, Criteria1:="Nguyen"
CheckFilter "2"
Selection.AutoFilter Field:=2, Criteria1:="Tran"
CheckFilter "3"
ActiveSheet.ShowAllData
Cells.Select: Selection.AutoFilter
CheckFilter "4"
[B]End Sub[/B]
Mã:
[B]Sub CheckFilter(StrC As String)[/B]
If ActiveSheet.AutoFilterMode = True Then
MsgBox "They are visible", , StrC
Else
MsgBox "They are not visible", , StrC
End If
[B]End Sub[/B]
Mã:
[B]Sub ApplyAutoFilters()[/B]
With ActiveSheet
.AutoFilterMode = False: CheckFilter2 "1"
.Range("A1:C1").AutoFilter: CheckFilter2 "2"
End With
[B]End Sub[/B]
Mã:
[B]Sub CheckFilter2(StrC As String)[/B]
With ActiveSheet
If .AutoFilterMode = True And .FilterMode = True Then
MsgBox "They are visible and in use", , StrC
ElseIf .AutoFilterMode = True Then
MsgBox "They are visible but not in use", , StrC
Else
MsgBox "They are not visible or in use", , StrC
End If
End With
[B]End Sub[/B]
Mã:
[B]Sub IsAFilterCell()[/B]
On Error Resume Next
Dim Rang As Range: Dim StrC As String
With ActiveSheet
Set Rang = .AutoFilter.Range
If .AutoFilterMode = True Then
If Not Intersect(ActiveCell, Rang) Is Nothing Then StrC = ActiveCell.Address
MsgBox Rang.Address, , StrC
Else
MsgBox "AutoFilters are not on"
End If
End With
[B]End Sub[/B]
Mã:
[B]Sub ApplyAutoFiltersToOneCell()[/B]
With ActiveSheet
.AutoFilterMode = False
.Range("A1:A2").AutoFilter
End With
[B]End Sub[/B]
Mã:
[B]Sub CopyFilter()[/B]
' Macro recorded 19/07
Selection.AutoFilter Field:=1, Criteria1:="James"
Range("D4:F15").Select
Selection.Copy
Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste
[B]End Sub[/B]
Mã:
[B]Sub test() [/B]
Columns("c:c").Delete
' the above line is only for testing macro once or twice
Range("a1").Select
[COLOR="Purple"] Selection.AutoFilter Field:=1, Criteria1:=">=5", Operator:=xlAnd
ActiveSheet.UsedRange.Select [/COLOR]
Selection.SpecialCells(xlCellTypeVisible).Select
Dim rng As Range
Set rng = Selection.SpecialCells(xlCellTypeVisible)
MsgBox rng.Address
For Each c In rng
If c.Address = "$A$1" Then Goto line1
If c.Column = 2 Then Goto line1
c.Offset(0, 2) = c + c.Offset(0, 1)
line1:
Next c
Range("a1").Select
Selection.AutoFilter
MsgBox "macro is over"
[B]End Sub[/B]
Mã:
[B]Sub AutomateIt() [/B]
Dim ws As Worksheet
Dim LastRow As Long
Set ws = ThisWorkbook.Worksheets("Sheet1")
LastRow = ws.Range("A65536").End(xlUp).Row
ws.Range("A1:C" & LastRow).AutoFilter Field:=1, Criteria1:="=*0020*", Operator:=xlOr, _
Criteria2:="=*1020*"
With ws.Range("A2:C" & LastRow)
ws.Range("E1").Copy Intersect(.SpecialCells(xlVisible), ws.Columns("B"))
ws.Range("F1").Copy Intersect(.SpecialCells(xlVisible), ws.Columns("C"))
.AutoFilter
End With
ws.Columns("B:C").Copy
ws.Columns("B:C").PasteSpecial (xlValues)
Application.CutCopyMode = False
[B]End Sub[/B]
Đoạn mã sẽ xếp theo trường [Ho] & chọn ~ người có họ = 'Nguyễn'
Mã:
[B]Sub FilterTo1Criteria()[/B]
With Sheet1
.AutoFilterMode = False
.Range("A1:D1").AutoFilter
.Range("A1:D1").AutoFilter Field:=2, Criteria1:="Nguyen"
End With
[B]End Sub[/B]
Mã:
[B]Sub FilterTo2Criteria()[/B]
With Sheet1
.AutoFilterMode = False
.Range("A1:D1").AutoFilter
.Range("A1:D1").AutoFilter Field:=2, Criteria1:="Le", _
Operator:=xlOr, Criteria2:="Tran"
‘ .Range("A1:D1").AutoFilter Field:=2, Criteria1:=">=35", _
‘ Operator:=xlAnd, Criteria2:="<=45"
End With
[B]End Sub[/B]
Mã:
[B]Sub FilterTo2Fields()[/B]
Dim StrC As String
StrC = "A*"
With Sheet1
.AutoFilterMode = False
With .Range("A1:D1")
.AutoFilter
.AutoFilter Field:=1, Criteria1:="<a4"
.AutoFilter Field:=3, Criteria1:=">" & StrC
End With
End With
[B]End Sub[/B]
Mã:
[B]Sub FilterToShowAsterisk()[/B]
With Sheet1
.AutoFilterMode = False
.Range("A1:D1").AutoFilter
' .Range("A1:D1").AutoFilter Field:=1, Criteria1:="*"
.Range("A1:D1").AutoFilter Field:=1, Criteria1:="~*"
End With
[B]End Sub[/B]
Mã:
[B]Sub AutofilterSyntax()[/B]
Dim NgDau, NgCuoi As Date
Range("F14").Select
NgDau = ActiveCell.Value 'txtStart.Value
NgCuoi = ActiveCell.Offset(0, 1).Value ' txtEnd.Value
Range("A4").Select: Selection.AutoFilter
Selection.AutoFilter Field:=4, Criteria1:=">" & NgDau, Operator:=xlOr, _
Criteria2:="<" & NgCuoi
[B]End Sub[/B]
Mã:
[B]Sub CopyAfterFilter()[/B]
On Error Resume Next
Dim sht2, sht3, LastRow As Long
Dim Msg As String, cRiteria As String
Dim cell As Range, UpBound As Range, LowBound As Range, Pasterange As Range
Set sht3 = Sheets("S0"): Set sht2 = Sheets("S2")
Application.ScreenUpdating = False
Sheets("S0").Unprotect
'last row number of column to be filtered'
LastRow = sht3.Range("D65536").End(xlUp).Row
'Column to search down and filter out zeros'
sht3.Range("D1:D" & LastRow).AutoFilter Field:=1, Criteria1:="<>0"
'Automatically Select Used range excluding header'
Set UpBound = sht3.Range("D2")
Set LowBound = sht3.Range("D2").End(xlDown)
Range(UpBound, LowBound).Select
Set Pasterange = sht2.Range("B65536").End(xlUp).Offset(1, 0) ' Copy'
Selection.Copy Destination:=Pasterange
' Deactivate the Auto filter'
sht3.Range("D1:D" & LastRow).AutoFilter
[B]End Sub[/B]
Mã:
[B]Function AutoFilterCriteria(Header As Range) As String[/B]
Dim StrCh1 As String, StrCh2 As String
Application.Volatile
With Header.Parent.AutoFilter
With .Filters(Header.Column - .Range.Column + 1)
If Not .On Then Exit Function
StrCh1 = .Criteria1
If .Operator = xlAnd Then
StrCh2 = " AND " & .Criteria2
ElseIf .Operator = xlOr Then
StrCh2 = " OR " & .Criteria2
End If
End With
End With
AutoFilterCriteria = UCase(Header) & ": " & StrCh1 & StrCh2
[B]End Function[/B]
Mã:
[B]Private Sub DaySearch()[/B]
Dim strStart, strEnd, datStart As Date, datEnd As Date
Sheets("S0").Select
strStart = Range("F27").Value: strEnd = Range("F28").Value
datStart = CLng(CDate(strStart)): datEnd = CLng(CDate(strEnd))
Range("A1:D20").Select
Selection.AutoFilter Field:=4, Criteria1:=">=" & datStart, _
Operator:=xlOr, Criteria2:="<=" & datEnd
[B]End Sub[/B]
Mã:
[B]Sub FilterByDate()[/B]
Dim dDate As Date: Dim lDate As Long
Dim strDate As String
Sheets("S0").Select
dDate = DateSerial(Year(Range("F27")), Month(Range("F27")), Day(Range("F27")))
lDate = dDate
MsgBox Str(lDate)
Range("D1").AutoFilter Field:=4, Criteria1:="<" & lDate
[B]End Sub[/B]
Mã:
[B]Sub FilterByDateTime()[/B]
Dim dDate As Date
Dim dbDate As Double
If IsDate(Range("B1")) Then
dbDate = Range("B1")
dbDate = DateSerial(Year(dbDate), Month(dbDate), Day(dbDate)) + _
TimeSerial(Hour(dbDate), Minute(dbDate), Second(dbDate))
Range("A1").AutoFilter Field:=1, Criteria1:=">" & dbDate
End If
[B]End Sub [/B]
Mã:
[B]Sub CopyFilteredData() [/B]
Dim StartDate As Date
Dim EndDate As Date
Dim SheetCounter As Integer
Dim ws As Worksheet
For SheetCounter = 2 To 3 ' change to sheets you want to cover
Set ws = ThisWorkbook.Worksheets(SheetCounter)
StartDate = ws.Range("b1").Value
EndDate = ws.Range("b2").Value
With Worksheets("sheet1")
ws.Range("a3:d" & ws.Range("a65536").End(xlUp).Row).ClearContents
With .Range("a1:d" & .Range("a65536").End(xlUp).Row)
.AutoFilter Field:=1, Criteria1:=">=" & Format(StartDate, _ "m/d/yy"), Operator:=xlAnd, Criteria2:="<=" & Format(EndDate, "m/d/yy")
Intersect(.SpecialCells(xlCellTypeVisible), Worksheets("sheet1").Range("A:A", "C:C")).Copy ws.Range("a3")
' change to columns AA CC .. you want to include
End With
.ShowAllData
End With
Next SheetCounter
[B]End Sub [/B]
Lần chỉnh sửa cuối: