Переменная Не Определена Ошибка Enigma


Я пытаюсь автоматизировать PowerPoint из Excel. Все работало отлично. У меня есть следующий кодовый блок, который отлично работал:

Set MyTextbox = mySlide.Shapes.AddTextbox(1, Left:=myShape.Left - 3, Top:=42, Width:=myShape.Width + 6, Height:=10).TextFrame.TextRange
With MyTextbox
    .Text = Format(MyShapeDate, "m/yy")
    .Font.Size = 11
    .ParagraphFormat.Alignment = ppAlignCenter
    .Font.Bold = True
End With

Я сохранил код как дополнение и попытался добавить новую вкладку и кнопку, безуспешно. Поэтому я вернул код в рабочую тетрадь. Когда я попытался запустить его снова, я получил переменную, не определенную для ppAlignCenter. Кто-нибудь знает, почему это происходит, или если это распространенная ошибка?

1 2

1 ответ:

это постоянная PowerPoint, и я использую позднюю привязку. Но это прекрасно работало много раз.

Тогда Вы были не поздним связыванием.

Поставьте себя на место VBA: вы компилируете этот проект, и вы сталкиваетесь с ppAlignCenter как токен/идентификатор. Если Option Explicit включен (он должен !), и на библиотеку объектов PowerPoint не ссылаются, то ppAlignCenter является необъявленной переменной, и вы не знаете, что с ней делать - поэтому вы поднимите руки в воздух и крикните пользователю:

Ошибка компиляции: переменная не определена.

Если Option Explicit не включен, и на PowerPoint нет ссылок, то вы "объявляете" неинициализированную переменную Variant на месте с именем ppAlignCenter, так что назначение MyTextBox.ParagraphFormat.Alignment может быть скомпилировано.

Поскольку переменная не инициализирована, во время выполнения ее значение будет просто 0 - и оттуда не ясно, что произойдет, потому что PpParagraphAlignment не имеет члена со значением 0, поэтому возможно, что назначение MyTextBox.ParagraphFormat.Alignment также вызывает ошибку времени выполнения, но это полностью зависит от реализации свойства Alignment.

Теперь, если библиотека PowerPoint является ссылочной (с ранней привязкой), то ppAlignCenter разрешается в то PpParagraphAlignment.ppAlignCenter значение enum, которое, как вы знаете, на самом деле является просто 2, и поэтому вы можете приступить к компиляции.

Перечисление PpParagraphAlignment определено в библиотеке типов PowerPoint, поэтому, если вы поздно привязываетесь к этому библиотека, вы не можете ссылаться на ее членов по имени, потому что VBA попытается разрешить их во время компиляции - и не сможет этого сделать.

Так что вместо этого:

.ParagraphFormat.Alignment = ppAlignCenter

Вам нужно сделать следующее:

.ParagraphFormat.Alignment = 2 'ppAlignCenter

Но зачем вам поздно привязываться к библиотеке типов, которую вы знаете Вам все равно нужно иметь, чтобы программа даже надеялась работать во время выполнения?

Поздняя привязка означает, что вы работаете с переменными Object вместо конкретных типов-и это означает время выполнения поиск интерфейса и довольно много накладных расходов , которые вам вообще не нужны... и эти поиски будут провалены в любом случае, если библиотека не будет присутствовать. Не говоря уже о том, что программирование против Object означает, что вы не получаете IntelliSense и должны вчетверо проверять все, что вы делаете, потому что компилятор не поможет вам, и среда выполнения будет кричать, если вы сделаете опечатку.

...тем не менее, ссылки с ранней привязкой зависят от версии - поэтому, если вы распространяете свой код для пользователей, работающих с разными версиями библиотек, на которые вы ссылаетесь, поздняя привязка гарантирует, что все работает для всех (при условии, что ваш код не использует функции API, зависящие от версии). В этом случае лучшим компромиссом является разработка с ранними ссылками (таким образом, вы получаете IntelliSense и автозаполнение!), а затем переключите все на late-bound, когда будете распространять его.