Excel vba: вызов Worksheet_change с другого листа

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

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?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
5
0
5 674
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать 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

Я получаю ошибку Can't run macro "Sheet1.Wokrsheet_change". Perhaps this macro is absent or all macros are turned off" (перевод из моей версии excel)

Ans 31.10.2018 11:39

Обратите внимание, что Sheet1 - это имя листа в VBA (эта информация добавлена ​​в ответ).

Pᴇʜ 31.10.2018 11:40

Спасибо, я изменил имя листа VBA, и теперь он работает!

Ans 31.10.2018 11:41

Или:

  • Измените 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")

Другие вопросы по теме