Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2009, 16:27   #1
Николай IV
 
Регистрация: 03.07.2009
Сообщений: 8
По умолчанию Как программно удалить макрос из документа ?

В документе имеется некий макрос. Есть ли возможность его удаления из документа другим макросом, который записан в Normal.dot ?
Николай IV вне форума Ответить с цитированием
Старый 03.07.2009, 17:17   #2
CaptainNemo
Пользователь
 
Аватар для CaptainNemo
 
Регистрация: 02.06.2009
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Николай IV Посмотреть сообщение
В документе имеется некий макрос. Есть ли возможность его удаления из документа другим макросом, который записан в Normal.dot ?
Думаю, что можно. В настройках Office разрешите доступ к объектной модели и дайте ссылку Reference на библиотеку Microsoft Visual Basic Extensible.
Тогда можно удалять все модули из проекта активного документа кодом из шаблона Normal. К сожалению, сейчас опаздываю на поезд, нет времени код писать, вот что-то начал, нужно только доработать:
Код:
Sub DeleteModule()
    Set myProject = ActiveDocument.VBProject
    For i = 2 To ActiveDocument.VBProject.VBComponents.Count
    Set VBComp = myProject.VBComponents(i)
    myProject.VBComponents.Remove VBComp
    Next i
End Sub
Если имя процедуры (макроса) знаете, то можно удалить только его в модуле
Android & Linux

Последний раз редактировалось CaptainNemo; 03.07.2009 в 17:21.
CaptainNemo вне форума Ответить с цитированием
Старый 03.07.2009, 17:24   #3
Николай IV
 
Регистрация: 03.07.2009
Сообщений: 8
По умолчанию

Спасибо,CaptainNemo. Есть еще уточнение: не в каждом документе есть макрос, и желательно сначала проверить наличие, чтобы не получать сообщение об ошибке. А имя пусть будет простое - AutoOpen. И ещё вопрос: а где искать настройки Office ? В Word (2003) или где ещё ? Я пользователь (ну, чуть продвинутый ), а не программист (очень давно знакомился с Basic), поэтому далеко не все опции ворда и офиса знаю.

Последний раз редактировалось Николай IV; 03.07.2009 в 17:41.
Николай IV вне форума Ответить с цитированием
Старый 04.07.2009, 09:10   #4
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Николай, настройки разрешения доступа можно установить здесь: Сервис - Макрос - Безопасность - вкладка Надежные издатели - установите флажок на параметре "Доверять доступ к Visual Basic Project".
Ссылку на библиотеку надо подключить из редактора Visual Basic: меню Tools - Referenses - флажок поставьте на Microsoft Visual Basic 6.0 Extensibility.
akokin вне форума Ответить с цитированием
Старый 04.07.2009, 09:55   #5
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Вот обнаружил подходящий код макроса для целей Николая (на форуме microsoft.public.word.vba.general). Исправил тип переменных, так как иначе выдавало ошибку, и описал каждое действие макроса (скорее для себя, пока разбирался с кодом):
Код:
Sub removeMacro()
'Удаление конкретного макроса
Dim aMdl As Variant
Dim aPrj As Variant
Dim lLin As Long
Dim lLin2Del As Long
Dim strSub2Del As String
On Error Resume Next
'Вводим имя макроса
strSub2Del = "AutoOpen"
'Присваиваем переменной имя конкретного проекта (в данном случае это проект "Normal")
Set aPrj = Application.VBE.VBProjects("Normal")
'Присваиваем переменной имя конкретного модуля, содержащего удаляемый макрос (например, "Module1")
Set aMdl = aPrj.VBComponents("Module1")
'Процедура удаления макроса из кода модуля
With aMdl.CodeModule
'метод ProcBodyLine возвращает первую строку конкретной процедуры _ 
      как номер строки (число) (например, строка Sub может _
      находиться на 3-й строке в модуле, значит возвращено будет 3)
   iLin = .ProcBodyLine(strSub2Del, vbext_pk_Proc)
'метод ProcCountLines возвращает количество строк в конкретной процедуре
   iLin2Del = .ProcCountLines(strSub2Del, vbext_pk_Proc)
'собственно удаление строк кода макроса
   .DeleteLines iLin, iLin2Del - 1
