当SelectionType = ppSelectionNone时,如何获得Powerpoint中可见幻灯片的SlideIndex

时间:2013-05-20 14:54:54

标签: powerpoint powerpoint-vba

我有一些代码要求我知道要操作的SlideIndex(例如,插入新幻灯片的位置,插入ChartObject的位置等)。大约99%的时间,我可以成功获得SlideIndex

Dim w as Long 'slide index variable
w = ActivePresentation.Windows(1).Selection.SlideRange(1).SlideIndex

另外0.1%的时间,当ActivePresentation.Windows(1).SelectionType = ppSelectionNone时,它会失败,因为(可以理解)它无法获得选择的SlideIndex,因为没有选择。如果用户无意中“选择”了“大纲”窗格中两个幻灯片之间的空间,则可能会发生这种情况。

理想情况下,我想要的是获取幻灯片的SlideIndex属性,该属性在幻灯片窗格中可见:

enter image description here 我目前有一些代码可以测试SelectionType是否ppSelectionNone,所以我可以捕获这个条件,我还没想办法识别幻灯片窗格的slideIndex。

Function GetMySlide()
Dim w as Long
    If Not ActivePresentation.Windows(1).Selection.Type = ppSelectionNone Then

        w = ActivePresentation.Windows(1).Selection.SlideRange(1).SlideIndex
        Set GetMySlide = ActivePresentation.Slides(w)

    Else:

        MsgBox "No slide is currently selected. Please select a slide in the Outline pane in order to proceed.", vbInformation
        Set GetMySlide = Nothing
        Exit Function
    End If
End Function

更新

我的临时解决方案是使用公共变量lastUsedSlide来尝试跟踪最近选择的幻灯片。我可以将此与WindowSelectionChange事件合并,但希望有一个更简单的解决方案。如果我认为此方法总是有效,我会使用它,但是,它可能会引入无法预料的错误,因为lastUsedSlide不是what_slide_i_am_currently_looking_at的可靠代理。

2 个答案:

答案 0 :(得分:2)

潜在的解决方法,在这里:

http://eileenslounge.com/viewtopic.php?f=30&t=1667

If ActiveWindow.Selection.Type = ppSelectionNone Then
  Select Case ActiveWindow.ViewType
    Case ppViewNormal
      ActiveWindow.ViewType = ppViewSlide
      ActiveWindow.ViewType = ppViewNormal
    Case ppViewSlideSorter
      ActiveWindow.ViewType = ppViewSlide
      ActiveWindow.ViewType = ppViewSlideSorter
    Case Else
      ' ?
  End Select
End If
' A slide should be selected now

我在美学上并不特别关心它,但它似乎有效。如果在幻灯片之间进行选择,那么唯一的事情是正常的,这会强制选择这两张幻灯片中的第一张,当我认为第二张更直观时。我可以修改我的代码以解决这个问题,但它仍然不理想。

答案 1 :(得分:2)

大卫,也许您可​​以对Activate对象使用额外的Window.Pane方法,如下所示:

'new code:
ActivePresentation.Windows(1).Panes(2).Activate
'your code
Dim w as Long 'slide index variable
w = ActivePresentation.Windows(1).Selection.SlideRange(1).SlideIndex

但是,请阅读更多有关Pane.ViewType财产的信息,这可能会有所帮助。在我的简单测试中,Panes(2)Panes(3)都有效,但您可以使用不同的上下文调用您的子。