С макросами встречался всего несколько раз - сделал дело и больше не виделся. Потому в этой теме слаб и прошу совета.
Вопрос: могут ли макросы появляться в документе через внешние ссылки или ещё каким-то "перетаскиванием", кроме явного создания через вкладку "разработчик".
Тут мне выносят мозг с кучей xls-документов где происходит ошибка в макросах и работать дальше не могут - либо эксель падает, либо открывается непонятное окно (редактор кода макросов). И вполне резонно спрашивают: "...Но ведь раньше такого не было!..." А я ничего не могу сказать, т.к. не знаю.
Сейчас работают в excel 2010. Но сохраняют в формате "Книга Excel 97-2003", т.к. "не все филиалы смогут открыть"
Как выяснилось, во всех этих документах есть макросы. Ошибка происходит в строке "Worksheets("Рекомендации").Select":
Код
Sub Auto_Open()
'begin
Application.ScreenUpdating = False
М_Листы.ЗащитаЛистов
Application.ScreenUpdating = True
Worksheets("Рекомендации").Select
Cells(6, 3).Select
End Sub
Как я понял, нужен лист "Рекомендации" - но листа такого в документах нет. Вот всё и ломается. (да и вообще не ясно зачем эти две последние строчки - может, просто так)
Как удалить макросы: сохранить как книгу без макросов xlsx, а потом пересохранить книгу в формате "Книга Excel 97-2003" - я уже понял и сказал женщинам так и делать со всеми файлами. Они утверждают (правда веры им нет, т.к. одна ссылается на другую, а другую я по телефону не вижу), что они всё так и сделали - пересохранили все документы.
Вопрос (тот же самый): могли ли в этих документах снова появится макросы, если с макросами женщины работать не умеют вообще?
То что макросы там появились не из какого-то вируса - это я понял по некоторым названиям в других модулях - они явно имеют отношение к специфике этих документов. А сломалось всё, как мне кажется, после удаления листа "рекомендации", хоть женщины и говорят, что: "...такого листа никогда не было..." Или ещё как-то...
Ну а сейчас пытаюсь разобраться как сделать макрос для перебора всех xls файлов в конкретной директории и выпиливания из них макросов. Нашёл тут перебор файлов и тут удаление макросов в книге. Надеюсь получится что-нибудь.
Sub Auto_Open()'begin 'он не самостоятельный, нет события его вызывающего, то есть где-то еще есть макрос который его запусает (в листе или на листе в кнопке)
on error resume next 'напишите эту строку, при этом функционал останется, если нужен конечно
Application.ScreenUpdating = False
М_Листы.ЗащитаЛистов 'здесь он запускает еще одну какую-то пользовательскую функцию, как не трудно догадаться - защищает листы
Application.ScreenUpdating = True
Worksheets("Рекомендации").Select 'ваш корень зла - просто хочет открыть этот лист, раз его нет, то ошибка
Cells(6, 3).Select 'можете удалить это и строчку выше, либо весь макрос, ошибка пропадет, либо создать лист с таким названием, либо on error resume next (целых 4 варианта )
End Sub
Бахтиёр написал: после этого не должны были остаться макросы
смотря каков был порядок этого сохранения. Если такой: -открыли файл с макросом -сохранили в .xlsx -сохранили в .xls То 100% макросы не были удалены, ибо пересохранение в .xlsx с удалением макросов сработает только после закрытия файла. Т.е. правильный порядок такой: -открыли файл с макросом -сохранили в .xlsx -закрыли этот файл -открыли заново этот .xlsx -сохранили в .xls Теперь никакие макросы в файле не будут сохранены.
guzen_pilot написал: он не самостоятельный, нет события его вызывающего
Да, Бахтиёр здесь прав. В ранних версиях не было событийных процедур в модулях книг и применялись процедуры автоматизации, которые имели зарезервированные имена: Auto_Open, Auto_Close, Auto_Activate, Auto_Deactivate. Размещались как и все остальные в стандартных модулях и срабатывали при наступлении события. В современных версиях так же работают, но имеют отличие: например, если открыть книгу с процедурой Auto_Open макросом(Workbooks.Open), то процедура не сработает. Данные процедуры не рекомендуются к использованию, т.к. давно были заменены на аналоги в ЭтаКнига(ThisWorkbook) и их работа связана исключительно с поддержкой обратной совместимости.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
The_Prist написал: удаление макросов сработает только после закрытия файла.
Блин, написал своё сообщение, подумал, засомневался, только хотел потестить именно этот момент (пересохранение с xlsx на xls без закрытия книги) Не успел - уже уличили во лжи
Что происходит в макросе я понял - почитал в интернете. Как удалить макрос или его часть, или пересохранить книгу я тоже уже знаю - я писал об этом и пробовал - у меня лично проблем с файлами не было.
Меня в основном интересовал конкретный вопрос (я его два раза задал). The_Prist, подсказал возможный вариант событий, что женщины могли банально не закрыть документ (а могли и просто не пересохранить документы).
Господа guzen_pilot, Бахтиёр, The_Prist, большое Спасибо за помощь! Макрос удаления ещё не начал писать, тут умудрились вирус-шифровальщик зацепить - так что ближайшее время займусь им.
kluvonog написал: Вопрос: могут ли макросы появляться в документе через внешние ссылки или ещё каким-то "перетаскиванием", кроме явного создания через вкладку "разработчик".
могут, допустим:
Код
With ActiveWorkbook.VBProject.VBComponents(Worksheets("Лист1").CodeName).CodeModule
.InsertLines 1, "Sub Worksheet_Activate()"
.InsertLines 2, "сделать_что_нибудь"
.InsertLines 3, "End Sub" ' 1,2 и 3 - это строки в которые нужно записать код, в "" сам код
end with
этот код впишет в активной книге в "Лист1" код который при активации этого самого листа запустит макрос с названием "сделать_что_нибудь", который в большинстве случаев должен быть записан в модулях этой книги. Записать такой код можно откуда угодно, главное правильно обратиться к "цели", а еще желательно и проверить существует ли сам лист, а если другая книга, то открыта или закрыта в текущий момент......
Цитата
kluvonog написал: А сломалось всё, как мне кажется, после удаления листа "рекомендации"
совершенно верно, хотя лист тоже программно можно удалить, но скорее всего, просто "диверсант" не сознается )))