End With
End Sub
Если такого макроса нет в проекте или модуле, то ничего не произойдет. Формально, конечно, должна быть выдана ошибка, но я поставил подавление ошибок, поэтому пользователь ничего и не заметит.
Хотя, наверное, надо по умному задавать условия.

Последний раз редактировалось akokin; 04.07.2009 в 11:09.
akokin вне форума Ответить с цитированием
Старый 06.07.2009, 16:26   #6
Николай IV
 
Регистрация: 03.07.2009
Сообщений: 8
По умолчанию

Антон, признателен за поддержку. Увы - пока не работает ...
Николай IV вне форума Ответить с цитированием
Старый 06.07.2009, 16:41   #7
Николай IV
 
Регистрация: 03.07.2009
Сообщений: 8
По умолчанию

Уважаемый CaptainNemo - ваш макрос сработал. AutoOpen из файла удалился. Спасибо, буду дальше шевелить мозгами, как прикрутить так, как мне надо .
Николай IV вне форума Ответить с цитированием
Старый 07.07.2009, 10:39   #8
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Цитата:
Сообщение от Николай IV Посмотреть сообщение
Антон, признателен за поддержку. Увы - пока не работает ...
Николай, могу предложить способ получения имени проекта из активного документа (добавлен в код новая переменная). Попробуйте такой код:
Код:
Sub removeModule2()
'Удаление конкретного макроса при сохранении документа под другим именем
Dim aMdl As Variant
Dim aPrj As Variant
Dim lLin As Long
Dim lLin2Del As Long
Dim strSub2Del As String
Dim oDlg As Dialog
Set oDlg = Dialogs(wdDialogFileSaveAs)
On Error Resume Next
Dim oPrj As String

'Получаем имя проекта
oPrj = ActiveDocument.VBProject.Name

'Открываем окно "Сохранить как"
oDlg.Show
'Вводим имя макроса
strSub2Del = "AutoOpen"
'Присваиваем переменной имя полученного проекта
Set aPrj = Application.VBE.VBProjects(oPrj)
'Присваиваем переменной имя конкретного модуля, содержащего удаляемый макрос (например, "Module1")
Set aMdl = aPrj.VBComponents("Module1")
'Процедура удаления макроса из кода модуля
With aMdl.CodeModule
   'метод ProcBodyLine возвращает первую строку конкретной процедуры как номер строки (число) _
   (например, строка Sub может находиться на 3-й строке в модуле, значит возвращено будет 3)
   iLin = .ProcBodyLine(strSub2Del, vbext_pk_Proc)
   'метод ProcCountLines возвращает количество строк в конкретной процедуре
   iLin2Del = .ProcCountLines(strSub2Del, vbext_pk_Proc)
   'собственно удаление строк кода макроса
   .DeleteLines iLin, iLin2Del - 1
End With
End Sub
akokin вне форума Ответить с цитированием
Старый 07.07.2009, 15:22   #9
Николай IV
 
Регистрация: 03.07.2009
Сообщений: 8
По умолчанию

Увы, увы, увы ... Не идёт пока ваш макрос, Антон
Николай IV вне форума Ответить с цитированием
Старый 08.07.2009, 08:53   #10
akokin
Пользователь
 
Регистрация: 02.08.2008
Сообщений: 94
По умолчанию

Цитата:
Сообщение от Николай IV Посмотреть сообщение
Увы, увы, увы ... Не идёт пока ваш макрос, Антон
Николай, а что именно происходит? Что сообщает или вообще молчит? Попробуйте закомментировать строку
Код:
On Error Resume Next
и сообщите, какую ошибку выдает.
akokin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как прописать событие на открытие документа? Cadaver Microsoft Office Excel 14 17.04.2009 07:30
Как программно удалить компонент от формы или другого компонента (контейнера)? SkAndrew Общие вопросы Delphi 3 27.05.2008 15:20
Подскажите как программно удалить все записи Worms БД в Delphi 3 04.03.2008 16:30
Как создать универсальный шаблон документа? CoolMan Microsoft Office Word 1 18.12.2007 09:10
как удалить анти вирус( касперский 2006)если она не работает и ее не возможно удалить Alar Общие вопросы Delphi 0 29.10.2006 21:36