Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщений [ 10 ]
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Тема: Как проверить имя макроса?
Какие есть варианты по теме?
Т.е. какими способами можно проверить ошибочность имени макроса до его выполнения командой:
Application.Run "MyProject.MyModule.MyProcedure".
Получить список макросов можно только через CodeModule?
Макросы под заказ и готовый пакет - mtdmacro.ru
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
Re: Как проверить имя макроса?
Я вот тоже задумывался над этим. Пришёл к такому варианту получения имён макросов, которые можно запустить, в виде массива:
Public Function GetProceduresNames(vbc As VBComponent) As Variant
Dim myMatch As Object
Dim myMatches As Object
Dim myRegExp As Object
Dim i As Integer, s As String
Set myRegExp = CreateObject("VBScript.RegExp")
With myRegExp
.Pattern = "\bSub\b(.*)\(\)"
.MultiLine = True
.Global = True
End With
Set myMatches = myRegExp.Execute(vbc.CodeModule.Lines(1, vbc.CodeModule.CountOfLines))
For Each myMatch In myMatches
For i = 1 To myMatch.SubMatches.count
s = s & vbc.Name & "." & Trim(myMatch.SubMatches(i - 1)) & "###"
Next
Next
If Len(s) > 0 Then s = Left(s, Len(s) - 3)
GetProceduresNames = Split(s, "###")
Set myMatch = Nothing
Set myMatches = Nothing
Set myRegExp = Nothing
End Function
Лучше день потерять — потом за пять минут долететь!
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Как проверить имя макроса?
viter.alex пишет:...задумывался над этим...
Спасибо. Интересный вариант, но по сути та же обработка текста модуля.
Но, ведь где-то Word хранит коллекцию макросов-команд. Например, Word вываливает ошибку 5941 "Запрашиваемый номер семейства не существует" при попытке выполнения кода:
KeysBoundTo KeyCategory:=wdKeyCategoryMacro, Command:="..."
Кстати, таким извращенным способом можно проверить правильность команды.
Макросы под заказ и готовый пакет - mtdmacro.ru
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
Re: Как проверить имя макроса?
Ты знаешь, я думаю, что сам Word читает имена макросов из бинарного кода файла. Пример, описан сдесь. но он на C++.
На всякий случай, описание формата doc.
Как обстоит дело в случае с XML, я не знаю
Лучше день потерять — потом за пять минут долететь!
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Как проверить имя макроса?
viter.alex пишет:...Пришёл к такому варианту получения имён макросов...
Твой вариант не совсем корректный. Например, он вернет как макрос строку кода:
Sub A(A as Byte) ' Sub B()
Хотя такое чудо вряд ли кто напишет. К тому же, он хватает и Private-макросы, а мне нужен был список Alt+F8. Хотя для свойства OnAction подойдет и Private.
Мой вариант:
Public Function Macro_NamesList( _
Optional ByRef SourceVBProject As VBIDE.VBProject = Nothing, _
Optional ByRef ComponentType As VBIDE.vbext_ComponentType = -1, _
Optional ByRef CommandsOnly As Boolean = False) As String
' создание списка макросов активных документов
' SourceVBProject - проект выборки (не задан - все)
' ComponentType - тип модулей выборки (<0 - все)
' CommandsOnly - выборка только команд (список Alt+F8)
' возвращает строку имен макросов разделенных символом vbLf,
' где формат имен: "Проект.Модуль.Макрос"
Macro_NamesList = ""
'On Error Resume Next ' тест
' все проекты
If SourceVBProject Is Nothing Then
For Each SourceVBProject In VBE.VBProjects
GoSub sub_Project
Next SourceVBProject
' заданный проект
Else
GoSub sub_Project
End If
Exit Function
sub_Project: ' выборка из проекта SourceVBProject
With SourceVBProject
' защищенный проект
If .Protection <> VBIDE.vbext_pp_none Then Return
' пустой проект
If .VBComponents.count <= 0 Then Return
' перебор модулей проекта
Dim myComponent As VBIDE.VBComponent
For Each myComponent In .VBComponents
GoSub sub_Component
Next myComponent
End With
Return
sub_Component: ' выборка из модуля myComponent
' тип модуля
If ComponentType < 0 Then
ElseIf myComponent.Type <> ComponentType Then
Return
End If
' командный модуль
If CommandsOnly Then
Select Case myComponent.Type
Case vbext_ct_StdModule
Case vbext_ct_Document
Case Else: Return
End Select
End If
' код модуля
Dim myCode As VBIDE.CodeModule
Dim strMacro As String
Dim iLine&
Set myCode = myComponent.CodeModule
' перебор макросов модуля
For iLine = myCode.CountOfDeclarationLines + 1 To myCode.CountOfLines
' имя макроса
strMacro = myCode.ProcOfLine(Line:=iLine, ProcKind:=vbext_pk_Proc)
' пропуск кода макроса
iLine = iLine + _
myCode.ProcCountLines(ProcName:=strMacro, _
ProcKind:=vbext_pk_Proc)
GoSub sub_Macro
Next iLine
Return
sub_Macro: ' выборка макроса strMacro
If Len(strMacro) <= 0 Then Return
' команда
If CommandsOnly Then
Dim strBodyLine$
strBodyLine = myCode.Lines(myCode.ProcBodyLine(strMacro, vbext_pk_Proc), 1)
If strBodyLine Like "Sub " & strMacro & "()*" Then
ElseIf strBodyLine Like "Public Sub " & strMacro & "()*" Then
ElseIf strBodyLine Like "Static Sub " & strMacro & "()*" Then
ElseIf strBodyLine Like "Public Static Sub " & strMacro & "()*" Then
Else
Return
End If
End If
' сохраняем
If Len(Macro_NamesList) > 0 Then Macro_NamesList = Macro_NamesList & vbLf
Macro_NamesList = Macro_NamesList & _
SourceVBProject.Name & "." & myComponent.Name & "." & strMacro
Return
End Function
Макросы под заказ и готовый пакет - mtdmacro.ru
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
Re: Как проверить имя макроса?
Тоже не совсем корректно работает. Выбирает процедуры, даже если стоит строка Option Private Module, т.е. процедуры доступны только для модулей внутри проекта и в списке по Alt+F8 не отображаются.
Лучше день потерять — потом за пять минут долететь!
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Как проверить имя макроса?
Да, самому все учесть трудно. Потому я и искал встроенные средства, а то приходится свой миникомпилятор писать
Многие данные в Word можно считывать из встроенных диалогов без их открытия. Наверно и список Alt+F8 (Dialogs(wdDialogToolsMacro)) можно считать, надо только знать имя аргумента. В документации есть список "Built-in Dialog Box Argument Lists", но он не полный.
Макросы под заказ и готовый пакет - mtdmacro.ru
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
Re: Как проверить имя макроса?
внешняя ссылка
внешняя ссылка
пока только это нашел в инете..
внешняя ссылка
внешняя ссылка
внешняя ссылка
поскидываю еще то, что найду, сюда, может пригодятся ссылки
wdDialogToolsMacro
Name, Run, Edit, Show, Delete, Rename, Description, NewName, SetDesc
список именно такой?
Отредактировано andrkar (05.07.2010 17:50:00)
- viter.alex
- Модератор
- Неактивен
- Откуда: Харьков, Украина
- Зарегистрирован: 21.12.2009
- Сообщений: 884
- Поблагодарили: 140
Re: Как проверить имя макроса?
В новом формате файлов имена макросов можно получить, если разобрать файл vbaData.xml
Вот так он выглядит у меня для Normal.dotm, если привести его к удобочитаемому виду, а не в одну строчку:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wne:vbaSuppData xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
<wne:mcds>
<wne:mcd wne:macroName="NORMAL.THISDOCUMENT.OPENCOPYPRINTDELETE"
wne:name="Normal.ThisDocument.OpenCopyPrintDelete"
wne:bEncrypt="00"
wne:cmg="56"/>
<wne:mcd wne:macroName="NORMAL.NEWMACROS.MYRESTARTNUMBERING"
wne:name="Normal.NewMacros.MyRestartNumbering"
wne:bEncrypt="00"
wne:cmg="56"/>
<wne:mcd wne:macroName="NORMAL.NEWMACROS.WHOLETABLEBORDERS"
wne:name="Normal.NewMacros.WholeTableBorders"
wne:bEncrypt="00"
wne:cmg="56"/>
<wne:mcd wne:macroName="NORMAL.NEWMACROS.SAVETOFILES"
wne:name="Normal.NewMacros.SaveToFiles"
wne:bEncrypt="00"
wne:cmg="56"/>
<wne:mcd wne:macroName="NORMAL.THISDOCUMENT.CELLALIGNDECIMAL"
wne:name="Normal.ThisDocument.CellAlignDecimal"
wne:bEncrypt="00"
wne:cmg="56"/>
<wne:mcd wne:macroName="NORMAL.THISDOCUMENT.FILEPRINT"
wne:name="Normal.ThisDocument.FilePrint"
wne:bEncrypt="00"
wne:cmg="56"/>
</wne:mcds>
</wne:vbaSuppData>
Лучше день потерять — потом за пять минут долететь!
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Как проверить имя макроса?
andrkar пишет:...список именно такой?...
Да, это список аргументов из документации к VBA.
Список имен всех макросов можно получить с помощью макроса приведенного мной выше.
Для проверки команд я написал две функции. Обе медленные. Первая работает. Вторую писал по мотивам статьи в Интернете, но она работает как-то через раз.
Public Function Macro_CommandValidate( _
ByVal CommandName As String) As Boolean
' возвращает True, если доступен макрос-команда CommandName
Macro_CommandValidate = False
On Error Resume Next
Dim K As KeysBoundTo
Set K = KeysBoundTo(KeyCategory:=Word.wdKeyCategoryMacro, _
Command:=CommandName)
If Err.Number = 0 Then Macro_CommandValidate = True
End Function
Public Function Macro_CommandValidate2( _
ByVal CommandName As String) As Boolean
' возвращает True, если доступен макрос-команда CommandName
Macro_CommandValidate2 = False
With Dialogs(Word.wdDialogToolsMacro)
' Name, Run, Edit, Show, Delete, Rename, Description, NewName, SetDesc
.Name = CommandName
.Run = False
On Error Resume Next
.Execute
If Err.Number = 0 Then Macro_CommandValidate2 = True
End With
End Function
Макросы под заказ и готовый пакет - mtdmacro.ru
Сообщений [ 10 ]
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как проверить имя макроса?
В век Интернета разобраться в чем-либо стало одновременно и проще и сложней. Как это? Сейчас поясним на примере. На портале о Microsoft Office Word вы узнаете про: office 2007 статистика символов.
Давайте возьмем, допустим, мощнейший редактор текста, всем хорошо известный и почти каждым используемый Microsoft Word. На портале о Microsoft Office Word вы узнаете про: как в верде сделать рамку.
Казалось бы, о нем мы знаем все, он как супруг, с которым прожили много лет. Но, как человека нельзя изучить на 100 %, так и эта программа таит в себя множество скрытых функций и возможностей. Наш сайт о Microsoft Office Word даст ответ про: какой антоним будет слову брегданс.
Часто человек и не задумывается о них, пока вдруг не понадобятся. И вот тут-то все просто и сложно, потому что информации в Интернете масса, но ее еще надо найти и отсортировать. На портале о Microsoft Office Word вы узнаете про: word формулы ошибка источник ссылки не найден..
Впрочем, если вы обратитесь на форум Ворд Эксперт, просеивать песок в поисках золотых крупиц не придется. На портале о Microsoft Office Word вы узнаете про: создание стиля.
И работать с Word по-старинке тоже. На нашем сайте собрана вся необходимая информация, ссылки на литературу, вопросы, которые тревожат пользователей довольно часто. На портале о Microsoft Office Word вы узнаете про: по какому краю надо выбрать выравнивание текста.
Настройкам различных версий программы и форматированию, редактированию текстов посвящен целый раздел. Наш сайт о Microsoft Office Word даст ответ про: набирает текст в ворде после пробела.
В другом разделе вас научат, как автоматизировать работу, в третьем предложат готовые решения (написанные другими пользователями макросы, схемы и так далее). Наш сайт о Microsoft Office Word даст ответ про: как создать макрос в excel 2007.
Наконец, если вы все-таки не нашли то, что необходимо вам в данный момент, можете оставить заявку.
Потратив несколько минут на чтение форума сайта Ворд Эксперт, вы сэкономите гораздо больше времени. На портале о Microsoft Office Word вы узнаете про: вставка документа в word 2007.