Как удалить макросы в книге?
Что умеет Excel
Рано или поздно у разработчиков возникает вопрос: как удалить макросы, в том числе и из книги, в которой эти макросы расположены? Да еще так, чтобы об этом никто ничего не узнал? С одной стороны — это довольно просто сделать при помощи кода VBA:
Sub Delete_Macroses() Dim oVBComponent As Object, lCountLines As Long 'Проверяем, защищен проект или нет If ActiveWorkbook.VBProject.Protection = 1 Then MsgBox "VBProject выбранной книги защищён." & vbCrLf & _ " Компоненты не будут удалены.", vbExclamation, "Отмена выполнения" Exit Sub End If For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents On Error Resume Next With oVBComponent Select Case .Type Case 1 'Модули .Collection.Remove oVBComponent Case 2 'Модули Класса .Collection.Remove oVBComponent Case 3 'Формы .Collection.Remove oVBComponent Case 100 'ЭтаКнига, Листы lCountLines = .CodeModule.CountOfLines .CodeModule.DeleteLines 1, lCountLines End Select End With Next Set oVBComponent = Nothing End Sub
Sub Delete_Macroses()
Dim oVBComponent As Object, lCountLines As Long
'Проверяем, защищен проект или нет
If ActiveWorkbook.VBProject.Protection = 1 Then
MsgBox "VBProject выбранной книги защищён." & vbCrLf & _
" Компоненты не будут удалены.", vbExclamation, "Отмена выполнения"
Exit Sub
End If
For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents
On Error Resume Next
With oVBComponent
Select Case .Type
Case 1 'Модули
.Collection.Remove oVBComponent
Case 2 'Модули Класса
.Collection.Remove oVBComponent
Case 3 'Формы
.Collection.Remove oVBComponent
Case 100 'ЭтаКнига, Листы
lCountLines = .CodeModule.CountOfLines
.CodeModule.DeleteLines 1, lCountLines
End Select
End With
Next
Set oVBComponent = Nothing
End Sub- Но есть два момента:
Доверие к проекту VBA должно быть проставлено- Excel 2007 – Меню-Параметры Excel-Центр управления безопасностью-Параметры макросов-поставить галочку «Доверять доступ к объектной модели проектов VBA»;
- Excel 2003 – Сервис – Параметры-вкладка Безопасность-Параметры макросов-Доверять доступ к Visual Basic Project
- проект не должен быть защищен.
Исключить первое условие никак нельзя программно(хотя вру, конечно, можно. Но весьма непросто и в этой статье я не буду все это описывать и рассказывать). А вот как снять пароль с проекта VBA я уже рассказывал в статье Как программно снять пароль с VBA проекта?.
Так же можно удалить макросы только из одного компонента(листа или книги или модуля). В качестве примера возьмем Лист1:
Sub Delete_Macroses_In_One_Comp() Dim oVBComponent As Object, lCountLines As Long Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Лист1") With oVBComponent lCountLines = .CodeModule.CountOfLines .CodeModule.DeleteLines 1, lCountLines End With Set oVBComponent = Nothing End Sub
Sub Delete_Macroses_In_One_Comp()
Dim oVBComponent As Object, lCountLines As Long
Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Лист1")
With oVBComponent
lCountLines = .CodeModule.CountOfLines
.CodeModule.DeleteLines 1, lCountLines
End With
Set oVBComponent = Nothing
End SubЗдесь тоже есть небольшая поправка: Лист1 — это кодовое(внутреннее имя) листа. На ярлычке имя листа может отображаться как угодно, а вот внутренее…Его можно поменять лишь из VBA:

Еще хочу добавить, что если Вам надо не скрыто, а просто быстро удалить все макросы из книги и Вы счастливый обладатель Excel версии 2007 и выше, то Вам всего лишь необходимо книгу, из которой хотите удалить макросы, Сохранить как-обычная Книга Excel(Меню-Сохранить как-Книга Excel).

Также см.:
→Копирование модулей и форм из одной книги в другую
→Как программно снять пароль с VBA проекта?

3925

а если макросы были завязаны на кнопку(и) можно ли удалить вместе с кодом и саму кнопку?
Что мешает записать макрорекордером действие удаления кнопки? В принципе это не имеет отношения к данной теме. Но делается примерно так:
ActiveSheet.Shapes(«Имя кнопки»).Delete
Вышеизложеный код удяляет коды (уж простите за тафтологию) только из листов, а вот из вложения «Эта книга» даже и не думает . Какнибудь можно обойти этот ньюанс?
Не верю. Самый первый код удаляет ВСЕ коды из модулей листов, модуля книги, а так же все пользовательские формы и модули. А в последнем коде я честно указал, что удаление произойдет только для Лист1
точно первый код все удалил, у меня на компе какойто глюк был… извиняюсь
Благодарю Вас за ценную информацию. Как среднестатистическому юзеру понадобился только последний абзац.