Стартирайте VBA на всеки PowerPoint, за да промените LanguageID

Опитвам се да създам лента с инструменти с бутон, който ще промени LanguageID за всички форми и текстови полета в документ на PowerPoint на EnglishUS. Това е за отстраняване на проблем, при който, ако някой провери правописа на документ, използвайки друг език (в този случай френски), този език се вгражда в самия .ppt файл. Когато друг потребител се опита да провери правописа в същата област, използвайки друг език, например английски, думите, които програмата за проверка на правописа предлага, са на оригиналния език. Например, той се опита да коригира думата „определено“ на „специфично“, френска дума. От това, което прочетох, единственият начин да се коригира този езиков проблем е с VBscript и единственият начин да се стартира VBscript в Powerpoint, без да се вгражда в .ppt и да се зарежда този файл всеки път, е чрез създаване на добавка с бутон на лентата с инструменти за стартиране на макроса, също използвайки VBS. По-долу е кодът, който взех от различни източници и когато се опитах да го събера, той не работи (въпреки че се компилира). Ако някой може да погледне, сигурен съм, че това е обикновена синтактична грешка или нещо подобно, би било от ОГРОМНА помощ. Благодаря предварително!!

Между другото, ако някой знае по-лесен начин за стартиране на макрос в PPT, без да се налага да отваряте определен PPT всеки път, ще слушам.

и сега, скриптът:

Sub Auto_Open() 
    Dim oToolbar As CommandBar 
     Dim oButton As CommandBarButton 
     Dim MyToolbar As String 

     ''# Give the toolbar a name 
     MyToolbar = "Fix Language" 

     On Error Resume Next    
     ''# so that it doesn't stop on the next line if the toolbar's already there 

     ''# Create the toolbar; PowerPoint will error if it already exists 
     Set oToolbar = CommandBars.Add(Name:=MyToolbar, _ 
         Position:=msoBarFloating, Temporary:=True) 
     If Err.Number <> 0 Then   
           ''# The toolbar's already there, so we have nothing to do 
           Exit Sub 
     End If 

     On Error GoTo ErrorHandler 

     ''# Now add a button to the new toolbar 
     Set oButton = oToolbar.Controls.Add(Type:=msoControlButton) 

     ''# And set some of the button's properties 
     With oButton 
          .DescriptionText = "Fix Language for Spell Check"    
           ''# Tooltip text when mouse if placed over button 
          .Caption = "Click to Run Script"     
          ''# Text if Text in Icon is chosen 
          .OnAction = "Button1"   
           ''# Runs the Sub Button1() code when clicked 
          .Style = msoButtonIcon     
           ''# Button displays as icon, not text or both 
          .FaceId = 59        

     End With 

     ''# Repeat the above for as many more buttons as you need to add 
     ''# Be sure to change the .OnAction property at least for each new button 

     ''# You can set the toolbar position and visibility here if you like 
     ''# By default, it'll be visible when created 
     oToolbar.Top = 150 
     oToolbar.Left = 150 
     oToolbar.Visible = True 

 NormalExit: 
     Exit Sub   ''# so it doesn't go on to run the errorhandler code 

 ErrorHandler: 
      ''# Just in case there is an error 
      MsgBox Err.Number & vbCrLf & Err.Description 
      Resume NormalExit: 
 End Sub 

 Sub Button1() 
 ''#         This is the code to replace the LanguageID throughout the ppt 
  Option Explicit    
  Public Sub ChangeSpellCheckingLanguage()    
  Dim j As Integer, k As Integer, scount As Integer, fcount As Integer  
  scount = ActivePresentation.Slides.Count  
  For j = 1 To scount  
  fcount = ActivePresentation.Slides(j).Shapes.Count  
  For k = 1 To fcount  
  If ActivePresentation.Slides(j).Shapes(k).HasTextFrame Then  
  ActivePresentation.Slides(j).Shapes(k) _  
  .TextFrame.TextRange.LanguageID = msoLanguageIDEnglishUS  
  End If  
  Next k  
  Next j  
  End Sub 

  End Sub

person Community    schedule 11.01.2010    source източник
comment
Отнася се за stackoverflow.com/questions/37653183/   -  person Thierry Dalon    schedule 18.07.2016


Отговори (3)


Отговорът е съвсем ясен, ако все още не е ясен.

Както можете да видите, sub Button1() капсулира друг суб. Затова ви съветвам да премахнете повикването ChangeSpellingCheckingLanguage и последното End sub, тогава вашият код ще работи.

person Nabilo    schedule 08.04.2011

Това може да е невероятно късен отговор, но току-що реших този проблем с помощта на VBScript (който може да се изпълнява извън powerpoint). Скриптът, както е написан, ще промени езика на всеки файл на powerpoint в дадена директория (и поддиректории) на английски. Ето го скрипта:

Option Explicit

'microsoft office constants
Const msoTrue = -1
Const msoFalse = 0
Const msoLanguageIDEnglishUS = 1033
Const msoGroup = 6

'starting folder (current folder)
Const START_FOLDER = ".\"
'valid powerpoint file extensions
Dim FILE_EXTENSIONS : FILE_EXTENSIONS = Array("pptx", "pptm", "ppt", "potx", "potm", "pot")
'desired language for all Text
Dim DESIRED_LANGUAGE : DESIRED_LANGUAGE = msoLanguageIDEnglishUS

'VBScript file system objects for starting folder
Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objStartingFolder : Set objStartingFolder = objFSO.GetFolder(START_FOLDER)

IterateContainingItems objStartingFolder

