Потеря кода VBA в «ThisWorkbook» (Private Sub WorkBook_Open())

Первые три элемента фона:

  1. Я создал шаблон Excel, который, в свою очередь, используется для создания «персонализированного шаблона», в котором имя пользователя, пользовательский комментарий и пути сохранения данных встроены в персонализированный шаблон.
  2. Персонализированный шаблон используется для создания ежемесячных рабочих книг (фактически табелей учета рабочего времени)
  3. Шаблон был создан в Office/Excel 2007, работающем под управлением Vista, но (текущая) целевая среда — это корпоративная сеть, работающая под управлением Office/Excel 2003 под управлением XP Professional. Поэтому оба шаблона создаются как шаблоны Excel 2003 (которые в среде разработки работают в режиме совместимости)

Пока все хорошо — шаблоны хорошо работают в среде разработки — код «персонализации» находится в подпрограмме WorkBook_Open() под «ThisWorkbook» — он запускается, УДАЛЯЕТ СЕБЯ и сохраняется как персонализированный шаблон. Оба шаблона имеют «макросы процесса» в коде Sheet1 (принцип здесь заключается в том, что исходный шаблон имеет макросы в «ThisWorkbook» и «Sheet1»; персонализированный шаблон имеет макросы только в «Sheet1» и рабочие книги, созданные из персонализированного шаблона НЕТ МАКРОСОВ ВООБЩЕ.

Во время «бета-тестирования» у меня были проблемы с Excel2000 под XP (форматы файлов), и на целевой машине моя процедура WorkBook_Open была удалена в основном шаблоне (вместо персонализированного шаблона) — хотя в Excel2007/Vista все работало нормально.

В то время я чувствовал, что недопустимое удаление Workbook_Open, вероятно, было ошибкой кодирования, но, исследуя проблемы, я нашел ряд ссылок на «Macafee, удаляющий модули VBA». Я не смотрел на них, но осознавал, что на целевой машине (и в среде) работает Macafee, в то время как на всех моих компьютерах работает Norton.

Перекодировав, я успешно перепроверил следующее:

a) Excel 2007/Vista/Norton
b) Excel 2007/XP Professional/Norton
c) Excel 2000/XP Home/Norton

поэтому чувствовал себя комфортно, чтобы повторно протестировать в Excel 2003/XP Professional/Macafee

На этот раз я наблюдал за этим - так что еще раз увидел, что процедура WorkBook_Open была неправильно удалена из основного шаблона - к сожалению, это было всего за несколько мгновений до того, как ключ памяти USB (откуда запускался шаблон) был полностью уничтожен.

Итак, к вопросу (ам) - прежде чем я снова пройду весь процесс:

  1. Есть ли объективные доказательства того, что Macafee удаляет «автозапускаемые» модули VBA?
  2. Если да, есть ли какой-нибудь обходной путь (этот шаблон будет использоваться тремя людьми на предприятии с десятью тысячами - так что я никак не смогу повлиять/изменить политики безопасности!!! :( ) - если есть проблема с Macafee, тогда мне придется все переосмыслить!

person Don Edmondson    schedule 12.06.2011    source источник
comment
Я никогда не слышал, чтобы McAfee (или любой другой антивирус) удалял код. Если я правильно понимаю, ваша собственная процедура предназначена для удаления кода? Почему? Звучит как гораздо более вероятный виновник.   -  person downwitch    schedule 15.06.2011
comment
Да и нет! Моя процедура WorkBook_Open запускается, взаимодействует с пользователем (получает сведения о пользователе), создает и сохраняет новый шаблон, а затем удаляет себя. Новый шаблон почти такой же, как и исходный, но включает сведения о пользователе и не включает подпрограмму WorkBook_Open. По сути, процедура WorkBook_Open предназначена для установки (пользовательского) шаблона на компьютер пользователя. Однако в среде XP Pro/Office 2003/Macafee подпрограмма WorkBook_open, по-видимому, удаляется немедленно (перед запуском!)   -  person Don Edmondson    schedule 15.06.2011
comment
Как я уже сказал в своем первоначальном вопросе, шаблон правильно работает в а) Excel 2007/Vista/Norton б) Excel 2007/XP Professional/Norton в) Excel 2000/XP Home/Norton   -  person Don Edmondson    schedule 15.06.2011
comment
Может быть, очевидно, но вы проверяли, сохраняете ли вы в формате xls с макросом (xlsm или подобным) для XL 2007? Кроме того, пробовали ли вы свой код шаг за шагом, чтобы увидеть, какая часть может не работать, особенно сохранить как?   -  person JMax    schedule 15.06.2011
comment
Существует множество способов вызвать однократный процесс настройки/конфигурации, не помещая его в событие открытия и затем удаляя код этого события. Несмотря ни на что... Я все еще настроен скептически. Попробуйте следующее: на пораженной машине перейдите в ближайшее окно, введите Application.EnableEvents = False, нажмите Enter, а затем откройте нужную книгу. Код, о котором идет речь, все еще присутствует?   -  person downwitch    schedule 15.06.2011


Ответы (3)


Чтобы ответить на ваш актуальный вопрос... ДА, многие антивирусные программы абсолютно считают код автозапуска, который запускается при открытии документов Excel или Word, небезопасным, и удаляют его, потому что на короткое время десять лет назад именно так работали некоторые черви. Я не знаю, делает ли это в частности MacAfee, но я определенно слышал об этом.

person Joel Spolsky    schedule 16.06.2011
comment
Спасибо, Джоэл - я думал, что это было предложено в некоторых моих исследованиях. Однако, к счастью, теперь мне удалось доказать, что это не моя проблема - я отвечу на свой вопрос через мгновение. - person Don Edmondson; 16.06.2011

Просто на случай, если кто-то еще придет в эту тему - я полностью проверил свой шаблон - и повторно запустил его в целевой среде - и процедура Workbook_Open снова была удалена. немного покопавшись на целевой машине, я нашел журнал событий Macafee и о чудо...
Тип события: Предупреждение
Источник события: McLogEvent
Категория события: Нет
Идентификатор события: 258
Дата: 07.09.2011
Время: 15:45:40
Пользователь: NT AUTHORITY\SYSTEM
Компьютер: xxxxxxxxxx
Описание: Файл F:\Timesheets\Timesheet Generator. xlt\1.OLE содержит X97M/Generic Virus. Файл был успешно очищен с помощью модуля сканирования версии 5400.1158 DAT версии 6400.0000.

Итак, есть окончательное доказательство. То же самое происходит с Workbook_Activate().

"Оскорбительные" строки кажутся

With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
        .DeleteLines 1, _
        .CountOfLines
person Don Edmondson    schedule 11.07.2011

Мне удалось снова добраться до клиентской машины и добавить новый простой шаблон, чтобы доказать или иным образом мою проблему. Новая процедура WorkBook_Open...

Private Sub WorkBook_Open()
    MsgBox "Hello World"
    With ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
        .DeleteLines 1, _
        .CountOfLines
    End With
    MsgBox "Goodbye to all that!"
End Sub

... и это работает точно так, как требуется, то есть процедура выполняется, а затем удаляет себя (отображается второе окно msgbox, даже если код был удален!

Итак, этот тест делает мой вопрос недействительным — McAfee НЕ удаляет подпрограмму как часть антивирусной защиты, поэтому я больше не ищу обходной путь!

Теперь все, что мне нужно сделать, это выяснить, в чем моя проблема на самом деле!

Спасибо за комментарии

person Don Edmondson    schedule 16.06.2011