在 Excel 中,如何在不切换焦点的情况下更改活动的 PowerPoint 演示文稿?

From within Excel how do I change an active PowerPoint presentation without switching focus?

我使用宏将对象从 Excel 导出到 PowerPoint。我可以选择要导出到哪个当前打开的演示文稿。但是,当我切换演示文稿时,有没有办法阻止焦点从 Excel 切换到 PowerPoint?我的代码如下:

Function SetActivePresentation(Filename As String) As Boolean

    Dim i As Integer

    ' This just checks if PowerPoint is loaded - not needed for the question
    If Me.Load = False Then
        SetActivePresentation = False
    End If

    ' Loop through the PowerPoint windows
    For i = 1 To Me.pPowerpoint.Windows.Count
        If Me.pPowerpoint.Windows(i).Presentation.name = Filename Then
            Me.pPowerpoint.Windows(i).Activate
            Exit For
        End If
    Next i

    SetActivePresentation = True

End Function

这是class中的pPowerPoint方法:

Public pPowerpoint As Object

Public Property Get PowerPoint() As Object
    PowerPoint = pPowerpoint
End Property

最后是我的加载函数:

Function Load() As Boolean

    On Error Resume Next

    ' Set the PowerPoint object
    Set pPowerpoint = GetObject(Class:="PowerPoint.Application")

    ' Handle if the PowerPoint Application is not found
    If Err.Number = 429 Then
        GoTo ErrorHandler
    End If

    Load = True

    Exit Function

ErrorHandler:

    Load = False

End Function

然后从我代码的其他地方,我可以通过以这种方式 For Each slide In PowerPoint.pPowerpoint.ActivePresentation.Slides 遍历 PowerPoint 幻灯片来导出 Excel 个对象,其中 PowerPoint 是我的 PowerPoint class 引用以上。

有点令人困惑。.在不切换焦点的情况下更改活动的 PowerPoint 演示文稿..。但是从问题评论的讨论来看,真正的问题是 export Excel objects without focus on Powerpoint。要解决这个问题,您可以避免使用 ActivePresentation 对象。如何?一种简单的解决方案是使用全局变量..

下面的代码显示了它是如何完成的..

'Global variables
Dim pptPres As PowerPoint.Presentation
Dim pptSlide As PowerPoint.Slide

'searching for presentation (function/sub)
For i = 1 To Me.pPowerpoint.Windows.Count
    If Me.pPowerpoint.Windows(i).Presentation.name = Filename Then
        'dont activate! Me.pPowerpoint.Windows(i).Activate
        Set pptPres = Me.pPowerpoint.Windows(i).Presentation
        Exit For
    End If
Next i

'copy object "Char 1" at "Sheet1"
'by accessing the global variable (other function/sub)
Set objChart = Worksheets("Sheet1").ChartObjects("Chart 1").Chart
objChart.ChartArea.Copy
Set pptSlide = pptPres.Slides.Add(1, ppLayoutBlank)
pptSlide.Shapes.Paste