2012-01-20 31 views
1

我有很多Excel工作表(> 700,太多手工更改)和一個宏xlm,它包含所有工作表的大部分宏。我有函數循環遍歷所有表單並在每個表單中執行宏。由於請求我需要通過中央宏添加一個Eventhandler。由於我對VBA的理解是事件處理程序只能放置在工作表本身的工作表代碼文件中,因此我現在不會接下來做什麼。通過宏的事件代碼

我希望有辦法做這樣的事情?

回答

3

事件處理程序可以在任何類模塊中。

你的插件也有表,在其中的一個,你可以放置:

Private WithEvents xlApp As Excel.Application 

然後你會在左側下拉菜單,並在正確的事件有xlApp。選擇你想要的。

不要忘記設置xlApp某些事情(例如,到ThisWorkbook.Application)。

從Google隨機閱讀:Events And Event Procedures In VBA

+0

這是否也適用於非應用程序事件?例如,如果所選單元格被更改。 – TheJoeIaut

+0

@TheJoeIaut是的。 +1 – brettdj

+0

它的工作!謝謝! – TheJoeIaut

1

如果事件是對所有工作表相同,則與Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)方法,通過GSerg建議運行是最有意義的

您也可以將代碼添加到每個表編程 - 如果你想添加不同的,這可能是有用的根據表格名稱/索引將「單元格」觸發到不同的工作表。

要添加您之前的問題Excel Validation List Increase Font Size中的Data Validation代碼,您可以使用此代碼。代碼跳過普通代碼模塊和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