'recursive subroutine to iterate each file in specified folder and all subfolders
Sub IterateContainingItems(objCurrentFolder)
    Dim colFiles : Set colFiles = objCurrentFolder.Files
    Dim objCurrentFile
    For Each objCurrentFile in colFiles
        ReportInfo(objCurrentFile)
    Next
    Dim colFolders : Set colFolders = objCurrentFolder.SubFolders
    Dim objNextFolder
    For Each objNextFolder in colFolders
        IterateContainingItems objNextFolder
    Next
End Sub

'subroutine executed for every file iterated by IterateContainingItems subroutine
Sub ReportInfo(objCurrentFile)
    Dim strPathToFile
    strPathToFile = objFSO.GetAbsolutePathName(objCurrentFile.Path)

    If isPowerpointFile(strPathToFile) Then
        Dim objPowerpointApp, objPresentations, objPresentation, objSlides, intSlideCount

        set objPowerpointApp = CreateObject("Powerpoint.Application")
        set objPresentations = objPowerpointApp.Presentations
        Set objPresentation = objPresentations.Open(strPathToFile, msoFalse, msoFalse, msoFalse)
        Set objSlides = objPresentation.Slides
        intSlideCount = objSlides.Count

        ResetLanguage objPresentation

        objPresentation.Save
        objPresentation.Close
        objPowerpointApp.Quit
    End If
End Sub

'check if given filepath specifies a powerpoint file as described by the "constant" extension array
Function isPowerpointFile(strFilePath)
    Dim strExtension, found, i
    strExtension = objFSO.GetExtensionName(strFilePath)
    found = false
    for i = 0 to ubound(FILE_EXTENSIONS)
        if FILE_EXTENSIONS(i) = strExtension then    
            found = true
            exit for
        end if
    next
    isPowerpointFile = found
End Function

'finds every shape in the entire document and attempts to reset its LanguageID
Sub ResetLanguage(objCurrentPresentation)
    Dim objShape

    'change shapes from presentation-wide masters
    If objCurrentPresentation.HasHandoutMaster Then
        For Each objShape in objCurrentPresentation.HandoutMaster.Shapes
            ChangeLanguage objShape
        Next
    End If
    If objCurrentPresentation.HasNotesMaster Then
        For Each objShape in objCurrentPresentation.NotesMaster.Shapes
            ChangeLanguage objShape
        Next
    End If
    If objCurrentPresentation.HasTitleMaster = msoTrue Then
        For Each objShape in objCurrentPresentation.TitleMaster.Shapes
            ChangeLanguage objShape
        Next
    End If
    'change shapes from each design's master
    Dim tempDesign
    For Each tempDesign in objCurrentPresentation.Designs
        For Each objShape in tempDesign.SlideMaster.Shapes
            ChangeLanguage objShape
        Next
    Next
    'change shapes from each slide
    Dim tempSlide
    For Each tempSlide in objCurrentPresentation.Slides
        For Each objShape in tempSlide.Shapes
            ChangeLanguage objShape
        Next
        If tempSlide.hasNotesPage Then
            For Each objShape in tempSlide.NotesPage.Shapes
                ChangeLanguage objShape
            Next
        End If
    Next
End Sub

'if the given shape contains a text element, it checks and corrects the LanguageID
'if the given shape is a group, it iterates through each element in the group
Sub ChangeLanguage(objShape)
    If objShape.Type = msoGroup Then
        Dim objShapeGroup : Set objShapeGroup = objShape.GroupItems
        Dim objShapeChild
        For Each objShapeChild in objShapeGroup
            ChangeLanguage objShapeChild
        Next
    Else
        If objShape.HasTextFrame Then
            Dim intOrigLanguage : intOrigLanguage = objShape.TextFrame.TextRange.LanguageID
            If Not intOrigLanguage = DESIRED_LANGUAGE Then
                If objShape.TextFrame.TextRange.Length = 0 Then
                    objShape.TextFrame.TextRange.Text = "[PLACEHOLDER_TEXT_TO_DELETE]"
                End If
                objShape.TextFrame.TextRange.LanguageID = DESIRED_LANGUAGE
                If objShape.TextFrame.TextRange.Text = "[PLACEHOLDER_TEXT_TO_DELETE]" Then
                    objShape.TextFrame.TextRange.Text = ""
                End If
            End If
        End If
    End If
End Sub

За да го стартирате, просто копирайте и поставете кода в текстов редактор и го запазете като "script_name.vbs" в директорията с вашите PowerPoint файлове. Стартирайте го, като щракнете двукратно върху скрипта и изчакате.

person Community    schedule 11.06.2015

За да зареждате макрос при всяко отваряне на PowerPoint, трябва да създадете PowerPoint AddIn. Microsoft предостави ръководство стъпка по стъпка за Office XP. За Office 2007 и по-нови, AFAIK следните стъпки ще направят това:

  • Запазете файла като *.ppam в предложената от него директория (%APPDATA%\Microsoft\AddIns)
  • Отворете Настройки (щракнете върху бутона за офис в горния ляв ъгъл и изберете „Опции на PowerPoint“), изберете страницата „Добавки“, изберете „Добавки на PowerPoint“ в падащото меню зад „Управление“ и щракнете върху „ Отиди". Отваря се диалогов прозорец. Избирането на „Добавяне на нов“ извежда диалогов прозорец за избор на файл. Трябва да можете да изберете файла там.

Можете също да използвате Редактор на потребителски интерфейс на Office за създаване на панделки.

Въпреки това вече създадох такава добавка за коригиране на езика за текущите версии на PowerPoint и я пуснах за безплатно изтегляне за лична употреба: Програма за корекция на езика на PowerPoint от Ян Шейбал

person Jan Schejbal    schedule 09.04.2013