Как применить этот VBA к нескольким файлам PPT в папке

Я хотел бы, чтобы этот конкретный код запускался в нескольких файлах PowerPoint в папке. Но было бы еще лучше, если бы он открывал файл powerpoint, запускал приведенный ниже код, сохранял его, а затем открывал следующий. Любые предложения приветствуются! Я просмотрел код на этом веб-сайте, но не могу адаптировать его к моему коду ниже (например, этот Прокручивать файлы в папке с помощью VBA?)

ЦИКЛ ПОПЫТКИ

флаг

Sub LoopThroughFiles() 
Dim MyObj As Object, MySource As Object, file As Variant 
file = Dir("c:\testfolder\") 
While (file <> "") 
   If InStr(file, "test") > 0 Then 
          MsgBox "found " & file 
          Exit Sub 
    End If 
file = Dir 
Wend 
End Sub  

Существующий код

Option Explicit

' Selects the shape that support text which is closest to the top of the slide
' Written by Jamie Garroch of YOUpresent Ltd (http://youpresent.co.uk)
Sub SelectHigestTextShape()
  Dim oSld As Slide
  Dim oShp As Shape, oShpTop As Shape
  Dim sShpTop As Single

  On Error Resume Next
  Set oSld = ActiveWindow.View.Slide
  If Err Then Exit Sub
  On Error GoTo 0

  ' Set the top to the bottom of the slide
  sShpTop = ActivePresentation.PageSetup.SlideHeight

  ' Check each shape on the slide is positioned above the stored position
  ' Shapes not supporting text and placeholders are ignored
  For Each oShp In oSld.Shapes
    If oShp.Top < sShpTop And oShp.HasTextFrame And Not oShp.Type = msoPlaceholder Then
      sShpTop = oShp.Top
      Set oShpTop = oShp
    End If
  Next

  ' Select the topmost shape
  If Not oShpTop Is Nothing Then oShpTop.Select msoTrue
    ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.ParagraphFormat.Alignment = ppAlignCenter
  ' Clean up
  Set oSld = Nothing
  Set oShp = Nothing
  Set oShpTop = Nothing
End Sub

person Probs    schedule 22.09.2016    source источник
comment
Какой цикл вы пробовали?   -  person Nathan_Sav    schedule 22.09.2016
comment
Sub LoopThroughFiles() Dim MyObj As Object, MySource As Object, file As Variant file = Dir(c:\testfolder\) While (file ‹› ) If InStr(file, test) › 0 Then MsgBox найдено & file Exit Sub End If file = Dir Wend End Sub Я добавил это в код, но удалил, потому что это не сработало :(   -  person Probs    schedule 22.09.2016
comment
Похоже, что это использует объект файловой системы, у вас есть ссылка на загруженную? Это тоже не выглядит правильно, там нет GetFolder, как в посте, который вы копируете   -  person Nathan_Sav    schedule 22.09.2016
comment
Ну вообще-то я безнадежно хотел запустить этот макрос на всех открытых powerpoints..около 200, но даже это не сработало. Я действительно новичок в VBA, обычно я все делаю на Python.   -  person Probs    schedule 22.09.2016
comment
С помощью цикла, который вы предоставили, вы зациклились на файлах, но ничего с ними не сделали. Установили ли вы где-нибудь указатель на файл PP? Вы вызвали цикл внутри SelectHighestTextShape?   -  person Han Soalone    schedule 22.09.2016
comment
msdn.microsoft.com/en-us/library/office/ff746171. aspx и 4guysfromrolla.com/webtech/faq/FileSystemObject/faq5. shtml должен оказать вам необходимую помощь. Что вам нужно сделать, так это открыть презентацию, затем вызвать функцию, затем закрыть пресс, открыть файл nect. Или вы можете открыть объект, скажем, установить objPP=...open pres.. затем передать objPP в функцию в качестве аргумента или использовать общедоступную переменную, чтобы вы могли сказать sShpTop = objPP......   -  person Nathan_Sav    schedule 22.09.2016
comment
Но есть несколько файлов PP, я указал на папку, где все файлы находятся в & Sep & .ppt *, где я объявил Sep = '\'.. Я просто не знаю, как объединить несколько сабвуферов, чтобы это петли, и мне это очень нужно сегодня.   -  person Probs    schedule 22.09.2016
comment
Спасибо Nathan_Sav, попробую ;)   -  person Probs    schedule 22.09.2016


Ответы (1)


Это мой пример кода для подпрограммы SelectHigestTextShape, но я не уверен, что он будет работать так, как вы хотите, для нескольких файлов. Причина в том, что он был разработан для ВЫБОРА объекта текстового поля в АКТИВНОЙ ПРЕЗЕНТАЦИИ с использованием АКТИВНОГО ПРОСМОТРА. Ничего из этого не существует, когда вы перебираете файлы в папке, поскольку вам нужно открывать каждый из них по очереди, но даже в этом случае какой смысл выбирать фигуру только для того, чтобы потом закрыть презентацию? Думаю, нам действительно нужно знать конечную цель. В типе пакетной обработки, которую вы пытаетесь использовать, было бы нецелесообразно вообще что-либо выбирать, поскольку для этого требуется, чтобы представление объекта было активным, что является кошмаром отладки и сильно замедляет все. Если вы хотите что-то сделать с конкретным объектом, гораздо лучше использовать ссылку на него, не требуя активного вида или даже активного окна (вы можете открывать каждый файл невидимо, обрабатывать его и затем закрывать).

В этом примере выполняется цикл по папке, открытие каждой найденной презентации (без окна), цикл по всем фигурам на всех слайдах, вывод количества слайдов и фигур на ближайшую панель, а затем закрытие файла:

' Loop through all PowerPoint files in a specified folder
' Open each and then loop through each shape of each slide
' Output a count of slides and shapes in immediate pane before closing the file
' Modified by Jamie Garroch of YOUpresent Ltd (http://youpresent.co.uk)
Sub LoopThroughPPTFiles()
  Dim oPres As Presentation, oSld As Slide, oShp As Shape
  Dim SldCount As Long, ShpCount As Long
  Dim MyFile As String
  Const MyFolder = "c:\testfolder\"
  On Error GoTo errorhandler
  MyFile = Dir(MyFolder)
  While (MyFile <> "")
    If Right(MyFile, 5) Like ".ppt*" Then
      Set oPres = Presentations.Open(FileName:=MyFolder & MyFile, ReadOnly:=msoTrue, Untitled:=msoFalse, WithWindow:=msoFalse)
      For Each oSld In oPres.Slides
        SldCount = SldCount + 1
        For Each oShp In oSld.Shapes
          ShpCount = ShpCount + 1
        Next
      Next
      Debug.Print oPres.Name & " has " & SldCount & " slide(s) and " & ShpCount & " shapes."
      SldCount = 0: ShpCount = 0
      oPres.Close
    End If
    MyFile = Dir
  Wend
  ' clean up
  Set oPres = Nothing: Set oSld = Nothing: Set oShp = Nothing
  Exit Sub
errorhandler:
  If Not oPres Is Nothing Then oPres.Close: Set oPres = Nothing
End Sub

Вы можете использовать это, чтобы затем изучить фигуры после строки «Для каждого oShp в oSld.Shapes», чтобы найти фигуру, расположенную выше всего на слайде, а затем обработать ее (не выбирая ее).

person Jamie Garroch - MVP    schedule 22.09.2016
comment
Что ж, ваш код будет работать, если каждый PPT будет открыт, будет выбрана фигура (которая везде на первом слайде PPT), она будет центрирована посередине, PPT будет сохранена, а затем закрыта, а затем следующая. будет открыт и т. д. Кстати, классный код! - person Probs; 22.09.2016