Excel изменить макрос в скрытой книге невозможно

Обновлено: 08.07.2024

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

Для изменения кодов программно необходимо, чтобы было проставлено доверие к объектной модели проекта 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(Меню-Сохранить как-Книга Excel).

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

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

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

Личная книга макросов автоматически открывается в фоновом режиме сразу после загрузки программы Excel и закрывается вместе с приложением, что обеспечивает постоянный доступ из других открытых книг к записанным в ней процедурам.

Персональная книга макросов является скрытой, поэтому добавлять, удалять и изменять размещенные в ней процедуры можно только в редакторе VBA.

Так же, как и в других рабочих книгах, в Личной книге макросов можно создавать программные модули, импортировать и экспортировать их, записывать в модули пользовательские процедуры (подпрограммы и функции) или копировать и вставлять их из модулей других книг.

Подпрограммы, размещенные в Личной книге макросов, можно просмотреть в окне «Список макросов», открыв его из любой рабочей книги Excel. Они будут перечислены с приставкой «PERSONAL.XLSB!». Функции в этом окне не отображаются.

Пользовательские функции, размещенные в Личной книге макросов, доступны для просмотра, выбора и вставки их в ячейки рабочего листа в Мастере функций:

Список функций, определенных пользователем

Список пользовательских функций в Личной книге макросов

По умолчанию пользовательские функции расположены в категории «Определенные пользователем». Они выбираются и вставляются в ячейки рабочего листа с помощью Мастера функций так же, как и все остальные.

Пользовательские функции, расположенные в обычной рабочей книге Excel, тоже будут доступны в Мастере функций, но для этого книга должна быть открыта.

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

Создание

Изначально Личная книга макросов в приложении Excel отсутствует. Чтобы проверить, есть ли она в вашей программе (не создал ли ее кто-то ранее), откройте любую рабочую книгу и перейдите в редактор VBA, нажав сочетание клавиш «Alt+F11» (в этом сочетании используется левая клавиша Alt). Открыть редактор VBA можно и пройдя по пунктам меню:

Excel 2007-2016: «Разработчик» –> «Visual Basic» (смотрите, как отобразить вкладку «Разработчик», которая изначально скрыта);

Excel 2000-2003: «Сервис» –> «Макрос» –> «Редактор Visual Basic».

Откроется редактор VBA:

Проводник в редакторе VBA Excel

Проводник в редакторе VBA

Если в проводнике сверху вы видите строку «VBAProject (PERSONAL.XLSB)», значит Личная книга макросов на вашем компьютере уже есть.

Если же ее нет, необходимо записать какой-нибудь простенький макрос, выбрав при его создании Сохранить в: Личная книга макросов.

 Сохранение макроса в Личной книге макросов

Сохранение макроса в Личной книге макросов

После записи макроса, сохраненного в Личную книгу макросов, эта книга будет создана и появится в проводнике редактора VBA.

Расположение

Место расположения Личной книги макросов на конкретном компьютере, по словам разработчиков, зависит только от версии операционной системы. О его зависимости от версии Excel в их статье ничего не сказано.

В любом случае, книга PERSONAL.XLSB находится в папке XLSTART, которую можно разыскать с помощью поиска в проводнике:

Результаты поиска папки XLSTART в проводнике

Результаты поиска папки XLSTART в проводнике

Личная книга макросов в папке XLSTART

Личная книга макросов в папке XLSTART

Удаление

Если вы хотите удалить Личную книгу макросов из своего приложения Excel, найдите с помощью поиска в проводнике папку XLSTART и удалите из нее файл PERSONAL.XLSB.

В принципе, наличие неиспользуемой Персональной книги макросов ничем не мешает. Но если не вы ее создавали и вас беспокоит наличие в ней чужого кода, можете удалить из нее в редакторе VBA все стандартные модули и очистить от процедур модули книги (по умолчанию «ЭтаКнига») и листа (по умолчанию «Лист1»).

Добавление

Как видно из комментариев к этой статье, у некоторых пользователей приложения Excel при создании макроса в выпадающем списке «Сохранить в» отсутствует пункт «Личная книга макросов».

Использование макросов VBA в Excel может значительно сэкономить время. Вы можете автоматизировать множество повторяющихся задач и создавать новые функции и возможности в Excel с помощью простых кодов макросов VBA.

Но в некоторых случаях вам может потребоваться удалить все макросы из книги Excel (или удалить только определенные макросы).

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

В этом руководстве я покажу вам несколько действительно простых способов удаления макросов из книги в Microsoft Excel .

