31/10/2025
При написании макросов, иногда, хочется добавить вызов тех или иных инструментов, либо действий из пунктов меню. Но при записи действий в макрос часть из них игнорируется — не записывается. Как же получить к ним доступ?
Рассмотрим два варианта, которые связаны между собой.
Получение идентификатора действия через событие
Для этого необходимо открыть редактор и перейти в GlobalMacros.gms в модуль ThisMacroStorage.
Справа выбираем создание модуля по событию.
Добавляем строку вывода имени события Debug.Print EventName. Не используйте MsgBox!, а то задолбаетесь его закрывать.
Нам понадобится открыть окно для просмотра вывода сообщений Debug.Print.
Ну и всё! макрос уже работает. Переключаетесь в рабочее окно Корела и щелкаете по выбору инструмента, например, я выбрал инструмент Shape Tool.
Переключаюсь в окно редактора VBA и смотрим, что у нас в окне напечаталось.
У нас есть идентификатор вызова инструмента! Пробуем простой макрос.
Sub callShapeTool() Application.FrameWork.Automation.Invoke "ae9f4ba1-2406-4dbc-b119-c12f9cca17f7" End Sub
Работает! можно переключиться на другой инструмент, вызвать макрос и увидеть, что произошло переключение инструмента.
Большого смысла в вызове этого инструмента нет, но он нам понадобится в дальнейшем.
Получение идентификатора из рабочего пространства
Не все инструменты выведут свой идентификатор, некоторые напишут, что они делают и всё. Как быть в этой ситуации.
В интернете можно найти информацию о том, где находятся все идентификаторы:
C:\Program Files\Corel\CorelDRAW Graphics Suite\**\Draw\UIConfig\DrawUI.xml
Но они там без подробного описания и найти методом перебора, почти, нереально. Поэтому мы пойдем другим путем — через рабочее пространство.
Рассмотрим на примере выхода из режима PowerClip. Поставим сперва задачу.
Задача: Макрос должен определить, в каком режиме активный документ, и если это режим PowerClip, то выйти из режима.
Определяем режим PowerClip.
Sub regimPC()
Dim ly As Layer, name As String
Set ly = ActiveDocument.ActiveLayer
name = ly.name
If name = "PowerClip Contents" Then
' здесь должны быть действия для выхода из режима
End If
End Sub
Сразу замечу, что слой (layer) PowerClip в разных языковых версиях имеет разное название. В моем примере рассматриваем английский корел — «PowerClip Contents». Между прочим, имя слоя PowerClip поменять нельзя.
Режим определили, но как выйти? Смотрим хелп Корела.
Оказывается для выхода мы можем использовать следующий метод:
shape.PowerClip.LeaveEditMode
Но мы не знаем в каком объекте мы находимся. Нам неизвестен наш shape. Но в кореле есть пункт меню выйти из режима PowerClip. Вот им и займемся.
Подготовка к получению идентификатора
У нас есть идентификатор Shape Tool, который мы получили в первой части. Поместим рядом с ним пункт меню выхода из режима PowerClip.
Нажимаем на плюсик внизу нашей панели инструментов.
Выбираем нижний пункт для настройки и попадаем в список всех команд. Здесь выбираем нужное нам меню, где находится наше действие, находим его ниже и перетаскиваем на панель инструментов в раздел Shape Tool.
Теперь сохраняем наше рабочее пространство.
У нас появится файл с расширением cdws. Мой пример: test2025.cdws. Расширение файла надо переименовать в zip. В итоге у вас файл превратится в архив: test2025.zip.
Заходим в архив и извлекаем из папки content (внутри архива) следующий файл: workspace.xml.
Открываем его в текстовом редакторе и ищем идентификатор Shape Tool — ae9f4ba1-2406-4dbc-b119-c12f9cca17f7.
Данный идентификатор будет находиться в файле в нескольких местах. Какое наше?
Когда добавляешь в группу инструментов новый пункт, то при сохранении рабочего пространства, он не выводит их все столбцом, а сдвигает вправо из-за этого лишнего элемента. Вот такой кусок кода и ищем, где два тега <item> в одну строчку.
Итак, мы нашли блок, где есть идентификатор Shape Tool и у него два <item> в одну строку. Какой из них наш?
Тут можно все перепробовать из блока — их не много, но в данном случаем у нас так:
ae9f4ba1-2406-4dbc-b119-c12f9cca17f7 — инструмент Shape Tool
266435b4-6e53-460f-9fa7-f45be187d400 — похоже, разделительная линия
22eabb92-56f4-422d-bae7-16a7341c66b7 — наш идентификатор!
Проверяем.
Sub callShapeTool()
Application.FrameWork.Automation.Invoke "22eabb92-56f4-422d-bae7-16a7341c66b7"
End Sub
Заходим в режим PowerClip и запускаем макрос. Мы вышли из режима, с чем вас и поздравляю. Таким образом, вы можете находить идентификаторы многих пунктов меню и команд, которые потом использовать при вызове метода: Application.FrameWork.Automation.Invoke .
Удалить лишний пункт из меню можно тем же образом через плюсик. Только надо вытащить из меню этот пункт.
Итоговый код:
Sub regimPC()
Dim ly As Layer, name As String
Set ly = ActiveDocument.ActiveLayer
name = ly.name
If name = "PowerClip Contents" Then
Application.FrameWork.Automation.Invoke "22eabb92-56f4-422d-bae7-16a7341c66b7"
End If
End Sub
Комментарии:











