使用 AutoFitler (VBA) 按条件过滤月份
Filtering Months with Criteria using AutoFitler (VBA)
所以理论上,按月过滤日期的概念应该可行,但事实并非如此。我正在使用一种记录每个完成的作业的表格,然后用标准格式记录它们的日期。我很困惑为什么这段代码不能计算这种形式的日期。表格中的每个月将始终被格式化为 x/xx/xxxx(表示单位数月份)和 xx/xx/xxxx(表示两位数月份)。在我看来,找到一个以每个月的字符开头的单元格然后计算它们应该是一个足够简单的概念来满足我的需要。问题是,当它根据此过滤器计算行数时,它 returns 0。有人知道发生了什么吗?
谢谢!
With iTable
.AutoFilter
.AutoFilter Field:=1, Criteria1:=tin
.AutoFilter Field:=3, Criteria1:="=1/*"
End With
TData.Cells(i, 4).Value = iTable.Resize(, 1).SpecialCells(xlCellTypeVisible).Count - 1
With iTable
.AutoFilter
.AutoFilter Field:=1, Criteria1:=tin
.AutoFilter Field:=3, Criteria1:="=2/*"
End With
TData.Cells(i, 5).Value = iTable.Resize(, 1).SpecialCells(xlCellTypeVisible).Count - 1
要获得每月的准确计数,您可以将右侧未使用的列用作 'helper' 列,并带有 MONTH function. This 'helper' column could be deleted after it has served its purpose as criteria for the Range.AutoFilter Method.
您还可以在 C 列的日期上快速写下 Conditional Formatting,然后将 Operator:=xlFilterCellColor
选项应用于 C 列的 .Autofilter。
Option Explicit
Sub Macro2()
Dim m As Long, n As Long, tin As String, vMNTHs As Variant
vMNTHs = Array(1, 2)
tin = "tin"
With Worksheets("sheet3")
If .AutoFilterMode Then .AutoFilterMode = False
With .Cells(1, 1).CurrentRegion
For m = LBound(vMNTHs) To UBound(vMNTHs)
If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False
With .Resize(.Rows.Count - 1, 1).Offset(1, 2)
.FormatConditions.Add Type:=xlExpression, Formula1:="=MONTH(C2)=" & vMNTHs(m)
.FormatConditions(.FormatConditions.Count).SetFirstPriority
.FormatConditions(1).Interior.Color = vbRed
.FormatConditions(1).StopIfTrue = True
End With
.AutoFilter Field:=1, Criteria1:=tin, Operator:=xlFilterValues
.AutoFilter Field:=3, Criteria1:=vbRed, Operator:=xlFilterCellColor
n = Application.Subtotal(102, Columns(3))
MsgBox "the count for " & Format(DateSerial(2016, vMNTHs(m), 1), "mmmm") & " is " & n
With .Resize(.Rows.Count - 1, 1).Offset(1, 2)
.FormatConditions(1).Delete
End With
Next m
End With
If .AutoFilterMode Then .AutoFilterMode = False
End With
End Sub
所以理论上,按月过滤日期的概念应该可行,但事实并非如此。我正在使用一种记录每个完成的作业的表格,然后用标准格式记录它们的日期。我很困惑为什么这段代码不能计算这种形式的日期。表格中的每个月将始终被格式化为 x/xx/xxxx(表示单位数月份)和 xx/xx/xxxx(表示两位数月份)。在我看来,找到一个以每个月的字符开头的单元格然后计算它们应该是一个足够简单的概念来满足我的需要。问题是,当它根据此过滤器计算行数时,它 returns 0。有人知道发生了什么吗?
谢谢!
With iTable
.AutoFilter
.AutoFilter Field:=1, Criteria1:=tin
.AutoFilter Field:=3, Criteria1:="=1/*"
End With
TData.Cells(i, 4).Value = iTable.Resize(, 1).SpecialCells(xlCellTypeVisible).Count - 1
With iTable
.AutoFilter
.AutoFilter Field:=1, Criteria1:=tin
.AutoFilter Field:=3, Criteria1:="=2/*"
End With
TData.Cells(i, 5).Value = iTable.Resize(, 1).SpecialCells(xlCellTypeVisible).Count - 1
要获得每月的准确计数,您可以将右侧未使用的列用作 'helper' 列,并带有 MONTH function. This 'helper' column could be deleted after it has served its purpose as criteria for the Range.AutoFilter Method.
您还可以在 C 列的日期上快速写下 Conditional Formatting,然后将 Operator:=xlFilterCellColor
选项应用于 C 列的 .Autofilter。
Option Explicit
Sub Macro2()
Dim m As Long, n As Long, tin As String, vMNTHs As Variant
vMNTHs = Array(1, 2)
tin = "tin"
With Worksheets("sheet3")
If .AutoFilterMode Then .AutoFilterMode = False
With .Cells(1, 1).CurrentRegion
For m = LBound(vMNTHs) To UBound(vMNTHs)
If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False
With .Resize(.Rows.Count - 1, 1).Offset(1, 2)
.FormatConditions.Add Type:=xlExpression, Formula1:="=MONTH(C2)=" & vMNTHs(m)
.FormatConditions(.FormatConditions.Count).SetFirstPriority
.FormatConditions(1).Interior.Color = vbRed
.FormatConditions(1).StopIfTrue = True
End With
.AutoFilter Field:=1, Criteria1:=tin, Operator:=xlFilterValues
.AutoFilter Field:=3, Criteria1:=vbRed, Operator:=xlFilterCellColor
n = Application.Subtotal(102, Columns(3))
MsgBox "the count for " & Format(DateSerial(2016, vMNTHs(m), 1), "mmmm") & " is " & n
With .Resize(.Rows.Count - 1, 1).Offset(1, 2)
.FormatConditions(1).Delete
End With
Next m
End With
If .AutoFilterMode Then .AutoFilterMode = False
End With
End Sub