我有很多Excel工作表(> 700,手工更改太多)和宏xlm,其中包含所有工作表的大部分宏。我有函数循环遍历所有工作表并在每个工作表中执行宏。由于请求,我需要通过中央宏添加一个Eventhandler。由于我对VBA的理解是Eventhandler只能放在工作表本身的工作表代码文件中,所以现在我不知道下一步该做什么。
我希望有办法做这样的事情吗?
答案 0 :(得分:3)
事件处理程序可以在任何类模块中。
您的插件也有工作表,其中一个,您可以放置:
Private WithEvents xlApp As Excel.Application
然后您将在左下拉列表中显示xlApp
,在右侧下拉列表中显示事件。选择你想要的那些。
不要忘记在某些时候将xlApp
设置为某个位置(例如,ThisWorkbook.Application
)。
来自Google的随机阅读:Events And Event Procedures In VBA。
答案 1 :(得分:1)
如果所有工作表的事件相同,那么使用GSerg建议的Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
方法运行最有意义
您还可以以编程方式将代码添加到每个工作表中 - 如果您想根据工作表名称/索引向不同的工作表添加不同的“触发器”单元格,这可能很有用。
要添加先前问题Data Validation中的Excel Validation List Increase Font Size代码,您可以使用此代码。代码跳过普通代码模块和ThisWorkbook
模块
Sub DumpCode()
Const vbext_ct_document = 100
Dim vbProj As Object
Dim vbComp As Object
Dim strTxt As String
strTxt = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbNewLine _
& "If Target.Address = ""$A$2"" Then" & vbNewLine _
& "ActiveWindow.Zoom = 120" & vbNewLine _
& "Else" & vbNewLine _
& "ActiveWindow.Zoom = 100" & vbNewLine _
& "End If" & vbNewLine _
& "End Sub"
Set vbProj = ActiveWorkbook.VBProject
For Each vbComp In vbProj.vbcomponents
If vbComp.Type = vbext_ct_document Then
If vbComp.Name <> "ThisWorkbook" Then vbComp.CodeModule.InsertLines vbComp.CodeModule.CountOfLines + 1, strTxt
End If
Next
End Sub