VBA не проходит через слайды PowerPoint

Я просто пытаюсь просмотреть слайды PowerPoint, используя следующий код VBA в Excel.

Sub test()

Dim slide As Object


For Each slide In ActivePresentation.Slides

    Debug.Print "test"

Next slide

End Sub

Однако я получаю сообщение "Ошибка выполнения" 424. Требуемый объект». Кто-нибудь знает, почему ActivePresentation.Slides может не работать? Я тоже пытался Dim slide as Slide.

Есть ли какой-то параметр или параметр в PowerPoint, который мне нужно активировать?

Любая помощь приветствуется.

Поскольку вы пытаетесь запустить это из Excel, попробуйте вместо этого Dim sld as Powerpoint.Slide

Tim Stack 08.04.2019 11:10

@TimStack Спасибо, что ответили - «определенный пользователем тип не определен» теперь моя ошибка. Кажется, VBA не распознает Powerpoint.Slide как допустимый формат типа.

Ciaran De Ceol 08.04.2019 11:13

Укажите минимальный воспроизводимый пример, включая код, в котором вы объявляете и присваиваете значение ActivePresentation Если это Excel VBA, у вас нет прямого доступа к объектам PowerPoint.

John Coleman 08.04.2019 11:15

Мне кажется, вы не создаете надлежащую связь между Excel и презентацией Powerpoint, на которую вы ссылаетесь. Это полный код, который вы используете?

Tim Stack 08.04.2019 11:17

@TimStack Действительно, это полный код. И я бы согласился с вами. Я вообще не программист VBA, поэтому не знаю, как сделать эту ссылку.

Ciaran De Ceol 08.04.2019 11:18

Я дам тебе ответ. Подожди

Tim Stack 08.04.2019 11:22

Сначала вам нужно получить приложение PowerPoint с чем-то вроде Set objPPTApp = GetObject(, "PowerPoint.Application")

CLR 08.04.2019 11:26

@TimStack Большое спасибо.

Ciaran De Ceol 08.04.2019 11:28

@CLR я попробую это

Ciaran De Ceol 08.04.2019 11:28
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
9
532
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуй это:

Sub test()

    Dim objPPTApp As Object
    Dim slide As Object

    Set objPPTApp = GetObject(, "PowerPoint.Application")

    For Each slide In objPPTApp.ActivePresentation.Slides

        Debug.Print "test"

    Next slide

End Sub

edit: ошибок больше нет, но теперь ничего не происходит. «тест» не печатается. Это прогресс, так что спасибо.

Ciaran De Ceol 08.04.2019 11:34

Код у меня работает нормально. По глупости закрыли PowerPoint. Оператор печати все еще не печатается по какой-то причине, но это нормально, я просто выбрал msgBox("test"). Спасибо за помощь всем.

Ciaran De Ceol 08.04.2019 11:42

@CiaranDeCeol Я настоятельно рекомендую вам не использовать ActivePresentation, а правильно ссылаться на конкретную презентацию, которую вы собираетесь использовать. Это позволит избежать ошибок при обращении к неправильному представлению, когда другое случайно активировано. Как правило, использование Activate или Select является плохой практикой.

Tim Stack 08.04.2019 11:45

Киаран, чтобы расширить комментарий Тима - ответ выше просто для того, чтобы ваш существующий код работал. Как указывает Тим, в том виде, в каком код существует сейчас, это определенно не лучшая практика. Это действительно зависит от того, хотите ли вы создать что-то, что вы запускаете нечасто, или что-то, что вы хотите автоматизировать и что может решить проблемы, если они возникнут.

CLR 08.04.2019 11:55

@CLR Я абсолютно согласен с вами обоими. Тем не менее, это только для личного использования, чтобы ускорить мой рабочий процесс, поэтому я не особенно беспокоюсь о том, чтобы сделать его пуленепробиваемым.

Ciaran De Ceol 08.04.2019 12:34

VBA должен знать, на какое приложение вы ссылаетесь, чтобы он мог перебирать объекты внутри этого приложения.

1. Откройте редактор VBA

2. На верхней ленте нажмите Tools > References и установите флажок для библиотеки объектов Microsoft PowerPoint X.0.

Теперь вы можете определить приложение PowerPoint и презентацию, на которую хотите сослаться.

Sub ppslides()

Dim pp As Object
Dim slide As Object
Dim PowerPoint As PowerPoint.Application
Set PowerPoint GetObject(, "PowerPoint.Application")


'Loops through each open PP presentation and puts the presentation name in a messagebox
For Each pp In PowerPoint.Presentations
    MsgBox pp.Name
Next pp

'These variables can be populated and used to refer to a specific Presentation in the upcoming loop
ppname = "Example"
ppindex = 1


'Loops through all slides in the presentation and puts their names in a messagebox
'REF should be replaced with a name, index, or one of the above variables
For each slide In PowerPoint.Presentations(REF).Slides
    MsgBox slide.Name
Next slide

End Sub

Это фантастика. Спасибо за то, что поделился этим. Теперь мне интересно, возможно ли вместо этого использовать slide.index или slide.name для маркировки моего вывода, можно ли, например, ссылаться на пользовательский массив имен. testArray = Array('test1','test2','test3') Возможно что-то вроде (псевдокод) MsgBox & i for i в testArray

Ciaran De Ceol 08.04.2019 12:40

Не слишком уверен, чего вы пытаетесь достичь. Вы хотите, чтобы все слайды были напечатаны в одном MsgBox? Просьба уточнить

Tim Stack 08.04.2019 12:47

Это был просто пример на самом деле. На самом деле я успешно экспортирую слайды в .pdf и .jpg. Мой запрос действительно касается пользовательского именования вывода. Я могу использовать slide.name или slide.index. Мне любопытно, можно ли выводить файлы с пользовательскими именами на основе хранения имен в массиве. Опять же, это для личного использования только для печати повторяющегося отчета. Меня не беспокоит жесткое кодирование имен в массиве, поскольку имена слайдов всегда будут оставаться согласованными, а я единственный пользователь.

Ciaran De Ceol 08.04.2019 12:58

Вы могу ссылаетесь на слайды с конкретными именами, учитывая, что они действительно существуют, если вы об этом спрашиваете. Мой код просто возвращает слайды, присутствующие в конкретной презентации, поэтому я не понимаю, почему вместо этого вы хотите вернуть имена, хранящиеся в массиве. Трудно понять, к чему вы стремитесь.

Tim Stack 08.04.2019 13:14

Это, наверное, самый простой способ. Назовите слайды конкретно то есть. Спасибо.

Ciaran De Ceol 08.04.2019 13:22

Возможно, читайте эта веб-страница. Например, вы можете изменить название определенного слайда с помощью PowerPoint.Presentations(1).Slides("Slide1").Name = "NewSlideName"

Tim Stack 08.04.2019 13:31

Это полезная ссылка, спасибо, что поделились. Я ценю помощь.

Ciaran De Ceol 08.04.2019 15:27

Другие вопросы по теме