VBA for Microsoft PowerPoint 识别和隐藏德语文本框

Posted

技术标签:

【中文标题】VBA for Microsoft PowerPoint 识别和隐藏德语文本框【英文标题】:VBA for Microsoft PowerPoint to recognize and hide text boxes in German language 【发布时间】:2017-01-17 14:26:57 【问题描述】:

我需要用相同的幻灯片、背景和除文本之外的所有内容制作两份演示文稿:一份是德文的,一份是英文的。因此我有两个单独的演示文稿,我必须始终同时更新,否则一个语言版本会过时,我经常忘记我更改了什么。

我已经制作了一个自定义放映,将所有幻灯片复制到一个 PowerPoint 演示文稿中,效果相当好,但每次我对一种语言进行编辑时,我仍然必须更改两张相同的幻灯片。

因此,我正在尝试编写一个宏来识别演示文稿中包含德语文本的所有文本框,并在显示期间隐藏它们,反之亦然。然后,每个宏将链接到标题幻灯片上名为“英语”或“德语”的超链接框,单击该框时,将隐藏其他语言的文本框,同时保留所有图片和格式相同。理想情况下,宏将隐藏一种语言的所有框,并在同一步骤中使另一种语言的所有框再次可见,以便演示文稿始终可用,并且我没有用户打开没有文本的 PPT盒子,因为它们都会被隐藏起来......

为了实现这一点,我在同一张幻灯片上有两个包含两种语言文本的文本框,这就是我想隐藏文本框的原因。

我能够隐藏所有文本框,但不能隐藏特定语言的文本框(也就是说,所有框无论其编辑语言如何都会被隐藏,但不会隐藏任何特定语言)。

PS - 这里不需要引用文本框...它可以只引用一个形状。我试图避免,图片会被隐藏,并认为文本框是引用我想要的内容的最佳方式。

有没有更好的办法?

我真的不知道如何在 VBA 中引用语言,我偶然发现了这个网站,并认为有人可能有一个快速的技巧来帮助我解决这个问题。我拥有的将混合文本框但不混合特定语言框的代码如下:

Sub GermanTextBoxFinder()
    Dim SlideToCheck As Slide
    Dim ShapeIndex As Integer
      ' Visit each slide
    For Each SlideToCheck In ActivePresentation.Slides
      ' On each slide, count down through the shapes
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
      ' If the shape IS a text box and DOES have German text
    If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
    MsoLanguageID.msoLanguageIDGerman _
Then
    ' Toggle visibility of German Textboxes
    SlideToCheck.Shapes(ShapeIndex).Visible = msoFalse
End If
Next
Next

End Sub

【问题讨论】:

【参考方案1】:

为什么不用可以识别它们的德语文本来命名这些形状?例如。德语文本使用前缀“txtGER”,英文文本使用前缀“txtENG”。然后你可以使用类似下面的东西:

If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
    Left(SlideToCheck.Shapes(ShapeIndex).Name, 6) = "txtGER" Then
    ' Toggle visibility of German Textboxes
    SlideToCheck.Shapes(ShapeIndex).Visible = msoFalse
Else
    SlideToCheck.Shapes(ShapeIndex).Visible = msoTrue
End If

(有关如何重命名形状的信息,请参阅this q+a)。

【讨论】:

【参考方案2】:

这将隐藏包含英语或法语文本的文本框/形状。您可以修改 HideFrench 以隐藏德语... Intellisense 将提供正确的常量。

Sub HideEnglish()
    Dim oSl As Slide
    Dim oSh As Shape

    For Each oSl In ActivePresentation.Slides
        For Each oSh In oSl.Shapes
            If oSh.HasTextFrame Then
                If oSh.TextFrame.HasText Then
                    If oSh.TextFrame.TextRange.LanguageID = msoLanguageIDEnglishUS Then
                        oSh.Visible = False
                    Else
                        oSh.Visible = True
                    End If

                End If
            End If
        Next
    Next
End Sub

Sub HideFrench()
    Dim oSl As Slide
    Dim oSh As Shape

    For Each oSl In ActivePresentation.Slides
        For Each oSh In oSl.Shapes
            If oSh.HasTextFrame Then
                If oSh.TextFrame.HasText Then
                    If oSh.TextFrame.TextRange.LanguageID = msoLanguageIDFrench Then
                        oSh.Visible = False
                    Else
                        oSh.Visible = True
                    End If

                End If
            End If
        Next
    Next
End Sub

【讨论】:

谢谢,史蒂夫!这完美地工作。不过,我之前没有想到的是,当我在标题幻灯片(即“德语”(隐藏英文宏的链接))上创建一个带有运行宏的超链接的操作按钮时,它也会隐藏它操作按钮,意味着用户不能再次单击它来取消隐藏文本框,除非以其他方式运行宏。我将如何编写一个例外来避免隐藏标题幻灯片?或者,专门引用Action box不被隐藏? 在头顶,我会让 HideEnglish 子例程也将 Action 按钮的文本更改为“However you say HIDE GERMAN auf Deutsch”,并让 HideGerman 子例程将其更改为“隐藏英语”

以上是关于VBA for Microsoft PowerPoint 识别和隐藏德语文本框的主要内容,如果未能解决你的问题,请参考以下文章

microsoft visual studio 2010 tools for office runtime是啥软件

VBA Code for Word Navigation Pane failed view-showheading-method-word

word-vba-microsoft(中英文)

Microsoft Access 导入 vba 文件

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第14章节--使用Office Services开发应用程序 WORD自己主动服务和新的PowerPo

LinkToPrevious 的 Microsoft Word 2016 VBA 问题