Как можно написать код, чтоб стирать определенные коды макросов (VBA) с определенного листа книги? Заранее очень благодарен! |
|
Вот так можно удалить Module1 Sub KillModule1() |
|
Нет, не удалять весь модуль, а удалять определенные коды макросов с Листа где они написаны. Я думаю нам надо сперва выбрать по имени некоторые только коды и затем удалить с листа. |
|
Я не знаю, как удалить отдельный макрос в модуле. Если узнаете — сообщите. Вот вам интересная ссылка http://www.vbstreets.ru/VBA/Articles/65935.aspx |
|
** ТУРБО-ЁЖ ** *ЕХСЕL@ХАКЕР.RU==== Гость |
Сервис -> Макрос -> Безопасность -> Надежные издатели -> [+] Доверять доступ к Visual Basic Project Для модуля первого листа: Циклом или ещё как подбираешь требуемые циферки и DeleteLines(от,сколько). |
Спасибо, |
|
Вот нашёл Source: http://msoffice.nm.ru/faq/macros/module.htm#faq47 Sub DeleteProcedure() |
|
Спасибо. Знаешь для чего это нужно было? Просто я когда копирую определенный лист, вот там на создавшемся новом листе надо было удалить некоторые макросы, прибывшие от того листа. Вот я хотел чтоб когда лист копировался внутри этого кода пришить удаление некоторых кодов, так как в новом листе некоторые из них непонадобиться! |
|
{quote}{login=to……..Pavel55}{date=25.06.2008 03:51}{thema=}{post}Спасибо. Знаешь для чего это нужно было? Просто я когда копирую определенный лист, вот там на создавшемся новом листе надо было удалить некоторые макросы, прибывшие от того листа. Вот я хотел чтоб когда лист копировался внутри этого кода пришить удаление некоторых кодов, так как в новом листе некоторые из них непонадобиться! |
|
У меня и так коды написаны в Модуль1 Проекта, а на листе написаны только минимально ссылки на них, (т.е «Call …»), а мне надо чтоб один образцовый лист копировался и на копий удалялись ненужные уже (не все) коды, я их заранее перечислил бы! Ну это думаю не критично, т.к каждый код состоит из только 3-строк (Private Sub, Call…., и End Sub) |
|
{quote}{login=:)}{date=25.06.2008 11:45}{thema=Re: }{post}{quote}{login=to……..Pavel55}{date=25.06.2008 03:51}{thema=}{post}Спасибо. Знаешь для чего это нужно было? Просто я когда копирую определенный лист, вот там на создавшемся новом листе надо было удалить некоторые макросы, прибывшие от того листа. Вот я хотел чтоб когда лист копировался внутри этого кода пришить удаление некоторых кодов, так как в новом листе некоторые из них непонадобиться! |
|
Inter_E Пользователь Сообщений: 399 |
Добрый День Дмитрий! Короче код вставь в Модуль, и он должен начинаться не с Private Sub а просто Sub и имя Макроса. A код с листа надо убрать! И чтоб ссылалось на Модуль тебе надо написать на Лист1 код, например Private Sub OptionButton25.Click () и все With my best regards, Inter_E |
Спасибо, а если перенести код в модуль ЭтаКнига? |
|
Inter_E Пользователь Сообщений: 399 |
Если зделать как в случае Модуль1, то не будет работать, у меня не работало. Я думаю лучше не переносить в Эта книга. Я просто об Эта книга не знаю для чего она нужна. Ты лучше по эксперементируй. И мне обяснишь потом? Зачем нужна Эта книга? ОК? With my best regards, Inter_E |
Алекс Гость |
#17 02.12.2008 19:27:26 www.spkk.ru
Кондиционеры тут Прикрепленные файлы
|
I want to delete the VBA code contained within a sheet through VBA. Currently, I have a code that copies a sheet across to a new workbook and deletes all images from it. However, these images are set to do things on Worksheet_Activate in the code, which then causes an error whenever I flick to that sheet with no images there.
I know I can get rid of modules etc using something along the lines of:
With ActiveWorkbook.VBProject
For x = .VBComponents.Count To 1 Step -1
.VBComponents.Remove .VBComponents(x)
Next x
For x = .VBComponents.Count To 1 Step -1
.VBComponents(x).CodeModule.DeleteLines _
1, .VBComponents(x).CodeModule.CountOfLines
Next x
End With
but that does not delete from the sheet (or the workbook for that matter. Would be interesting to know if that was possible too).
The code itself will need to be valid for Excel versions 2003 through to 2013 (so cannot use the save as xlsx workaround).
Nimantha
6,6036 gold badges29 silver badges66 bronze badges
asked Nov 26, 2013 at 16:48
10
Found out the issue. My code works fine, just the computer I was testing it on did not allow access to the VBA project object model (and was running it with an On Error Resume Next earlier on in the code)
Will have to write an exception in to sort that out in such cases.
Thanks to @mehow @nixda @SiddharthRout and @DaveU for the help
Nimantha
6,6036 gold badges29 silver badges66 bronze badges
answered Nov 27, 2013 at 9:10
bmgh1985bmgh1985
7781 gold badge14 silver badges38 bronze badges
0
Хитрости »
6 Июнь 2011 79278 просмотров
Как удалить макросы в книге?
Рано или поздно у разработчиков возникает вопрос: как удалить макросы, в том числе и из книги, в которой эти макросы расположены? Да еще так, чтобы об этом никто ничего не узнал?
Для изменения кодов программно необходимо, чтобы было проставлено доверие к объектной модели проекта VBA и изменяемый проект не должен быть защищен. Подробнее читайте в статье: Что необходимо для внесения изменений в проект VBA(макросы) программно
Без этого будет невозможно программное вмешательство в проект VBA.
- Удалить все макросы из активной книги
- Удалить отдельный модуль(Module), Форму(UserForm), Код листа или книги
- Удалить отдельную процедуру из модуля
- Удалить все макросы вручную
УДАЛИТЬ ВСЕ МАКРОСЫ ИЗ АКТИВНОЙ КНИГИ
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
ссылки
статистика
Содержание:
- Удалите все макросы, сохранив файл в формате XLSX
- Удалить определенные макросы из диалогового окна «Макрос»
- Удалите модуль с макросом
[lyte id=’lyNJbZfM7TU’ /]
Использование макросов VBA в Excel может значительно сэкономить время. Вы можете автоматизировать множество повторяющихся задач и создавать новые функции и возможности в Excel с помощью простых кодов макросов VBA.
Но в некоторых случаях вам может потребоваться удалить все макросы из книги Excel (или удалить только определенные макросы).
Это может быть в том случае, если вы получаете книгу от кого-то другого и хотите освободить ее от макросов, или когда вы отправляете кому-то файл с макросами, а квитанция не нуждается в них в книге.
В этом уроке я покажу вам несколько действительно простых способов удалить макросы из книги в Microsoft Excel.
Итак, приступим!
Удалите все макросы, сохранив файл в формате XLSX
Если вы хотите избавиться от всех макросов сразу, самый простой способ сделать это — сохранить существующую книгу в формате XLSX.
По умолчанию у вас не может быть кода макроса VBA в формате файла XLSX. Если вы это сделаете, он будет автоматически удален при сохранении файла Excel.
В Excel вы можете использовать макросы только в форматах .XLSM, .XLSB и более старых форматах .XLS. Когда вы сохраняете книгу в любом другом формате, макросы сразу теряются.
Предположим, у вас есть файл с именем Example.xlsm (с макросами), ниже приведены шаги по удалению всех макросов из этого файла:
- Перейдите на вкладку Файл.
- Нажмите на опцию «Сохранить как» (в новых версиях Excel это «Сохранить копию»).
- Щелкните Обзор. Откроется диалоговое окно «Сохранить как».
- В диалоговом окне «Сохранить как» введите имя файла, с которым вы хотите его сохранить. Вы также можете сохранить существующее имя, если хотите
- Щелкните раскрывающийся список Тип файла.
- Выберите вариант «Книга Excel (* .xlsx)».
- Нажмите на Сохранить
- В появившемся запросе нажмите Да. Он просто информирует вас о том, что код VB будет утерян, если вы сохраните этот файл в формате .XLSX.
Вот и все! Теперь ваш файл не содержит макросов.
Этот метод удобен тем, что удаляет все макросы из текущей книги Excel за один раз. Однако, если вы хотите удалить некоторые макросы и удалить некоторые, этот метод не сработает для вас (см. Тот, который использует диалоговое окно «Макрос» для этого).
Еще одна хорошая особенность этого метода заключается в том, что у вас все еще есть копия исходного файла со всеми макросами (на случай, если она вам понадобится в будущем).
Удалить определенные макросы из диалогового окна «Макрос»
Хотя предыдущий метод удалял все макросы. это позволяет вам выбрать те, которые вы хотите удалить.
И если вы хотите удалить все макросы, вы также можете это сделать.
Предположим, у вас есть файл с именем Example.xlsm, в котором есть несколько макросов.
Ниже приведены шаги по удалению макроса из этой книги:
- Перейдите на вкладку Разработчик (если вы не видите вкладку Разработчик, обратите внимание на примечание желтого цвета после шагов)
- Щелкните по кнопке Macros. Откроется диалоговое окно «Макрос», в котором вы увидите все макросы в книге.
- Убедитесь, что в раскрывающемся списке «Макросы в» выбрана «Эта книга».
- Выберите имя макроса, который вы хотите удалить, из списка макросов.
- Щелкните по кнопке Удалить. Это удалит выбранный макрос
Если вы хотите удалить несколько (или все) макросов, повторите шаги 4 и 5.
Примечание. Если вы не видите вкладку разработчика, нажмите здесь, чтобы узнать, как отобразить вкладку разработчика на ленте в Excel. Кроме того, вы также можете использовать сочетание клавиш — ALT + 8, чтобы открыть диалоговое окно «Макрос».
Кроме того, вы также можете щелкнуть вкладку «Представления», щелкнуть раскрывающийся список «Макросы» и затем выбрать опцию «Просмотр макросов». Это также откроет диалоговое окно Macros.
Хотя этот метод отлично работает, он позволяет удалять только макросы, которые хранятся в модуле редактора Visual Basic. Если у вас есть макросы событий (в определенных листах или ThisWorkbook) или макросы в личной книге макросов, их нельзя удалить с помощью этого метода.
Удалите модуль с макросом
Другой способ удалить макросы — перейти в редактор Visual Basic и удалить оттуда макросы.
Этот метод дает вам наибольший контроль, поскольку вы можете получить доступ ко всем макросам (будь то в модуле, объектах или личной книге макросов).
Ниже приведены шаги по удалению макроса из редактора Visual Basic:
- Щелкните вкладку Разработчик на ленте.
- Нажмите на опцию Visual Basic (или воспользуйтесь сочетанием клавиш — ALT + F11)
- В редакторе VB у вас будут все объекты книги в Project Explorer. Если вы не видите Project Explorer, выберите опцию View в меню, а затем нажмите Project Explorer.
- В Project Explorer дважды щелкните объект с кодом макроса. Это может быть модуль, объект рабочего листа или ThisWorkbook.
- В открывшемся окне кода удалите макросы, которые хотите удалить. Если вы хотите удалить все, просто выберите все и нажмите клавишу удаления.
Если у вас есть модуль, который имеет код, который вы хотите удалить, вы можете щелкнуть правой кнопкой мыши объект модуля, а затем выбрать опцию «Удалить модуль».
Итак, это три способа удаления макросов из книги Microsoft Excel.
Надеюсь, вы нашли этот урок полезным!
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
1 |
||||
Удалить макрос из листа06.02.2013, 17:26. Показов 3973. Ответов 20 Метки нет (Все метки)
Добрый день!
Как с помощью макроса можно его удалить и сохранить книгу?
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
06.02.2013, 17:26 |
20 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
06.02.2013, 17:37 |
2 |
Самое простое в новейших версиях — сохранить файл как xlsx.
0 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
06.02.2013, 18:28 [ТС] |
3 |
|||
Hugo121, Я наверное не так написал, мне нужно с помощью макроса удалить этот код
а потом сохранить автоматически
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
06.02.2013, 18:41 |
4 |
Вы не написали, что это за Эксель.
1 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
06.02.2013, 18:49 [ТС] |
5 |
Hugo121, мне нужно обязательно удалить этот код с помощью макроса, у меня 2003
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
06.02.2013, 19:09 |
6 |
Вот дилемма — тут в правилах нельзя давать ссылки на другие сайты, там же «Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора».
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
06.02.2013, 19:19 [ТС] |
7 |
Hugo121, ты че [удалено]
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
06.02.2013, 19:26 |
8 |
Сообщение было отмечено как решение Решение Ого!
0 |
4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
|
06.02.2013, 19:38 [ТС] |
9 |
Hugo121, спасибо что «помог»
0 |
The_Prist 1337 / 308 / 74 Регистрация: 13.11.2008 Сообщений: 635 |
||||||||
07.02.2013, 10:03 |
10 |
|||||||
«Лист1» — это кодовое имя листа, а не то, что отображено на ярлычке. Его можно посмотреть либо из редактора, либо получить кодом:
2 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
07.02.2013, 13:35 [ТС] |
11 |
|||
The_Prist, Спасибо большое за очередную поддержку, но я имею ввиду удалить не весь код в Лист1 а только
0 |
The_Prist 1337 / 308 / 74 Регистрация: 13.11.2008 Сообщений: 635 |
||||
07.02.2013, 13:40 |
12 |
|||
Я Вам на другом форуме дал ссылку на статью. Там все расписано и Ваш случай так же упомянут. А Вам советую свои пожелания сразу нормально обозначать, не скупясь на слова и пояснения.
1 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||||||
07.02.2013, 13:48 [ТС] |
13 |
|||||||
The_Prist, Вот я подправил код
Он удалил но оставил
как это тоже удалить?
0 |
The_Prist 1337 / 308 / 74 Регистрация: 13.11.2008 Сообщений: 635 |
||||||||||||
07.02.2013, 17:31 |
14 |
|||||||||||
Сообщение было отмечено как решение РешениеПо первому вопросу:
заменить на
по второму:
Пора бы уже… Может имеет смысл уже начать изучать синтаксис? Хотя бы начало, что ли. В статье даже написано как определяется имя процедуры. Осталось лишь дополнить конструкцию If … Then. Но без базовых знаний Вы, естественно, не можете этого сделать, т.к. даже не предполагаете где это делать. Это плохо. Форумы предназначены все же для помощи в изучении, а не для решения чужих задач.
2 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
08.02.2013, 08:57 [ТС] |
15 |
|||
Спасибо большое, я пишу на 1С, я предполагал что нужно and или or ставить но не получилось оказало что нужно sProcName = «имя другой процедуры» Добавлено через 13 часов 55 минут
0 |
The_Prist 1337 / 308 / 74 Регистрация: 13.11.2008 Сообщений: 635 |
||||
08.02.2013, 10:21 |
16 |
|||
Попробуйте цикл организовать снизу вверх:
1 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||
08.02.2013, 10:28 [ТС] |
17 |
|||
The_Prist, Все равно не удаляет
0 |
1337 / 308 / 74 Регистрация: 13.11.2008 Сообщений: 635 |
|
08.02.2013, 10:49 |
18 |
Ну да. И Exit For уберите из цикла.
1 |
Ermak27 4 / 4 / 0 Регистрация: 16.01.2013 Сообщений: 1,228 |
||||||||
08.02.2013, 11:23 [ТС] |
19 |
|||||||
The_Prist, Теперь он удаляет весь код кроме
0 |
The_Prist 1337 / 308 / 74 Регистрация: 13.11.2008 Сообщений: 635 |
||||||||
08.02.2013, 11:54 |
20 |
|||||||
в принципе-то да…знаете что. Лучше это в виде функции оформите с передачей в качестве параметра имени функции(и имени компонента для универсальности). И все.
и вызывайте её два раза:
ну или сколько Вам там еще процедур надо удалить.
1 |