2017-01-19 6 views
2

Я пытаюсь автоматизировать 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

'ppAlignCenter' звучит как константа PowerPoint. У вас все еще есть все необходимые ссылки? – YowE3K

+0

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

+3

Если вы используете позднюю привязку, 'ppAlignCenter' не имеет смысла, если вы не дадите ему значение. – vacip

ответ

8

It is a PowerPoint constant and I am using late binding. But it worked perfectly numerous times.

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

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

Compile error: variable not defined.

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

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

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


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

Таким образом, вместо этого:

.ParagraphFormat.Alignment = ppAlignCenter 

Вы должны сделать это:

.ParagraphFormat.Alignment = 2 'ppAlignCenter 

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

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

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

+0

Отличное объяснение! Постоянное обучение. Делает полный смысл и решает мою проблему. Спасибо! – Brian

+0

RE последний абзац: если вы используете макрос в среде, где все пользователи используют разные версии PowerPoint, распространение поздней версии макроса гарантирует, что все будет работать для всех; ссылка на раннюю ссылку является специфичной для версии. –

+0

Отличное объяснение, @ Mat'sMug ... Я тоже его поддерживаю, но было бы полезно, если бы вы отредактировали ответ, чтобы включить информацию о позднем связывании в ваш комментарий re version-specificity. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^