2

我有一个宏(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,而且我只是固执地想要学习如何使它工作,我不想仅仅满足于什么会起作用。

4

1 回答 1

2

工作表代码必须在工作Grand Totals表中

  • 右键单击您的Grand Totals工作表选项卡
  • View Code
  • 确保将下面的代码粘贴到此处
  • 返回 Excel

总计表代码

Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("B1")) Is Nothing Then Call ApplyFilter
End Sub

更高效的过滤代码

Sub ApplyFilter()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
      If ws.Name <> "Grand Totals" Then
        ws.AutoFilterMode = False
        ws.Range("A2").AutoFilter Field:=1, Criteria1:=Range("'Grand Totals'!B1").Text
      End If
Next
End Sub
于 2013-03-13T04:51:31.743 回答