【问题标题】:Using Excel VBA to change PowerPoint Slide Size - Late Binding使用 Excel VBA 更改 PowerPoint 幻灯片大小 - 后期装订
【发布时间】:2015-04-23 20:02:17
【问题描述】:

我是 VBA 的新手,也是 StackOverflow 的新手,所以请原谅任何违反礼仪的行为。我有一个使用 Excel VBA 创建工具的项目,该工具将允许用户识别源 Excel 文件,然后将 Excel 文件中每个工作表的打印区域复制到新创建的 PowerPoint 演示文稿中的幻灯片中。我必须使用后期绑定,因为我不能假设该工具的用户都将使用相同版本的 Microsoft Office 产品,或者他们将启用对 PowerPoint 对象库的引用。我已经设法做到了这一切。当我尝试设置幻灯片的大小时,我被挂断了 - 有人要求我将幻灯片的大小设为 PowerPoint 2013 中可用的 4:3 幻灯片大小(或者如果需要使该工具正常工作,则为类似的比例在旧版本的 PowerPoint 中 - 我一直在尝试 ppSlideSizeLetterPaper)。这是抛出“运行时错误'438':对象不支持此属性或方法”。如果有人能就如何解决这个问题提供建议,我将不胜感激。

下面是相关的sn-ps代码:

Public PowerPointApp As Object
Public TargetFile As Object
…
Sub Master()
Set PowerPointApp = CreateObject("PowerPoint.Application")
Err.Clear
If PowerPointApp Is Nothing Then Set PowerPointApp = CreateObject(class:="PowerPoint.Application")
If Err.Number = 429 Then
    MsgBox "PowerPoint could not be found.  Exiting macro."
    Exit Sub
End If
Set TargetFile = PowerPointApp.Presentations.Add
    PowerPointApp.Visible = True
    PowerPointApp.Activate
…<code to add slides and paste data from Excel into the slides>
PowerPointApp.TargetFile.PageSetup.SlideSize = 2    ‘this is where the error is thrown.  2 is the numeric equivalent of ppSlideSizeLetterPaper

【问题讨论】:

    标签: excel vba binding powerpoint


    【解决方案1】:

    目标文件在该上下文中未定义 - 应用程序对象上没有调用它的方法或属性。

    因为您已经有一个同名的对象,所以就使用它。

    TargetFile.PageSetup.SlideSize = 2 
    

    【讨论】:

    • 是正确的。应用程序对象没有 TargetFile 属性,这就是您收到错误的原因。此外,我会在您添加演示文稿之后以及在您将任何内容添加到幻灯片之前立即移动设置幻灯片大小的行。否则,调整大小时内容可能会失真。
    • 感谢触发器和史蒂夫。我尝试了 Trigger 的建议(并根据 Steve 的建议重新定位了有问题的代码行),并且效果很好。触发器,我会在测试中尝试这个,但我认为(显然是错误的)我必须引用 PowerPointApp 对象,因为我使用的是后期绑定。我显然不明白后期绑定是如何工作的 - 必须在阅读中做一些事情。
    • 早/晚绑定指的是二进制接口。程序很早就知道跳转到 vtable 中 #5 的地址(对于第 5 种方法)。在后期装订中,这是一次对话。你好对象,你有一个命令叫print,对象回复yes, number 5。然后你的程序说请执行第 5 条命令。对象肯定地说。所以早期绑定是一种具有一级间接性和快速的函数调用。一切都是在编译时解决的。后期绑定很慢,你用半英语与对象交流,你不需要知道对象是什么。
    • 如果 excel 文件和 word 文件都支持print,那么在后期绑定中从它们创建对象并要求它们打印将起作用。如果一个新公司在你的程序发布后发布了一个文字处理器,并且它支持print,那么你的程序将在后期绑定(但不是早期)中使用它。
    • 此外,通常最好连接到文档而不是应用程序。如果您需要应用程序对象,您可以使用 TargetFile.Application.caption 之类的东西,其中目标文件是一个演示对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多