PowerPoint VBA:基于文本框内容批量选中指定幻灯片
通过PowerPoint VBA批量选中含指定文本的幻灯片
需求:通过PowerPoint VBA扫描演示文稿,找出包含指定搜索文本的文本框所在幻灯片,并将这些幻灯片设置为选中状态。
已实现的搜索功能(可生成含目标文本的幻灯片列表)
Function FindSlidesWithText(ByVal Owner As String) As String Dim oSl As Slide Dim oShp As Shape Dim strSearch As String Dim slideList As String '若未传入搜索文本,弹出输入框让用户输入 If Owner = "" Then strSearch = InputBox("请输入要搜索的文本:") Else strSearch = Owner End If Dim SomeoneSlides As String SomeoneSlides = "" '遍历所有幻灯片和形状 For Each oSl In ActivePresentation.Slides For Each oShp In oSl.Shapes '检查形状是否包含文本框,且文本框中存在目标文本 If oShp.HasTextFrame Then If InStr(1, oShp.TextFrame.TextRange.Text, strSearch, vbTextCompare) > 0 Then '记录幻灯片编号及对应文本内容 slideList = slideList & "幻灯片 " & oSl.SlideNumber & ": " & oShp.TextFrame.TextRange.Text & vbCrLf '拼接幻灯片编号字符串(用于后续选中) SomeoneSlides = SomeoneSlides & oSl.SlideNumber & "," End If End If Next Next '弹出消息框展示搜索结果 MsgBox slideList End Function
已知可行的批量选中方法(直接指定数组)
如果直接用数组指定幻灯片编号,可成功批量选中(比如选中1、2、5号幻灯片):
Dim r1 As SlideRange Set r1 = ActivePresentation.Slides.Range(Array(1,2, 5)) '此代码生效 r1.Select
遇到的问题:循环生成选中逻辑时仅能选中最后一张幻灯片
调用方式示例:Call SelectSlides("1,2,")(参数为搜索功能输出的幻灯片编号字符串)
Sub SelectSlides(YourSlideList As String) Dim slideArr() As String Dim selAry As String '切换到普通视图并激活大纲窗格 ActiveWindow.ViewType = PpViewType.ppViewNormal ActiveWindow.Panes(1).Activate '将幻灯片编号字符串按逗号分割为数组 slideArr = Split(YourSlideList, ",") Dim r1 As SlideRange '遍历分割后的数组 For i = 0 To (UBound(slideArr) - 1) slideNum = CInt(slideArr(i)) selAry = selAry & slideNum '对目标幻灯片设置背景(可按需修改) With ActivePresentation.Slides.Range(slideNum) '取消遵循母版背景设置 .FollowMasterBackground = False '设置渐变背景 .Background.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientDaybreak End With '每次循环都重新赋值SlideRange,仅保留当前幻灯片 Set r1 = ActivePresentation.Slides.Range(Array(slideNum)) '此代码仅单张生效 Next '最终仅选中最后一次循环的幻灯片 r1.Select End Sub
最终可行的解决方案代码
Sub SelectSlides(YourSlideList As String) Dim slideArr() As String Dim selAry As String Dim selAry2(99) As Long '存储幻灯片编号的数组,长度可按需调整 '切换到普通视图并激活大纲窗格 ActiveWindow.ViewType = PpViewType.ppViewNormal ActiveWindow.Panes(1).Activate '将幻灯片编号字符串按逗号分割为数组 slideArr = Split(YourSlideList, ",") '遍历数组,将幻灯片编号存入selAry2数组 For i = 0 To (UBound(slideArr) - 1) slideNum = CInt(slideArr(i)) selAry = selAry & slideNum selAry2(i) = slideNum '对目标幻灯片设置背景(可按需修改) With ActivePresentation.Slides.Range(slideNum) '取消遵循母版背景设置 .FollowMasterBackground = False '设置渐变背景 .Background.Fill.PresetGradient msoGradientHorizontal, 1, msoGradientDaybreak End With Next '使用存储所有目标编号的数组创建SlideRange并选中 Dim r1 As SlideRange Set r1 = ActivePresentation.Slides.Range(selAry2) r1.Select End Sub
内容的提问来源于stack exchange,提问作者user680589
相关产品推荐
相关产品推荐

