2011-01-19 11 views
5

Vì vậy, tôi đã có macro này về cơ bản sẽ quét từng trang chiếu trong PowerPoint và đặt ngôn ngữ được chỉ định. Hoạt động tuyệt vời. Howerver, nó bỏ qua các thùng chứa không phải là các hộp văn bản. Tôi muốn nó áp dụng ngôn ngữ trên bảng, smartart, biểu đồ, vv Về cơ bản bất cứ điều gì có thể chứa văn bản.PowerPoint 2007 - Đặt ngôn ngữ trên bảng, biểu đồ, v.v. có chứa văn bản

Điều này có thể thực hiện được không? Đây là mã hiện tại:

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 

Trả lời

7

Vâng, nó không phải tất cả trực quan trong PowerPoint, nhưng có thể thực hiện được. Về cơ bản, có 3 loại hình dạng chính (đơn giản, được nhóm và bảng). Mã này sẽ kiểm tra tất cả:

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

Nó hoạt động khá tốt! Nhưng nó dường như không kiểm tra SmartArt. Điều này có thể không? Microsoft nên đã bao gồm ghi macro trong phiên bản 2007 vì vậy tôi có thể ghi lại cách nhấp vào một đối tượng SmartArt, tìm ra loại nó thực sự là. –

+0

Nó kiểm tra SmartArt bên cạnh tôi, nhưng tôi đã thử nghiệm trên PowerPoint 2010. Ngay cả trong năm 2007 mặc dù SmartArt được coi là 'oShape.GroupItems'. Nếu bạn thử kiểm tra nó trên một tầng khác với SmartArt bạn có nhận được kết quả tương tự không? –

+0

@Kenny Bones: Bạn có thể thử điều này với một tầng khác không? –

0

Tôi gặp vấn đề tương tự khi thực hiện macro để thay đổi ngôn ngữ ở mọi hình dạng. Theo như tôi đã học, trong PPT2007 nó không thể thiết lập ngôn ngữ trên các đối tượng như Bảng xếp hạng và SmartArt, lập trình. Không có quyền truy cập để đặt languageID trong VBA trên các đối tượng này. Tuy nhiên, việc thay đổi ngôn ngữ bằng cách nhấp vào đối tượng SmartArt hoặc đối tượng Biểu đồ hoạt động.

Đối với các đối tượng khác:

  • mục nhóm - Tôi đã phải đi qua programatically (như trên ví dụ trong bài Otaku của) thông qua tất cả các đối tượng trong một nhóm để thiết lập một ngôn ngữ
  • bảng - Tôi đi qua qua tất cả ô.
0

Mặc dù một chút thời gian trôi qua ... đến đây từ https://superuser.com/questions/432366/how-do-i-change-the-language-of-all-powerpoint-slides-at-once. Vì tôi thích làm việc với python, phiên bản python sử dụng gói win32com sẽ là:

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()