Переменная Не Определена Ошибка 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 ответ:
это постоянная PowerPoint, и я использую позднюю привязку. Но это прекрасно работало много раз.
Тогда Вы были не поздним связыванием.
Поставьте себя на место VBA: вы компилируете этот проект, и вы сталкиваетесь с
ppAlignCenter
как токен/идентификатор. ЕслиOption Explicit
включен (он должен !), и на библиотеку объектов PowerPoint не ссылаются, тоppAlignCenter
является необъявленной переменной, и вы не знаете, что с ней делать - поэтому вы поднимите руки в воздух и крикните пользователю:Ошибка компиляции: переменная не определена.
Если
Option Explicit
не включен, и на PowerPoint нет ссылок, то вы "объявляете" неинициализированную переменнуюVariant
на месте с именемppAlignCenter
, так что назначениеMyTextBox.ParagraphFormat.Alignment
может быть скомпилировано.Поскольку переменная не инициализирована, во время выполнения ее значение будет просто
Теперь, если библиотека PowerPoint является ссылочной (с ранней привязкой), то0
- и оттуда не ясно, что произойдет, потому что PpParagraphAlignment не имеет члена со значением0
, поэтому возможно, что назначениеMyTextBox.ParagraphFormat.Alignment
также вызывает ошибку времени выполнения, но это полностью зависит от реализации свойстваAlignment
.ppAlignCenter
разрешается в тоPpParagraphAlignment.ppAlignCenter
значение enum, которое, как вы знаете, на самом деле является просто2
, и поэтому вы можете приступить к компиляции.
Перечисление
PpParagraphAlignment
определено в библиотеке типов PowerPoint, поэтому, если вы поздно привязываетесь к этому библиотека, вы не можете ссылаться на ее членов по имени, потому что VBA попытается разрешить их во время компиляции - и не сможет этого сделать.Так что вместо этого:
.ParagraphFormat.Alignment = ppAlignCenter
Вам нужно сделать следующее:
.ParagraphFormat.Alignment = 2 'ppAlignCenter
Но зачем вам поздно привязываться к библиотеке типов, которую вы знаете Вам все равно нужно иметь, чтобы программа даже надеялась работать во время выполнения?
Поздняя привязка означает, что вы работаете с переменными
Object
вместо конкретных типов-и это означает время выполнения поиск интерфейса и довольно много накладных расходов , которые вам вообще не нужны... и эти поиски будут провалены в любом случае, если библиотека не будет присутствовать. Не говоря уже о том, что программирование противObject
означает, что вы не получаете IntelliSense и должны вчетверо проверять все, что вы делаете, потому что компилятор не поможет вам, и среда выполнения будет кричать, если вы сделаете опечатку....тем не менее, ссылки с ранней привязкой зависят от версии - поэтому, если вы распространяете свой код для пользователей, работающих с разными версиями библиотек, на которые вы ссылаетесь, поздняя привязка гарантирует, что все работает для всех (при условии, что ваш код не использует функции API, зависящие от версии). В этом случае лучшим компромиссом является разработка с ранними ссылками (таким образом, вы получаете IntelliSense и автозаполнение!), а затем переключите все на late-bound, когда будете распространять его.