Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba PowerPoint 2007-在包含文本的表格、图表等上设置语言_Vba_Ms Office_Powerpoint - Fatal编程技术网

Vba PowerPoint 2007-在包含文本的表格、图表等上设置语言

Vba PowerPoint 2007-在包含文本的表格、图表等上设置语言,vba,ms-office,powerpoint,Vba,Ms Office,Powerpoint,我有一个宏,它基本上扫描PowerPoint中的每张幻灯片,并设置指定的语言。效果很好。然而,它跳过了不是文本框的容器。我希望它能将语言应用于表格、smartart、图表等,基本上是任何可能包含文本的内容 这可能吗?这是当前代码: Public Sub changeLanguage() On Error Resume Next 'lang = "English" lang = "Norwegian" 'Determine language selected

我有一个宏,它基本上扫描PowerPoint中的每张幻灯片,并设置指定的语言。效果很好。然而,它跳过了不是文本框的容器。我希望它能将语言应用于表格、smartart、图表等,基本上是任何可能包含文本的内容

这可能吗?这是当前代码:

Public Sub changeLanguage()

    On Error Resume Next

    'lang = "English"
    lang = "Norwegian"

    'Determine language selected
    If lang = "English" Then
            lang = msoLanguageIDEnglishUK
    ElseIf lang = "Norwegian" Then
            lang = msoLanguageIDNorwegianBokmol
    End If

    'Set default language in application
    ActivePresentation.DefaultLanguageID = lang

    'Set language in each textbox in each slide
    For Each oSlide In ActivePresentation.Slides
        Dim oShape As Shape

        For Each oShape In oSlide.Shapes
            oShape.Select
            oShape.TextFrame.TextRange.LanguageID = lang
        Next
    Next

End Sub

是的,这在PowerPoint中并不那么直观,但它是可以做到的。基本上,有3种主要的形状类型(简单、分组和表格)。此代码将检查所有这些选项:

Public Sub changeLanguage()
    On Error Resume Next
    Dim gi As GroupShapes '<-this was added. used below
    'lang = "English"
    lang = "Norwegian"
    'Determine language selected
    If lang = "English" Then
        lang = msoLanguageIDEnglishUK
    ElseIf lang = "Norwegian" Then
        lang = msoLanguageIDNorwegianBokmol
    End If
    'Set default language in application
    ActivePresentation.DefaultLanguageID = lang

    'Set language in each textbox in each slide
    For Each oSlide In ActivePresentation.Slides
        Dim oShape As Shape

        ' Sets the language for the notes page as well.
        Dim oShape As Shape
        For Each oShape In oSlide.NotesPage.Shapes
            oShape.Select
            oShape.TextFrame.TextRange.LanguageID = lang
        Next

        For Each oShape In oSlide.Shapes
            'Check first if it is a table
            If oShape.HasTable Then
                For r = 1 To oShape.Table.Rows.Count
                    For c = 1 To oShape.Table.Columns.Count
                    oShape.Table.Cell(r, c).Shape.TextFrame.TextRange.LanguageID = lang
                    Next
                Next
            Else
                Set gi = oShape.GroupItems
                'Check if it is a group of shapes
                If Not gi Is Nothing Then
                    If oShape.GroupItems.Count > 0 Then
                        For i = 0 To oShape.GroupItems.Count - 1
                            oShape.GroupItems(i).TextFrame.TextRange.LanguageID = lang
                        Next
                    End If
                'it's none of the above, it's just a simple shape, change the language ID
                Else
                    oShape.TextFrame.TextRange.LanguageID = lang
                End If
            End If
        Next
    Next
End Sub
Public子变更语言()
出错时继续下一步

Dim gi As GroupShapes'我在执行宏以更改所有形状中的语言时遇到了相同的问题。 据我所知,在PPT2007中,不可能通过编程方式在诸如图表和SmartArt之类的对象上设置语言。无法在这些对象上的VBA中设置languageID。但是,通过单击SmartArt对象或图表对象更改语言是可行的

对于其他对象:

  • 分组项目——我必须通过编程(如御宅族帖子中的示例)遍历组中的所有对象来设置语言
  • 表-我遍历了所有单元格

    • 虽然过了一段时间。。。我是从这儿来的。因为我更喜欢使用python,所以使用
      win32com
      包的python版本应该是:

      infile_name = 'drive:/path/to/in.pptx'
      outfile_name = 'drive:/path/to/out.pptx'
      
      target_language = 1031 # find in language list, here German
      
      import time
      import win32com.client
      
      
      ppt = win32com.client.Dispatch('PowerPoint.Application')
      ppt.Visible = True
      
      presentation = ppt.Presentations.Open(infile_name)
      
      def change_all_subshapes(target_shape, language_id):
          if target_shape.HasTextFrame:
              target_shape.TextFrame.TextRange.languageID = language_id
      
          if target_shape.HasTable:
              for r in range(1, target_shape.Table.Rows.Count + 1):
                  for c in range(1, target_shape.Table.Columns.Count + 1):
                      target_shape.Table.Cell(r, c).Shape.TextFrame.TextRange.LanguageID = language_id
      
          # look the constants msoGroup and msoSmartArt up
          if target_shape.Type in [6, 24]:
              for i in range(1, target_shape.GroupItems.Count + 1):
                  change_all_subshapes(target_shape.GroupItems.Item(i), language_id)
      
      # necessary: hopefully ppt is open after a second
      time.sleep(1)
      
      print('all slides')
      for i in range(1, presentation.Slides.Count + 1):
          for j in range(1, presentation.Slides(i).Shapes.Count + 1):
              change_all_subshapes(presentation.Slides(i).Shapes(j), target_language)
      
      print('master shapes')
      for i in range(1, presentation.SlideMaster.CustomLayouts.Count + 1):
          for j in range(1, presentation.SlideMaster.CustomLayouts(i).Shapes.Count + 1):
              change_all_subshapes(presentation.SlideMaster.CustomLayouts(i).Shapes(j), target_language)
      
      presentation.SaveAs(outfile_name)
      presentation.Close()
      ppt.Quit()
      

      它工作得很好!但它似乎没有检查SmartArt。这可能吗?Microsoft应该在2007版中包含宏录制,这样我就可以录制单击SmartArt对象的过程,以确定它实际上是哪种类型。它确实检查了SmartArt,但我在PowerPoint 2010上进行了测试。即使在2007年,SmartArt也被认为是
      oShape.GroupItems
      。如果你尝试用SmartArt在不同的平台上测试它,你会得到相同的结果吗?@Kenny Bones:你能用不同的平台进行测试吗?嗨,好的,我已经做了一些测试,我看到你正在使用oShape.GroupItems(I).TextFrame.TextRange.LanguageID将语言应用到SmartArt上。但我认为这就是一切发生的地方。我检查了一下oShape是否是SmartArt,然后我暂停了宏并为oShape添加了一块手表。我发现语言是在GroupItems.Item1.TextFrame.TextRange.LanguageID上设置的。但是GroupItems上似乎没有直接的LanguageID。@Kenny Bones:如果您也需要直接在GroupItems上使用它,只需将
      oShape.TextFrame.TextRange.LanguageID=lang
      放在行的正下方
      如果不是,则gi为Nothing