Удалите все макросы, сохранив файл в формате XLSX

По умолчанию у вас не может быть кода макроса VBA в формате файла XLSX. Если вы это сделаете, он будет автоматически удален при сохранении файла Excel.

В Excel вы можете использовать макросы только в форматах .XLSM, .XLSB и более старых форматах .XLS. Когда вы сохраняете книгу в любом другом формате, макросы сразу теряются.

Предположим, у вас есть файл с именем Example.xlsm (с макросами), ниже приведены шаги по удалению всех макросов из этого файла:

Это оно! Теперь ваш файл не содержит макросов.

Этот метод удобен тем, что удаляет все макросы из текущей книги Excel за один раз. Однако, если вы хотите удалить некоторые макросы и удалить некоторые, этот метод не подойдет вам (см. Тот, который использует диалоговое окно «Макрос» для этого).

Еще одна хорошая особенность этого метода заключается в том, что у вас все еще есть копия исходного файла со всеми макросами (на случай, если она вам понадобится в будущем).

Удалить определенные макросы из диалогового окна «Макрос»

Хотя предыдущий метод удалял все макросы. это позволяет вам выбрать те, которые вы хотите удалить.

И если вы хотите удалить все макросы, вы также можете это сделать.

Предположим, у вас есть файл с именем Example.xlsm, в котором есть несколько макросов.

Ниже приведены шаги по удалению макроса из этой книги:

Если вы хотите удалить несколько (или все) макросов, повторите шаги 4 и 5.

Кроме того, вы также можете щелкнуть вкладку «Представления», щелкнуть раскрывающийся список «Макросы» и затем выбрать опцию «Просмотр макросов». Это также откроет диалоговое окно Macros.

Хотя этот метод отлично работает, он позволяет удалять только макросы, которые хранятся в модуле редактора Visual Basic. Если у вас есть макросы событий (в определенных листах или ThisWorkbook) или макросы в личной книге макросов, их нельзя удалить с помощью этого метода.

Удалите модуль с макросом

Этот метод дает вам максимальный контроль, поскольку вы можете получить доступ ко всем макросам (будь то в модуле, объектах или личной книге макросов).

Ниже приведены шаги по удалению макроса из редактора Visual Basic:

Если у вас есть модуль с кодом, который вы хотите удалить, вы можете щелкнуть правой кнопкой мыши объект модуля, а затем выбрать опцию «Удалить модуль».


Итак, это три способа удаления макросов из книги Microsoft Excel.

Вам необходимо использовать один и тот же макрос (пользовательскую функцию) в разных рабочих книгах? Нет ничего проще, сохраните его в Личной книге макросов , файл которой имеет название — PERSONAL.XLSB . Он скрыто открывается при запуске программы MS Excel и доступен только на вашем ПК.

Создание и сохранение кода в Личной книге макросов

1. В строке состояния, нажмите иконку записи макроса:

Или на вкладке Разработчик ► Запись макроса (Код) :

Если вкладка Разработчик отсутствует, нажмите в Строке меню или на Панели инструментов правую кнопку мыши и выберите в меню вариант Настройка ленты. :

В окне настройки, установите галку Разработчик :

2. В открывшемся диалоговом окне Запись макроса , из выпадающего списка Сохранить в: выберите вариант Личная книга макросов , нажмите на кнопку Oк :

На вкладке Разработчик ► Остановить запись (Код) .

3. Закройте текущую книгу нажав Сохранить в диалоговом окне:

Файл Личной книги макросов создан.

Чтобы узнать путь к файлу, откройте новую книгу, нажмите клавиши ALT + F11 , редакторе Visual Basic ( VBE ) вставьте в «Project-VBAProject» (PERSONAL.XLSB) макрос:

Закройте VBE и выполните макрос в окне MS Excel.

В любом случае, книга PERSONAL.XLSB находится в папке XLSTART , которую можно найти с помощью поиска в проводнике Windows.

Добавление макросов

Если вы хотите написать свой макрос (пользовательскую функцию) или добавить готовый из интернета, откройте редактор VBE (ALT + F11) , выберите папку «Project-VBAProject» (PERSONAL.XLSB) и вставьте в модуль нужный код . Уже записанные в книгу макросы удалять не нужно, они не будут конфликтовать между собой, если в одном модуле не хранить макросы с одинаковыми именами.

Подпрограммы, размещенные в Личной книге макросов, можно просмотреть в окне Список макросов , открыв его из любой рабочей книги MS Excel (Alt + F8) :

Читайте также: