我有一個作業表:
Private Sub Worksheet_Activate()
MsgBox "Ran"
End Sub
我的工具列上有一個我制作的按鈕。我想要它做的是在當前選擇的作業表上觸發這個方法。
我想我可以做,Call ActiveWorksheet.Activate或者Call Worksheet.Activate雖然這些似乎沒有錯誤地執行,但沒有呼叫該方法。
作為一種解決方法,我考慮添加一個公共DoActivate方法,但它似乎有點蹩腳,我可能不得不擺弄CallByName它才能使其作業(開發人員必須記住在每個作業表上實作此方法)。
為什么我的 Activate 方法沒有通過上面的代碼手動呼叫,或者有合適的解決方法來獲得我正在尋找的東西?
uj5u.com熱心網友回復:
您可以通過以下方式呼叫任何活動作業表的激活事件(不知道其名稱):
在ThisWorkbook代碼模塊中創建下一個事件。或者,簡單復制以下代碼。請注意此類事件尚不存在:
Public Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name & " activated..."
'the necessary code here...
End Sub
然后,通過以下方式從標準模塊呼叫它:
ThisWorkbook.Workbook_SheetActivate ActiveSheet
如果你想排除一些作業表,你可以調整事件代碼來做到這一點:
If sh.Name <> "MySheetName" then
MsgBox Sh.Name & " activated..."
'the necessary code here...
End if
如果應排除許多作業表,則應構建作業表名稱陣列并用于Application.Match區分作業表以使用其事件和其他作業表。
編輯:
如果您需要在加載項(或任何啟用宏的作業簿)中撰寫的一段代碼,能夠在任何(其他)打開的作業簿中捕獲作業Activate表的事件,您應該按以下方式繼續:
- 復制加載項
ThisWorkbook代碼模塊頂部的下一個宣告(在宣告區域中):
Public WithEvents appEvHandler As Application
- 在同一個代碼模塊中,復制下一個代碼:
Private Sub appEvHandler_SheetActivate(ByVal sh As Object)
If sh.Parent.Name <> ThisWorkbook.Name Then
MsgBox sh.Parent.Name & " workbook, sheet " & sh.Name & " activated..."
Else
Debug.Print "changed in this workbook..."
End If
End Sub
- 也復制 next
Sub,這將激活事件:
Sub activateAppEvHandler()
Set appEvHandler = Application 'It can be placed in `Workbook_Open` event to be run when workbook opens
End Sub
- 如果您想停用它(出于某種原因......),請使用下一個
Sub:
Sub InactivateAppEvHandler()
Set appEvHandler = Nothing
End Sub
請測驗它并發送一些反饋。我必須承認我不確定我是否正確理解了您的需要。我要求遵循一個場景,但我試著想象這就是你想要的......
uj5u.com熱心網友回復:
將您的代碼移動到名為 OnActivate 的新 Sub
Private Sub Worksheet_Activate()
OnActivate
End Sub
Private Sub OnActivate() 'or Public if you call from another module
MsgBox "Ran"
End Sub
該Worksheet_Activate()事件處理程式可以手動從模塊內由被稱為Worksheet_Activate像任何其他子(雖然這不是IMO一個很好的辦法做到這一點)
如果你想保證所有的作業表都具有相同的方法,那么你可以讓它們實作一個介面:例如
類模塊: IActivateHandler
Public Sub OnActivate()
End Sub
然后在 Sheet1、2、3 等中:
Implements IActivateHandler
Private Sub IActivateHandler_OnActivate()
MeOnActivate
End Sub
Private Sub Worksheet_Activate()
MeOnActivate
End Sub
Private Sub MeOnActivate()
MsgBox "Ran"
End Sub
和按鈕:
Private Sub Button1_Click()
Dim sheetToCall As IActivateHandler
' Debug.Assert TypeOf ActiveSheet Is IActivateHandler
Set sheetToCall = ActiveSheet 'gets the IActivateHandler of the sheet, ensuring it is defined. Will error if it isn't
sheetToCall.OnActivate 'runs the IActivateHandler_OnActivate() method of sheet1
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/354006.html
