Версия для печати

Как удалить макросы в книге?

Что умеет 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 должно быть проставлено 

    1. Excel 2007Меню-Параметры Excel-Центр управления безопасностью-Параметры макросов-поставить галочку «Доверять доступ к объектной модели проектов VBA»;
    2. 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 проекта?



Поддержать автора сайта
Поделиться ссылкой
  1. Roman
    6 Июнь 2011 в 15:31 | #1

    а если макросы были завязаны на кнопку(и) можно ли удалить вместе с кодом и саму кнопку?

  2. 6 Июнь 2011 в 17:14 | #2

    Что мешает записать макрорекордером действие удаления кнопки? В принципе это не имеет отношения к данной теме. Но делается примерно так:
    ActiveSheet.Shapes(«Имя кнопки»).Delete

  3. Roman
    2 Август 2011 в 14:28 | #3

    Вышеизложеный код удяляет коды (уж простите за тафтологию) только из листов, а вот из вложения «Эта книга» даже и не думает . Какнибудь можно обойти этот ньюанс?

  4. 2 Август 2011 в 14:38 | #4

    Не верю. Самый первый код удаляет ВСЕ коды из модулей листов, модуля книги, а так же все пользовательские формы и модули. А в последнем коде я честно указал, что удаление произойдет только для Лист1

  5. Roman
    2 Август 2011 в 15:50 | #5

    Дмитрий(Админ) :Не верю. Самый первый код удаляет ВСЕ коды из модулей листов, модуля книги, а так же все пользовательские формы и модули. А в последнем коде я честно указал, что удаление произойдет только для Лист1

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

  6. Алексей
    28 Март 2012 в 13:47 | #6

    Благодарю Вас за ценную информацию. Как среднестатистическому юзеру понадобился только последний абзац. :)

Комментарий будет добавлен после проверки администратором.
Комментарии, не имеющие отношения к комментируемой статье, будут удаляться без уведомления и объяснения причин. Если есть вопрос по проблеме в Excel- добро пожаловаться на Форум