Отправка команд через VBA

Я пишу скрипт на VBA, который создает рисунок в CorelDraw. У меня проблемы с центрированием текста. Вот код, который правильно работает в редакторе макросов CorelDraw:

Dim s2 As Object
    Dim Txt As Object
    Dim test As String
    Dim returntest As String
    returntest = "Test~Test1234~Test56~Test789"
    test = Replace(returntest, "~", Chr(13))
    Set s2 = CorelApp.ActiveLayer.CreateArtisticText(-7.75, (1 - 0.5) / 2, test)
    Set Txt = s2.Text
    Txt.Story.Font = "Swis721 BT"
    Txt.Story.Size = 20
    Txt.Story.LineSpacing = 75
    Txt.Story.Alignment = cdrCenterAlignment
    s2.Fill.UniformColor.CMYKAssign 0, 0, 0, 100
    s2.Outline.SetNoOutline
    s2.CenterX = s1.CenterX
    s2.CenterY = s1.CenterY

s1 — это просто прямоугольник, который уже определен. Проблема с "cdrCenterAlignment". VBA не распознает его как допустимый аргумент, потому что он ссылается на то, что существует только в CorelDraw. Я получаю «переменная cdrCenterAlignment не определена» или «несоответствие типов», если я называю это строкой. Как, если это вообще возможно, я могу отправить эту команду/аргумент в CorelDraw, продолжая работать в Excel?

Я столкнулся с похожими проблемами при отправке того же чертежа в AutoCAD, но смог обойти это, отправив что-то в командную строку.


person Jonny Kriefall    schedule 14.08.2017    source источник
comment
Связана ли библиотека Corel с проектом Excel VBA (через Инструменты -> Ссылки)?   -  person velblúd    schedule 14.08.2017
comment
^^ это. Сошлитесь на библиотеку CorelDRAW, и константы будут определены, и вы сможете использовать настоящие типы и API CorelDRAW и наслаждаться IntelliSense и автозаполнением вместо того, чтобы работать с интерфейсом Object и постоянно обращаться к документации для того, какие элементы доступны для каких объектов — и иметь дело с ошибкой 438 во время выполнения всякий раз, когда вы делаете опечатку, потому что код с поздней привязкой будет успешно скомпилирован и разрешен только во время выполнения.   -  person Mathieu Guindon    schedule 14.08.2017
comment
Я не связывал их, потому что не знаю, как перенесется эта ссылка, если я отправлю документ на другой компьютер. Остается ли ссылка или ее нужно будет повторно связывать каждый раз, когда она отправляется на другой компьютер?   -  person Jonny Kriefall    schedule 14.08.2017
comment
Ссылка хранится в ссылках проекта, сохраненных вместе с проектом VBA внутри основного документа Office. Нет никаких причин придерживаться позднего связывания, если все ваши пользователи имеют одинаковые версии библиотек, на которые вы ссылаетесь. И если у пользователя нет библиотеки, к которой вы поздно привязываетесь, ваша программа все равно рухнет... разница в том, хотите ли вы, чтобы ваша программа взорвалась во время компиляции (ранее) или при запуске -time (поздно), и заботитесь ли вы об IntelliSense/автозаполнении при создании своей вещи.   -  person Mathieu Guindon    schedule 14.08.2017


Ответы (2)


В своем коде VBA вы можете определить его самостоятельно:

Const cdrCenterAlignment = 3

https://community.coreldraw.com/sdk/api/draw/19/e/cdrAlignment

person Community    schedule 14.08.2017
comment
Спасибо, очень полезный сайт! - person Jonny Kriefall; 14.08.2017

Обратитесь к библиотеке CorelDRAW (Инструменты > Ссылки), и константы будут определены, и вы сможете использовать фактические типы и API CorelDRAW и пользоваться IntelliSense и автозаполнением вместо того, чтобы работать с интерфейсом Object и постоянно обращаться к документации для того, какие элементы доступны. на каких объектах — и иметь дело с ошибкой 438 во время выполнения всякий раз, когда вы делаете опечатку, потому что код с поздней привязкой будет успешно компилироваться и разрешаться только во время выполнения.

Добавление ссылки на библиотеку типов CorelDRAW позволит вам писать код раннего связывания, который разрешается во время компиляции точно так же, как вызовы функций, которые вы делаете для библиотек типов VBA или Excel, которые ссылаются по умолчанию в проекте Excel VBA.

person Mathieu Guindon    schedule 14.08.2017
comment
Я пытался обойти их связывание вручную, потому что цель этого макроса состояла в том, чтобы уменьшить и упростить пользовательский интерфейс. Если я свяжу его с CorelDraw, останется ли ссылка активной, если я отправлю документ на другой компьютер с установленным CorelDraw? Если это так, это значительно упростит мой код и уничтожит любую причину, чтобы попытаться обойти его. - person Jonny Kriefall; 14.08.2017
comment
@JonnyKriefall Это наверняка сработает, если у вас есть такая же версия CorelDraw на другом компьютере. (Возможно, он будет работать и на других версиях, я не знаю, как CorelDraw версии своей библиотеки :)) - person velblúd; 14.08.2017
comment
@JonnyKriefall, если одна и та же версия CorelDRAW установлена ​​на каждом компьютере, на котором выполняется ваш код, не о чем беспокоиться. Если нет, убедитесь, что вы ссылаетесь на самую раннюю версию, которую может использовать любой пользователь, и не должно быть никаких проблем. То же самое со средой выполнения сценариев и любой другой библиотекой, на которую вы могли бы сослаться. - person Mathieu Guindon; 14.08.2017
comment
Спасибо @Mat'sMug и @velblúd! Вы оба были чрезвычайно полезны - person Jonny Kriefall; 14.08.2017