通过Excel VBA更新PowerPoint并保存 *.pptx文件(不是“另存为”)

pdsfdshx  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(163)

我们的目标是,我有两个(Excel和PowerPoint)同时打开。因此,当我运行我的Excel宏时,PowerPoint应该被更新并保存在同一个文件中-没有重新打开,然后出现某种X1 M0 N1 X...
我知道/假设我的问题的解决方案在于Set oPresentation = appPPT.Presentations.Open(sPPTfile, msoFalse)-Presentations.Open-方法。但我不知道如何克服这个问题。我没发现什么合适的。
所以这里我的代码和许多感谢您的提示和意见提前。

Sub openPPT()
   
    Dim appPPT As PowerPoint.Application
    Dim slide As PowerPoint.Slide
    Dim oPresentation As PowerPoint.Presentation
    Dim txtFeld(12) As PowerPoint.Shape
    Dim sPPTfile As String
    Dim wkb As Workbook
    Dim wks As Worksheet
    
    On Error GoTo err
    
    Set wkb = ThisWorkbook
    Set wks = wkb.Worksheets(1) 
    Set appPPT = New PowerPoint.Application 

    sPPTfile = "C:\Users\xxx\TestPowerPoint.pptx" 
    appPPT.Visible = True
    ' here is the Presentations.Open method which causes probably my issue
    Set oPresentation = appPPT.Presentations.Open(sPPTfile, msoFalse)
    Set slide = appPPT.ActivePresentation.Slides(3)
    slide.Shapes("Rectangle 32").TextFrame.TextRange.Text = Tabelle1.Range("E10")
    ' in the following two lines of code an error message arises in Excel
    oPresentation.Save 
    ' appPPT.ActivePresentation.Save  ' ed2 suggested this line of code
   

    err:
    If err.Number <> 0 Then
        MsgBox err.Number & vbCrLf & err.Description
    End If

    Set slide = Nothing: Set appPPT = Nothing: Set oPresentation = Nothing

End Sub

Edit_1:错误消息
当使用oPresentation.SaveappPPT.ActivePresentation.Save(ed 2建议)时,会出现以下错误消息。
在此forum上,用户也质疑此“错误编号= -2147467259”,但此错误消息不存在于推荐列表中...也许这也是一种暗示?!

Edit_2:当使用FunThomas的建议代码时,也会出现错误消息。这次不是在Excel中,而是在Excel VBA中(见屏幕截图),它是由oPresentation.Save引起的。

Edit_3及解决方案:FunThomas代码也失败的问题是由文件命名引起的。

If oPresentation.FullName = sPPTfile Then行的代码从来不是True,因为

  • oPresentation.FullName是https://xxx/TestPowerPoint.pptx和
  • sPPTfile是C:\Users\xxx\TestPowerPoint.pptx

所以当你

  • 从资源管理器中复制您的文件路径,您将获得 *C:\Users\xxx\TestPowerPoint.pptx *
  • 右键单击文件(在资源管理器中)并选择 * 复制链接 * 你会得到一些疯狂的https://xxx/...材料
  • 运行代码并从oPresentation.FullName中提取正确的名称。这需要一些额外的准备。。但这是值得的- )
dly7yett

dly7yett1#

据我所知,您正在多次执行此代码。问题是你每次都打开一个新的Powerpoint示例(看看Windows任务管理器),在每个示例中,你都会在另一次打开演示文稿。第一次打开演示文稿时(无论是通过代码还是直接打开),都可以对其进行修改。所有其他示例将以只读模式打开演示文稿。如果您修改它,则需要使用另一个名称保存(创建副本)。
所以你要做的是检查PowerPoint和演示文稿是否已经打开。有一种简单的方法可以做到这一点,但它有一个限制,即它只适用于一个PowerPoint示例。这对大多数情况来说应该足够了。

Sub openPPT()    
    Const sPPTfile = "C:\Users\xxx\TestPowerPoint.pptx"
    Dim appPPT As PowerPoint.Application
    
    On Error Resume Next
    Set appPPT = GetObject(, "PowerPoint.Application")
    On Error GoTo 0
    If appPPT Is Nothing Then
        ' Powerpoint is not yet open.
        Set appPPT = New PowerPoint.Application
    End If
    
    ' Search if presentation is already open
    Dim oPresentation As PowerPoint.Presentation, found As Boolean
    For Each oPresentation In appPPT.Presentations
        If oPresentation.FullName = sPPTfile Then
            found = True
            Exit For
        End If
    Next
    If Not found Then Set oPresentation = appPPT.Presentations.Open(sPPTfile)
    appPPT.Visible = True
    
    (... Now do whatever you want with the presentation...)

    oPresentation.Save
End Sub

(Note:在第一次测试此代码之前,请确保已关闭所有Powerpoint示例。如果您有隐藏的示例正在运行,请使用任务管理器关闭它们)。
如果你真的想处理多个示例,事情会变得更加复杂,你需要找到所有PowerPoint示例,并循环所有这些示例的所有打开的演示文稿。如果您感兴趣,请查看Having multiple Excel instances launched, how can I get the Application Object for all of them?(其中对Excel执行了相同的操作)或http://exceldevelopmentplatform.blogspot.com/2019/01/vba-code-to-get-excel-word-powerpoint.html

相关问题