Я просто пытаюсь просмотреть слайды 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, который мне нужно активировать?
Любая помощь приветствуется.
@TimStack Спасибо, что ответили - «определенный пользователем тип не определен» теперь моя ошибка. Кажется, VBA не распознает Powerpoint.Slide как допустимый формат типа.
Укажите минимальный воспроизводимый пример, включая код, в котором вы объявляете и присваиваете значение ActivePresentation
Если это Excel VBA, у вас нет прямого доступа к объектам PowerPoint.
Мне кажется, вы не создаете надлежащую связь между Excel и презентацией Powerpoint, на которую вы ссылаетесь. Это полный код, который вы используете?
@TimStack Действительно, это полный код. И я бы согласился с вами. Я вообще не программист VBA, поэтому не знаю, как сделать эту ссылку.
Я дам тебе ответ. Подожди
Сначала вам нужно получить приложение PowerPoint с чем-то вроде Set objPPTApp = GetObject(, "PowerPoint.Application")
@TimStack Большое спасибо.
@CLR я попробую это
Попробуй это:
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: ошибок больше нет, но теперь ничего не происходит. «тест» не печатается. Это прогресс, так что спасибо.
Код у меня работает нормально. По глупости закрыли PowerPoint. Оператор печати все еще не печатается по какой-то причине, но это нормально, я просто выбрал msgBox("test")
. Спасибо за помощь всем.
@CiaranDeCeol Я настоятельно рекомендую вам не использовать ActivePresentation
, а правильно ссылаться на конкретную презентацию, которую вы собираетесь использовать. Это позволит избежать ошибок при обращении к неправильному представлению, когда другое случайно активировано. Как правило, использование Activate или Select является плохой практикой.
Киаран, чтобы расширить комментарий Тима - ответ выше просто для того, чтобы ваш существующий код работал. Как указывает Тим, в том виде, в каком код существует сейчас, это определенно не лучшая практика. Это действительно зависит от того, хотите ли вы создать что-то, что вы запускаете нечасто, или что-то, что вы хотите автоматизировать и что может решить проблемы, если они возникнут.
@CLR Я абсолютно согласен с вами обоими. Тем не менее, это только для личного использования, чтобы ускорить мой рабочий процесс, поэтому я не особенно беспокоюсь о том, чтобы сделать его пуленепробиваемым.
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
Не слишком уверен, чего вы пытаетесь достичь. Вы хотите, чтобы все слайды были напечатаны в одном MsgBox? Просьба уточнить
Это был просто пример на самом деле. На самом деле я успешно экспортирую слайды в .pdf и .jpg. Мой запрос действительно касается пользовательского именования вывода. Я могу использовать slide.name или slide.index. Мне любопытно, можно ли выводить файлы с пользовательскими именами на основе хранения имен в массиве. Опять же, это для личного использования только для печати повторяющегося отчета. Меня не беспокоит жесткое кодирование имен в массиве, поскольку имена слайдов всегда будут оставаться согласованными, а я единственный пользователь.
Вы могу ссылаетесь на слайды с конкретными именами, учитывая, что они действительно существуют, если вы об этом спрашиваете. Мой код просто возвращает слайды, присутствующие в конкретной презентации, поэтому я не понимаю, почему вместо этого вы хотите вернуть имена, хранящиеся в массиве. Трудно понять, к чему вы стремитесь.
Это, наверное, самый простой способ. Назовите слайды конкретно то есть. Спасибо.
Возможно, читайте эта веб-страница. Например, вы можете изменить название определенного слайда с помощью PowerPoint.Presentations(1).Slides("Slide1").Name = "NewSlideName"
Это полезная ссылка, спасибо, что поделились. Я ценю помощь.
Поскольку вы пытаетесь запустить это из Excel, попробуйте вместо этого
Dim sld as Powerpoint.Slide