变量未定义的错误Enigma

时间:2017-01-19 19:15:06

标签: excel vba excel-vba powerpoint powerpoint-vba

我正在尝试从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的变量。有谁知道为什么会发生这种情况或是否是一个常见的错误?

1 个答案:

答案 0 :(得分:8)

  

这是一个PowerPoint常量,我正在使用后期绑定。但它完成了很多次。

然后你后期绑定。

将自己置身于VBA的鞋子中:您正在编译该项目,并且您遇到ppAlignCenter作为令牌/标识符。如果启用了Option Explicit应该!),并且未引用PowerPoint对象库,则ppAlignCenter是未声明的变量,并且您没有&#39}不知道该怎么做 - 所以你把手放在空中并向用户尖叫:

  

编译错误:未定义变量。

如果未启用Option Explicit,并且未引用PowerPoint,则您"声明"一个未初始化的Variant变量,名为ppAlignCenter,可以编译MyTextBox.ParagraphFormat.Alignment

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

现在,如果PowerPoint库引用(早期绑定),那么ppAlignCenter会解析为PpParagraphAlignment.ppAlignCenter枚举值,您知道它实际上只是{{1}所以你可以继续编译。

2枚举是在PowerPoint类型库中定义的,因此如果您对该库进行后期绑定,则无法通过名称引用其成员,因为VBA将尝试在编译时 - 并没有这样做。

所以不要这样:

PpParagraphAlignment

你需要这样做:

.ParagraphFormat.Alignment = ppAlignCenter

但是为什么你会迟到绑定到你知道的类型库,你需要让程序甚至希望在运行时工作?

延迟绑定意味着您正在使用.ParagraphFormat.Alignment = 2 'ppAlignCenter 变量而不是特定类型 - 这意味着运行时接口查找以及您根本不需要的大量开销 ...如果库不存在,这些查找无论如何都会失败。更不用说,针对Object进行编程意味着您无法获得 IntelliSense ,并需要对您正在执行的所有操作进行四重检查,因为编译器不会运行如果你打错了,可以帮助你,运行时会尖叫。

...说,早期引用的引用是特定于版本的 - 所以如果您将代码分发给运行您所引用的库的不同版本的用户,则后期绑定将确保一切正常适用于所有人(假设您的代码不是使用特定于版本的API功能)。在这种情况下,最好的折衷方案是使用早期绑定引用 develop (这样你就可以获得 IntelliSense 和自动完成!),然后在分发时将所有内容切换到后期绑定它