PowerPoint 2007 - выбор языка для таблиц, диаграмм и т. Д., Содержащих текст - PullRequest
6 голосов
/ 19 января 2011

Итак, у меня есть этот макрос, который в основном сканирует каждый слайд в PowerPoint и устанавливает указанный язык.Работает отлично.Однако, он пропускает контейнеры, которые не являются текстовыми полями.Мне бы хотелось, чтобы он применял язык к таблицам, смарт-картам, диаграммам и т. Д. В основном все, что может содержать текст.

Возможно ли это вообще?Это текущий код:

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

Ответы [ 3 ]

8 голосов
/ 19 января 2011

Да, в 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
        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
0 голосов
/ 04 мая 2017

Хотя прошло немного времени ... пришло сюда с https://superuser.com/questions/432366/how-do-i-change-the-language-of-all-powerpoint-slides-at-once. Поскольку я предпочитаю работать с Python, версия Python, использующая пакет win32com, будет выглядеть так:

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()
0 голосов
/ 31 августа 2011

У меня была та же проблема при выполнении макроса для изменения языка во всех формах.Насколько я узнал, в PPT2007 невозможно программировать язык для таких объектов, как диаграммы и SmartArt.Нет доступа для установки languageID в VBA для этих объектов.Однако изменение языка путем нажатия на объект SmartArt или объект Chart работает.

Для других объектов:

  • сгруппированные элементы - мне пришлось программно пройти (как в примере в посте Отаку) через все объекты в группе, чтобы установить язык
  • таблица - я прошел через все ячейки.
...