Lost your password?


Хитрости »
Основные понятия (27)
Сводные таблицы и анализ данных (10)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (23)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (68)
Разное (43)
Баги и глюки Excel (5)

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

Рано или поздно у разработчиков возникает вопрос: как удалить макросы, в том числе и из книги, в которой эти макросы расположены? Да еще так, чтобы об этом никто ничего не узнал?

Для изменения кодов программно необходимо, чтобы было проставлено доверие к объектной модели проекта VBA и изменяемый проект не должен быть защищен. Подробнее читайте в статье: Что необходимо для внесения изменений в проект VBA(макросы) программно
Без этого будет невозможно программное вмешательство в проект 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


 
Так же можно удалить макросы только из одного компонента(листа или книги или модуля).

УДАЛИТЬ ОТДЕЛЬНЫЙ МОДУЛЬ(Module), ФОРМУ(UserForm) КОД ЛИСТА ИЛИ КНИГИ
Удалить модуль/форму целиком достаточно просто:

ActiveWorkbook.VBProject.VBComponents("UserForm1").Collection.Remove ActiveWorkbook.VBProject.VBComponents("UserForm1")
ActiveWorkbook.VBProject.VBComponents("Module1").Collection.Remove ActiveWorkbook.VBProject.VBComponents("Module1")

С листами несколько сложнее - если удалить компонент полностью, то будут потеряны и все данные на листе, а не только макросы. Поэтому удалять необходимо только код внутри листа. В качестве примера возьмем Лист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

Здесь тоже есть небольшая поправка: Лист1 - это кодовое(внутреннее имя) листа. На ярлычке имя листа может отображаться как угодно, а вот внутреннее...Его можно лучше подглядеть через редактор VBA:

Подробнее про кодовое имя листа можно прочитать в этой статье: Кодовое имя листа - что это и зачем нужно? Какие плюсы и минусы?
Чтобы удалить коды из модуля книги необходимо вместо Лист1 указать ЭтаКнига(для англ.версии - ThisWorkbook).


 
УДАЛИТЬ ОТДЕЛЬНУЮ ПРОЦЕДУРУ ИЗ МОДУЛЯ
Если же Вам необходимо удалить лишь определенную процедуру из модуля формы, стандартного модуля, модуля листа или книги, то сделать это чуть сложнее. Рассмотрим на примере удаления процедуры с именем "Code2", расположенной в стандартном модуле "Module2"

Sub Delete_Sub_From_Module()
    Dim lCountLines As Long, li As Long, lStartLine As Long, lProcLineCount As Long
    Dim sCodeName As String, sProcName As String
 
    With ActiveWorkbook.VBProject.VBComponents("Module2")
        'получаем кол-во строк кода в модуле
        lCountLines = .CodeModule.CountOfLines
        'получаем первую строку с кодом, исключая строки декларирования функции и опций модуля
        lStartLine = .CodeModule.CountOfDeclarationLines + 1
        'цикл по всем строкам кода внутри модуля
        For li = lStartLine To lCountLines
            'получаем имя процедуры/функции, внутри которой строка кода
            sProcName = .CodeModule.ProcOfLine(li, 0)
            'если имя процедуры совпадает с тем, которое нам нужно
            If sProcName = "Code2" Then
                'узнаем кол-во строк процедуры/функции
                lProcLineCount = .CodeModule.ProcCountLines(sProcName, 0)
                'удаляем процедуру/функцию
                .CodeModule.DeleteLines li, lProcLineCount - 1
                Exit For
            End If
        Next li
    End With
End Sub

Здесь стоит обратить внимание на один момент: данный поиск чувствителен к регистру. Т.е. если требуется удалить процедуру "Code2", то и к сравнению надо вписывать имя именно так. Если записать "code2", то совпадения найдено не будет и процедура не будет удалена. Во избежание подобного можно приводить имена к одному регистру:
If LCase(sProcName) = LCase("Code2") Then



 
УДАЛИТЬ ВСЕ МАКРОСЫ ВРУЧНУЮ
Еще хочу добавить, что если надо не скрыто, а просто быстро удалить все макросы из книги и Вы счастливый обладатель Excel версии 2007 и выше, то всего лишь необходимо книгу, из которой хотите удалить макросы, Сохранить как -обычная Книга Excel (Файл(File)(или кнопка Меню для 2007 Excel) -Сохранить как(Save As) -Книга Excel(Excel Workbook)).

Программно это можно сделать простым кодом:

Sub SaveBookWithoutMacro()
    ActiveWorkbook.SaveAs Filename:="C:\Книга1.xlsx", FileFormat:=51
End Sub

Отдельную роль здесь играет параметр FileFormat, которому мы назначаем значение 51. По сути 51 - это значение константы xlOpenXMLWorkbook, которая говорит VBA, что файл надо сохранить в формате обычной книги Excel без поддержки макросов. Работает только начиная с 2007 Excel.

Для тех же, кто все еще использует офис 2003 и ранее и хочет удалить коды и макросы вручную - придется удалять каждый модуль из проекта и каждый код из модулей листов и книг поочередно, руками.

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


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистика
Обсуждение: 13 комментариев
  1. Roman:

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

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

  3. Roman:

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

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

  5. Roman:

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

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

  6. Алексей:

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

  7. Мотя:

    С П А С И Б О!

  8. Михаил:

    Спасибо - очень пригодилось Использую " Удалить процедуру из тела Модуля".
    Только у меня пришлось изменить строку

    .CodeModule.DeleteLines li, lProcLineCount - 1

    - убрал вычитание единицы, иначе оставалась последняя строка процедуры
    Еще раз спасибо!

  9. Мотя:

    Автору "УДАЛИТЬ ВСЕ МАКРОСЫ ИЗ АКТИВНОЙ КНИГИ" - СПАСИБО!
    Долго "рыла" Интернет в поисках готовенького макроса.
    И вдруг - Его Величество Случай!
    Все мои "хотелки" - как подарок - "на халяву"!
    Манипулируешь CASE-ми и "дело в шляпе"!!!
    С П А С И Б О и У Д А Ч И!!!

  10. Игорь:

    Автору - премногая благодарность!

Поделитесь своим мнением

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


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2024 Excel для всех   Войти