Код события через макрос - PullRequest
1 голос
/ 20 января 2012

У меня много листов Excel (> 700, слишком много, чтобы изменить вручную) и макрос xlm, который содержит большинство макросов для всех листов.У меня есть функции, чтобы перебрать все листы и выполнить макросы в каждом из них.Из-за запроса мне нужно добавить Eventhandler через центральный макрос.Так как я понимаю VBA, что Eventhandler может быть помещен только в файл кода рабочего листа в самом листе, я не знаю, что делать дальше.

Надеюсь, есть способ сделать такое?

Ответы [ 2 ]

3 голосов
/ 20 января 2012

Обработчик событий может быть в любом модуле класса.

Ваш аддин также имеет листы, в одном из которых вы можете разместить:

Private WithEvents xlApp As Excel.Application

Тогда у вас будет xlApp влевый выпадающий и события в правом.Выберите те, которые вы хотите.

Не забудьте установить xlApp на что-то в какой-то момент (например, на ThisWorkbook.Application).

Случайное чтение из Google: События и процедуры событий в VBA .

1 голос
/ 20 января 2012

Если событие идентично для всех листов, тогда наиболее подходящим является запуск с использованием подхода Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range), предложенного GSerg

Вы также можете программно добавить код на каждый лист - что может быть полезно, если вы хотитедобавить разные «триггерные» ячейки на разные листы на основе имен / индекса листа.

Добавить код Проверка данных из предыдущего вопроса Список проверки Excel Увеличить размер шрифта Вы могли бы использовать это.Код пропускает обычные модули кода и модуль ThisWorkbook

Sub DumpCode()
    Const vbext_ct_document = 100
    Dim vbProj As Object
    Dim vbComp As Object
    Dim strTxt As String

    strTxt = "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbNewLine _
           & "If Target.Address = ""$A$2"" Then" & vbNewLine _
           & "ActiveWindow.Zoom = 120" & vbNewLine _
           & "Else" & vbNewLine _
           & "ActiveWindow.Zoom = 100" & vbNewLine _
           & "End If" & vbNewLine _
           & "End Sub"

    Set vbProj = ActiveWorkbook.VBProject
    For Each vbComp In vbProj.vbcomponents
        If vbComp.Type = vbext_ct_document Then
            If vbComp.Name <> "ThisWorkbook" Then vbComp.CodeModule.InsertLines vbComp.CodeModule.CountOfLines + 1, strTxt
        End If
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...