我有一个宏(ApplyFilter),它根据我在另一个工作表(总计)上的单元格 B1 中输入的日期过滤许多工作表。那个宏是:
Sub ApplyFilter() 'Filters all worksheets except worksheet1 for date entered into _
'Grand Totals!B1
Dim WS_Count As Integer
Dim I As Integer
Dim FilterRange As Variant
FilterRange = Range("'Grand Totals'!B1")
' Set WS_Count equal to the number of worksheets in the active
' workbook.
WS_Count = ActiveWorkbook.Worksheets.Count
' Begin the loop.
For I = 2 To WS_Count
Sheets(I).Select
ActiveSheet.AutoFilterMode = False 'Remove any existing filters
Worksheets(I).Range("A2").AutoFilter Field:=1, Criteria1:=Range("'Grand Totals'!B1").Text
Next I
Sheet1.Activate
End Sub
当我手动执行此宏时,它会按应有的方式执行和过滤。但是,当我从另一个子调用这个宏时:
Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("B1")) Is Nothing Then _
Call ApplyFilter
End Sub
我得到一个“宏”窗口,其中提供了可用的宏列表。我可以选择“ApplyFilter”宏并单击“运行”,然后宏会根据需要执行和过滤工作表。
我发现许多关于从子程序中自动执行宏的参考,但没有一个参考“宏”窗口,我现在必须从中选择要运行的宏。相反,当我在“Grand Totals”工作表的单元格 B1 中输入日期并按 Enter 时,sub worksheet_change(ByVal Target As Range) 应自动调用“ApplyFilter”并将日期过滤器应用于许多工作表。
我创建了一个按钮并使用 Button_Click 调用“ApplyFilter”,一切都很好。但是,输入日期然后按 Enter 执行宏似乎更直观。我可以忍受 Button_Click 方法,但我正在尝试首先学习 VBA,而且我只是固执地想要学习如何使它工作,我不想仅仅满足于什么会起作用。