Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 获取工作表\u更改事件以自动执行宏_Excel_Vba_Alt_F11 - Fatal编程技术网

Excel 获取工作表\u更改事件以自动执行宏

Excel 获取工作表\u更改事件以自动执行宏,excel,vba,alt,f11,Excel,Vba,Alt,F11,我有一个宏(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 Filt

我有一个宏(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”宏,然后单击Run,宏将根据我的需要执行并过滤工作表

我发现许多引用都指向从子系统中自动执行宏,但没有一个引用“宏”窗口,我现在必须从该窗口选择要运行的宏。相反,当我在“总计”工作表的B1单元格中输入日期并按enter键时,子工作表_change(ByVal目标为范围)应自动调用“ApplyFilter”,并将日期筛选器应用于多个工作表


我创建了一个按钮,并使用按钮点击调用“ApplyFilter”,一切都很好。但是,输入日期然后按enter键执行宏似乎更直观。我可以忍受按钮点击法,但我正在尝试先学习VBA,我只是固执地想学习如何使它工作,我不想只满足于什么工作。

工作表代码必须在总计工作表中

  • 右键单击您的
    Grand Totals
    sheet选项卡
  • 查看代码
  • 确保将下面的代码粘贴到此处
  • 返回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
更高效的过滤代码

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
子应用过滤器()
将ws设置为工作表
对于ActiveWorkbook.Sheets中的每个ws
如果ws.Name为“总计”,那么
ws.AutoFilterMode=False
ws.Range(“A2”)。自动筛选字段:=1,标准1:=Range(“总计”!B1”)。文本
如果结束
下一个
端接头

这应该按原样工作-假设您确实有此代码
子工作表\u更改(ByVal目标为范围)
在“总计”的工作表代码中?(右键单击“工作表”选项卡,查看代码,然后将此事件复制并粘贴到其中)在我昨天对您的网站进行的研究中,我发现代码需要包含在工作表代码中,因此我将其放置在那里,但它仍然不起作用。今天,在我按照您的建议更改代码(只是删除了延续下划线)之前,它已经运行了!昨天,同样的代码不会运行;也许重新启动和重新加载Excel有助于解决这个问题;我不知道。我当然很欣赏关于“更高效的过滤代码”的评论,这个练习的一部分是学习更多关于VBA的知识。非常感谢。你有一个伟大的网站,在这里;我学到了很多。