MyTetra Share
Делитесь знаниями!
Как удалить макросы в книге?
16.03.2019
23:43
Раздел: !Закладки - 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



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


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


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

            li = li + lProcLineCount

        Next li

    End With

End Sub

Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования