我正在尝试从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
的变量。有谁知道为什么会发生这种情况或是否是一个常见的错误?
答案 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 和自动完成!),然后在分发时将所有内容切换到后期绑定它