Excel vba: вызвать Worksheet_change из другого рабочего листа - PullRequest
0 голосов
/ 31 октября 2018

Предположим, у меня есть рабочая тетрадь с двумя листами:

Sheet1 и Sheet2.

В Sheet1 есть Worksheet_change sub:

Private Sub Worksheet_Change(ByVal Target As Range)
    ...
End Sub

В Sheet2 есть Worksheet_Calculate:

Private Sub Worksheet_Calculate()
    'Call Sheets("Sheet1").Worksheet_Change(Range("A1"))  'doesn't work
End Sub

Как мне вызвать подпрограмму Sheet1 'a Worksheet_Change из Worksheet_Calcalculate in Sheet2?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Или:

  • Изменить Private Sub Worksheet_Change на Friend Sub Worksheet_Change.
  • Переместите функциональность Private Sub Worksheet_Change в дружественный / общедоступный сабвуфер и вызовите его из Worksheet_Change и Worksheet_Calculate. [Рекомендуется]
0 голосов
/ 31 октября 2018

Вызов событий на листе ничем не отличается от вызова любого неявного "Private" 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")
0 голосов
/ 31 октября 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...