Предположим, у меня есть рабочая тетрадь с двумя листами:
Sheet1
и Sheet2
.
В Worksheet_change
есть саб Sheet1
:
Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub
В Worksheet_Calculate
есть Sheet2
:
Private Sub Worksheet_Calculate()
'Call Sheets("Sheet1").Worksheet_Change(Range("A1")) 'doesn't work
End Sub
Как мне вызвать подпрограмму Sheet1
'a Worksheet_Change
из Worksheet_Calcalculate
в Sheet2
?
Вы можете использовать Application.Run
вот так ...
Application.Run "Sheet1.Worksheet_Change", Range("A1")
Обратите внимание, что Sheet1
- это имя VBA листа, а не имя на вкладке. Имя VBA можно изменить в окне свойств листа (в редакторе VB).
В качестве альтернативы переместите код из вашего Worksheet_Change
в такой модуль, как:
Public Sub MySpecificWorksheet_Change(ByVal Target As Range)
...
End Sub
И вызовите это как с Worksheet_Change
, так и с Worksheet_Calculate
Private Sub Worksheet_Change(ByVal Target As Range)
MySpecificWorksheet_Change(ByVal Target As Range)
End Sub
Private Sub Worksheet_Calculate()
MySpecificWorksheet_Change(ByVal Target As Range)
End Sub
Обратите внимание, что Sheet1
- это имя листа в VBA (эта информация добавлена в ответ).
Спасибо, я изменил имя листа VBA, и теперь он работает!
Или:
Private Sub Worksheet_Change
на Friend Sub Worksheet_Change
.Private Sub Worksheet_Change
в дружественную / общедоступную подпрограмму и вызовите ее как из Worksheet_Change
, так и из Worksheet_Calculate
. [Рекомендуемые]Вызов событий на рабочем листе не отличается от вызова любого неявно «частного» Sub
или Function
в любом модуле или объекте. Если они не являются Public
или Friend
, они не предоставляют доступ к своим функциям, подпрограммам и свойствам без указания места, где они находятся.
Если события не изменены с ключевым словом Private
перед ними, они могут быть вызваны с помощью этого кода:
Sub TestMe
Sheet1.Worksheet_Change Range("A1")
End Sub
Если кто-то явно добавил слово Private
в начало события, это будет выглядеть так:
Private Sub Worksheet_Change(ByVal Target As Range)
, тогда нам действительно следует рассмотреть возможность отказа от доступа к событию. Если все же мы хотим получить к нему доступ, это можно сделать с помощью Application.Run
.
Application.Run "Sheet1.Worksheet_Change", Sheet1.Range("A1")
Application.Run CStr(Worksheets(1).CodeName & ".Worksheet_Change"), Range("A1")
Я получаю ошибку
Can't run macro "Sheet1.Wokrsheet_change". Perhaps this macro is absent or all macros are turned off"
(перевод из моей версии excel)