Worksheet_Activate не срабатывает при открытии книги

Два дня назад мой код для заполнения полей со списком ActiveX в моих таблицах Excel перестал работать, когда я открываю документ. С тех пор я обнаружил, что Worksheet_Activate () больше не срабатывает, когда я открываю листы.

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

Private Sub Worksheet_Activate()
   MsgBox ("Worksheet has been activated")
End Sub

Однако, если я нажимаю на другую вкладку и возвращаюсь к листу, содержащему код, он запускается.

Я пробовал играть с добавлением Application.EnableEvents = True и Worksheets ("Sheet1"). Активируйте Workbook_Open (который запускается), но все равно не повезло.

Мы используем Excel 2010, и та же проблема возникает и на компьютерах моих коллег. Любые идеи?


person jaegee    schedule 04.02.2015    source источник
comment
Старый пост, но если кто-то его ищет, рекомендуется прочитать эту статью   -  person Ricardo Diaz    schedule 11.01.2020


Ответы (3)


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

person Mr. Mascaro    schedule 04.02.2015
comment
Большое спасибо, похоже, проблема решена! Вы можете объяснить, почему / как работает разрешение? То есть в чем причина проблемы, почему она возникла внезапно? Еще раз спасибо! - person jaegee; 05.02.2015
comment
@jaegee, событие активации не произойдет, если лист активен в данный момент. Это просто ошибка в Excel. Также отметьте мой ответ как правильный с зеленой галочкой. - person Mr. Mascaro; 05.02.2015

Я знаю, что это старый вопрос, но нет необходимости сначала активировать другой лист, а затем повторно активировать тот, который вы хотите:

Private Sub Workbook_Open()
    ' Bug in Excel:
    ' The Worksheet_Activate event does not fire for the sheet that is active
    ' when the workbook is opened, so call it explicitely. Make sure that
    ' Worksheet_Activate() is declared as Public.
    ' Ignore ActiveSheets without (Public) Worksheet_Activate()
    On Error Resume Next
    Call ActiveSheet.Worksheet_Activate
    On Error GoTo 0
End Sub

Также не рекомендуется ссылаться на лист по имени, как в Worksheets("Sheet1"), если у вас нет для этого очень веских причин. Лучше использовать CodeName. Подробнее см. в этом сообщении.

person Wim    schedule 16.09.2016
comment
Просто подчеркну / еще раз подчеркну, что важно изменить объявление подпрограммы Activate с частного (по умолчанию) на общедоступное. например Private Sub Worksheet_Activate () следует заменить на Public Sub Worksheet_Activate (). В противном случае это не сработает. - person John Joseph; 03.02.2020
comment
@JohnJoseph: это именно то, что я написал в комментариях к подпункту Workbook_Open () в моем ответе. Обработчик ошибок нужен только для того, чтобы поймать, что объект не поддерживает это свойство или ошибку метода, которая может быть вызвана вызовом частной или несуществующей процедуры Worksheet_Activate (). - person Wim; 05.02.2020
comment
да, я знаю - вот почему я сказал подчеркивание / повторение - это важно, но легко упустить. Отличный ответ - мне помогло! Я проголосовал за это. - person John Joseph; 06.02.2020

Этот параметр также может быть задействован:

Application.ScreenUpdating = true
person RayInAZ    schedule 25.07.2021