PowerPoint - 确定光标是在第一张幻灯片之前还是之后

时间:2011-10-05 11:17:44

标签: vba cursor vsto position powerpoint

我需要确定PowerPoint中幻灯片窗格中的光标位置,以便将新幻灯片插入正确的位置。

选择幻灯片时,当前幻灯片编号为Application.ActiveWindow.View.Slide.SlideIndex。 当光标位于幻灯片之间时,切换到另一个视图然后返回(例如,滑动视图然后返回幻灯片浏览器)选择光标前面的幻灯片,然后上面的方法工作。

问题出在一种情况:当光标位于第一张幻灯片之前或之后。在两种情况下,来回切换视图,将光标定位在第一张幻灯片上。

如何确定幻灯片中的光标位置是在第一张幻灯片之前还是之后?

2 个答案:

答案 0 :(得分:1)

好问题。

一种丑陋的方法是使用SendKeys喷出一个向下箭头键。如果光标位于第一张幻灯片上方,则会导致选择第一张幻灯片。如果光标位于幻灯片1和2之间,则将选择第二张幻灯片。

使用.Execute方法触发插入新幻灯片的正确控件稍微不那么难看,这个幻灯片应该模仿用户在做同样事情时得到的内容;如果插入的幻灯片索引为1,则光标位于原始第一张幻灯片上方。如果插入的幻灯片索引为2,则光标最初位于幻灯片1和2之间。

或使用SendKeys(“^ M”)来完成同样的事情(在IDE中无法使用,但在PPT中你可以使用Alt + F8并选择宏来运行它。)

例如:如果光标位于第一张幻灯片上方,则显示1;如果光标位于幻灯片1和2之间,则显示2; DoEvnts是必需的;否则PPT在下一行运行之前没有创建幻灯片,并且错误输出。

Sub thing()
    Dim lTemp As Long
    SendKeys ("^M")
    DoEvents
    lTemp = ActiveWindow.Selection.SlideRange(1).SlideIndex
    ActiveWindow.Selection.SlideRange.Delete
    MsgBox lTemp
End Sub

我怀疑你想要添加一些安全检查,以确保不会错误地删除现有的幻灯片而不是你刚刚插入的幻灯片。

答案 1 :(得分:1)

同意,SendKeys不好,。执行更安全,但仍然有点风险。

您可以迭代窗格集合并检查活动窗格的ViewType,而无需更改活动窗格或用户的选择点。如果ViewType = 11,则缩略图窗格中的选择点(然后您需要执行“插入虚拟幻灯片”技巧以确定缩略图窗格中的确切位置)。

Sub OhThePane()
    Dim x As Long
    With ActiveWindow
        For x = 1 To .Panes.Count
            If .Panes(x).Active Then
                MsgBox "Pane: " & CStr(x) & vbCrLf & .Panes(x).ViewType
            End If
        Next
    End With
End Sub

注意:如果您在PPT中运行此操作,则必须使用Alt + F8启动它。使用菜单栏/功能区选项卡将使焦点远离用户选择的窗格,并为您提供虚假结果。