Вопрос или проблема
VBA PowerPoint: объединение файлов pptx в один
Я видел подобный пост раньше, но не смог добавить больше комментариев и реализовать решение. Так что, пожалуйста, не критикуйте 🙂 Мне нужно открыть пустой файл pptx и указать путь к папке, которая содержит, скажем, 20 других презентаций pptx (текст, графики, изображения), и автоматически добавить их в открытый файл. Все VBA, которые я пробовал до сих пор, не работают для меня, поэтому, пожалуйста, добавьте комментарии, если сможете предоставить пример VBA для таких amateur’ов, как я!
Большое спасибо!
Как посоветовал один из мастеров здесь, вот код, который я использовал и заменил strFPath на папку, в которой находятся все pptx файлы, которые я хотел вставить в мастер-презентацию pptx, и заменил strSpec на один из файлов из папки, в которой находятся другие файлы, чтобы он был вставлен, но это не сработало.
Sub Combine_fromFolder()
Dim strFPath As String
Dim strSpec As String
Dim strFileName As String
Dim oTarget As Presentation
Set oTarget = Application.Presentations.Add(WithWindow:=True)
strFPath = "C:\Users\John\Desktop\Test\" ' Измените это
strSpec = "*.PPTX" 'для включения PPT и т.д. используйте "*.PP*"
strFileName = Dir$(strFPath & strSpec)
While strFileName <> ""
oTarget.Slides.InsertFromFile strFileName, oTarget.Slides.Count, 1, 1
strFileName = Dir()
Wend
End Sub
Мне не удалось заставить работать тот, что у вас есть. Он довольно старый, так что, возможно, он несовместим с более поздними версиями PowerPoint.
Я нашел следующий VBA на PPTools, Решение 2, который позволяет выполнить то, что вы описали. Единственное исключение — вам не нужно изменять путь, потому что этот код использует папку, в которой находятся файлы, которые вы хотите объединить.
В этом коде есть два Subs
, которые необходимо использовать вместе.
- Откройте новый файл презентации и сохраните его в папке, где находятся все файлы, которые вы хотите объединить (вы можете переместить его позже)
- Вставьте код в окно VBA
- Запустите макрос
InsertAllSlides
, и он объединит их.
Sub InsertAllSlides()
' Вставить все слайды из всех презентаций в той же папке, что и эта
' В ЭТУ; не пытайтесь вставить ЭТУ презентацию в саму себя.
Dim vArray() As String
Dim x As Long
' Измените "*.PPT" на "*.PPTX" или на что-то другое, если необходимо:
EnumerateFiles ActivePresentation.Path & "\", "*.PPT", vArray
With ActivePresentation
For x = 1 To UBound(vArray)
If Len(vArray(x)) > 0 Then
.Slides.InsertFromFile vArray(x), .Slides.Count
End If
Next
End With
End Sub
Sub EnumerateFiles(ByVal sDirectory As String, _
ByVal sFileSpec As String, _
ByRef vArray As Variant)
' собрать все файлы, подходящие под спецификацию файлов, в vArray, массив строк
Dim sTemp As String
ReDim vArray(1 To 1)
sTemp = Dir$(sDirectory & sFileSpec)
Do While Len(sTemp) > 0
' НЕ "материнское судно" ... текущая презентация
If sTemp <> ActivePresentation.Name Then
ReDim Preserve vArray(1 To UBound(vArray) + 1)
vArray(UBound(vArray)) = sDirectory & sTemp
End If
sTemp = Dir$
Loop
End Sub
Ответ или решение
Чтобы объединить несколько презентаций PowerPoint в одну с использованием VBA, вы можете воспользоваться приведенным ниже кодом. Этот код позволит вам открыть пустую презентацию и добавить слайды из всех других файлов .pptx, находящихся в указанной папке.
Шаги для выполнения:
- Создайте новую презентацию и сохраните ее в той же папке, где находятся остальные файлы .pptx.
- Откройте редактор VBA в PowerPoint (нажмите
Alt + F11
). - Вставьте приведённый ниже код в модуль.
- Запустите макрос
InsertAllSlides
.
Вот код, который вам нужен:
Sub InsertAllSlides()
' Вставить все слайды из всех презентаций в той же папке, что и текущая презентация
Dim vArray() As String
Dim x As Long
' Измените "*.PPT" на "*.PPTX", если необходимо:
EnumerateFiles ActivePresentation.Path & "\", "*.PPTX", vArray
With ActivePresentation
For x = 1 To UBound(vArray)
If Len(vArray(x)) > 0 Then
.Slides.InsertFromFile vArray(x), .Slides.Count
End If
Next
End With
End Sub
Sub EnumerateFiles(ByVal sDirectory As String, ByVal sFileSpec As String, ByRef vArray As Variant)
' Собрать все файлы, соответствующие шаблону файла, в массив vArray, который является массивом строк
Dim sTemp As String
ReDim vArray(1 To 1)
sTemp = Dir$(sDirectory & sFileSpec)
Do While Len(sTemp) > 0
' Не добавлять текущую презентацию в массив
If sTemp <> ActivePresentation.Name Then
ReDim Preserve vArray(1 To UBound(vArray) + 1)
vArray(UBound(vArray)) = sDirectory & sTemp
End If
sTemp = Dir$
Loop
End Sub
Пояснения к коду:
InsertAllSlides
: Данный субпроцесс отвечает за вставку слайдов. Он собирает все файлы в массив и добавляет их слайды в текущую презентацию, за исключением самой презентации, из которой запущен код.EnumerateFiles
: Эта функция создает массив строк, содержащий пути к файлам, соответствующим заданному шаблону. Она идет по всем файлам в указанной директории и добавляет их в массив, кроме текущей презентации.
Важно:
- Убедитесь, что все файлы .pptx находятся в одной папке с новой презентацией.
- Обратите внимание на используемые расширения файлов. Если у вас есть только .pptx файлы, убедитесь, что фильтр в коде (например,
*.PPTX
) соответствует вашим файлам.
Этот код должен помочь вам автоматически объединить выбранные презентации в одну.