变量未定义错误之谜

Variable Not Defined Error Enigma

我正在尝试从 Excel 自动化 PowerPoint。一切正常。我有以下完美运行的代码块:

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 定义的变量。有谁知道为什么会发生这种情况,或者这是否是常见错误?

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

那你不是 late-binding。

设身处地地想一想 VBA:您正在编译该项目,并且您遇到 ppAlignCenter 作为 token/identifier。如果 Option Explicit 已打开(它 应该 !),并且未引用 PowerPoint 对象库,则 ppAlignCenter 是一个未声明的变量,您不需要不知道如何处理它 - 所以你举起双手对着用户尖叫:

Compile error: variable not defined.

如果 Option Explicit 未打开且未引用 PowerPoint,则您 "declare" 一个未初始化的 Variant 变量 on-the-spot,名为 ppAlignCenter , 这样 MyTextBox.ParagraphFormat.Alignment 的赋值就可以编译了.

因为变量没有初始化,在运行时它的值将只是 0 - 从那里不清楚会发生什么,因为 PpParagraphAlignment 没有成员值为 0,因此 MyTextBox.ParagraphFormat.Alignment 赋值也可能引发运行时错误,但这完全取决于 Alignment 属性 的实现。

现在,如果 PowerPoint 库 引用 (early-bound),则 ppAlignCenter 解析为您知道的 PpParagraphAlignment.ppAlignCenter 枚举值实际上只是一个2,所以你可以继续编译。


PpParagraphAlignment 枚举是在 PowerPoint 类型库中定义的,因此如果您 late-binding 到该库,则不能按名称引用其成员,因为 VBA将尝试在 compile-time 解决它们 - 但未能解决。

所以不是这个:

.ParagraphFormat.Alignment = ppAlignCenter

您需要这样做:

.ParagraphFormat.Alignment = 2 'ppAlignCenter

但是你为什么要 late-bind 一个你 知道的类型库 你无论如何都需要让程序 希望 在运行时工作?

Late-binding 意味着您正在使用 Object 变量而不是特定类型 - 这意味着运行时接口查找和大量您不需要的开销 完全 ... 如果库不存在,这些查找无论如何都会失败。更不用说,针对 Object 编程意味着您不会获得 IntelliSense 并且需要 quadruple-check 您正在做的一切,因为编译器不会帮助你,如果你打错了,运行时会尖叫。

...也就是说,early-bound 引用是 version-specific - 因此,如果您将代码分发给用户 运行 您引用的库的不同版本,late-binding 将确保每个人都能正常工作(前提是您的代码没有使用 version-specific 的 API 功能)。在那种情况下,最好的折衷方案是 develop 和 early-bound 引用(这样你就得到 IntelliSense 和自动完成!),然后切换所有内容分发到 late-bound。