Как надстройка Excel может реагировать на события в любой рабочей таблице? - PullRequest
8 голосов
/ 13 мая 2009

Наши рабочие книги генерируемые сервером SpreadsheetML , которые не могут содержать любой код VBA. К сожалению, создание собственных файлов Excel или XML-файлов Excel 2007 также не вариант.

Итак, у меня есть надстройка для Excel (VBA, а не XLL), которую каждый из наших пользователей устанавливает для добавления дополнительных UDF и т. Д., Необходимых нашим книгам.

Это прекрасно работает, но теперь мне нужно иметь макрос, который должен выполнять каждый раз, когда пользователь изменяет текст в любой ячейке, независимо от того, какую книгу он активно использует в данный момент.

Пока что я создал новый модуль Class (SheetChangeHandler) в моей надстройке со следующим кодом:

Option Explicit
Private WithEvents App As Application

Private Sub Class_Initialize()
    Set App = Application
End Sub

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Source As Range)
    Debug.Print "Changed"
    On Error GoTo Finish
    App.EnableEvents = False
    DoWorkOnChangedStuff Sh, Source
Finish:
    App.EnableEvents = True
End Sub

В моей надстройке я добавил строку для создания экземпляра нового класса:

Public MySheetHandler As New SheetChangeHandler

Насколько я понимаю, это должно заставить Excel отправлять надстройку all SheetChange для всех открытых рабочих книг, при этом эти книги не должны содержать макросов.

Но это не работает ... нет строк отладки, и мой код DoWorkOnChangedStuff не вызывается при изменении ячейки на любом листе.

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 13 мая 2009

Не используйте ключевое слово New в выражении dim. Вы говорите ему создать экземпляр класса, когда он необходим, но тогда вы никогда не обращаетесь к нему снова, поэтому он никогда не нужен. Вместо этого:

Public MySheetHandler As SheetChangeHandler

Sub Auto_Open
   Set MySheetHandler = New SheetChangeHandler
End Sub

Эта строка в Auto_Open (которая запускается при запуске) будет создавать экземпляр класса.

0 голосов
/ 26 августа 2016

Получил информацию от: http://www.bettersolutions.com/vba/events/creating-application-level.htm и попробовал решение Дика Куслейки, но модуль класса не заработал. После 2 дней поиска в Интернете и перед тем, как сдаться, я попробовал это и работал на мой. Учитывая: «рабочие книги - это сгенерированный сервером SpreadsheetML, который не может содержать код VBA», а также мои требования.

Я написал это в своем модуле класса с именем «ApplicationEventClass»:

Option Explicit

Public WithEvents ExcelAppEvents As Application

Private Sub Class_Initialize()
     Set ApplicationClass.ExcelAppEvents = Application
End Sub

Private Sub ExcelAppEvents_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Target.Font.ColorIndex = 5
End Sub

И это в моем модуле с именем "Module1":

Option Explicit

Public ApplicationClass As New ApplicationEventClass

Sub ConnectEventHandler()
      On Error Resume Next
      Set ApplicationClass.ExcelAppEvents = Application
End Sub

Вот и все! Я надеюсь, что эта работа для вас тоже. Очевидно, что на любом листе можно изменить только цвет текста на синий.

...