Как в vba powerpoint определить активный слайд
Я нашел другие вопросы на этом форуме (например, здесь), которые указывают на то, что ответ заключается в использовании событий OnSlideShowPageChange или slideshowextslide. Однако мне кажется, что эти события не срабатывают.
У меня есть следующий код в модуле в моей презентации
Но я даже никогда не видел этот первый msgBox «здесь». есть идеи, где я ошибаюсь?
Используемый мной файл находится по адресу здесь. Пытался вставить некоторые текстовые поля и комментарии к коду, чтобы было понятно, что я хочу сделать.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 2
У вас есть некоторые ошибки компиляции. В редакторе VB выберите Отлаживать > Скомпилируйте проект VBA, и вы увидите, что:
Замените два экземпляра End на End If .
РЕДАКТИРОВАТЬ:
Судя по предоставленному файлу, произошла ошибка времени выполнения. MsgBox "slideshow index is " & sld.SlideIndex приходит до Set sld = . . Поменяйте порядок двух.
Кроме того, измените Set sld = Application.ActiveWindow.View.Slide на Set sld = ActivePresentation.SlideShowWindow.View.Slide
Обратите внимание, что поиск InStr по умолчанию чувствителен к регистру. Измените InStr(1, boxText, "10 Seconds") на InStr(1, boxText, "10 seconds") или просто InStr(boxText, "10 seconds") , так как вы используете строчные буквы «секунды».
Возможно, вы захотите переместить shp.TextFrame.TextRange.Text = "10 seconds" после Next i , чтобы убедиться, что текст shp сброшен. При тестировании презентация заканчивалась до того, как текст можно было сбросить на последнем слайде. Код можно настроить так, чтобы он обрабатывал случай с последним слайдом и следовал вашему исходному подходу для всех остальных слайдов.
Полный код:
Дух. Да, у меня есть функция паузы. она все еще работает неправильно, но, по крайней мере, я попадаю в обработчик событий. Спасибо! Я гораздо лучше знаком с VBA в Excel, чем в PowerPoint.
Я так же догадался о функции паузы - я это отредактирую. Я тоже гораздо лучше знаком с Excel, чем с PowerPoint.
Добавлена ссылка на файл, который я использую в OP
Смотрите правки. Надеюсь, это то, что вы ищете.
OnSlideShowPageChange по какой-то причине не всегда срабатывает. Исправление заключается в добавлении элемента управления ActiveX на один из слайдов презентации; он может сесть со слайда, если хотите. Если по какой-то причине он ломается, используйте исправление, которое работает по какой-то другой причине. Жизнь в PowerPointLand. ;-)
@SteveRindsberg, это странно. спасибо за подробности.
@BigBen спасибо . Я постараюсь заняться этим сегодня вечером. Похоже, я сделал несколько довольно глупых ошибок :)
Нет ничего такого, что не решит небольшая отладка. Я заставил его работать на моем конце - см. здесь.
@jerH Да, вам нужны гаджеты в группе «Управление» на вкладке «Разработчик». Если BigBen заработал, пожалуйста, опубликуйте результаты здесь, чтобы все было аккуратно упаковано в одну тему. Спасибо!
Представляет слайд. Коллекция Slides содержит все объекты Slide в презентации.
Примечания
Не путайтесь, если вы пытаетесь вернуть ссылку на один слайд, но в итоге у вас будет объект SlideRange . Один слайд может быть представлен либо объектом Slide , либо slideRangecollection, который содержит только один слайд, в зависимости от того, как вы возвращаете ссылку на слайд. Например, если вы создаете и возвращаете ссылку на слайд с помощью метода Add , слайд представлен объектом Slide . Однако если вы создаете и возвращаете ссылку на слайд с помощью метода Дубликат , слайд представлен коллекцией SlideRange , которая содержит один слайд. Так как все свойства и методы, применимые к объекту Slide , также применяются к коллекции SlideRange , которая содержит один слайд, вы можете работать с возвращенным слайдом таким же образом, независимо от того, представлен ли он объектом Slide или коллекцией SlideRange .
В следующих примерах описано, как:
Возвращение слайда, указываемого по имени, номеру индекса или номеру слайд-номера
Возвращение слайда в выборе
Возвращение слайда, который в настоящее время отображается в любом окне документа или окне отображения слайдов, которое вы указали.
Создайте новый слайд
Пример
Используйте слайды (индекс), где индекс — это имя слайда или номер индекса, или используйте Slides.FindBySlideID (индекс), где индекс — это номер слайда, чтобы вернуть один объект Slide. В следующем примере устанавливается макет слайда в активной презентации.
В следующем примере устанавливается макет слайда с ID-номером 265.
Чтобы вернуть один объект Slide, используйте Selection.SlideRange (index), где индексом является имя слайда или номер индекса в выборе. В следующем примере устанавливается макет слайда в выборе в активном окне при условии, что выбран по крайней мере один слайд.
Если выбран только один слайд, вы можете использовать Selection.SlideRange для возврата коллекции SlideRange , которая содержит выбранный слайд. В следующем примере устанавливается макет слайда в текущем выборе в активном окне при условии, что выбран ровно один слайд.
Используйте свойство Slide , чтобы вернуть слайд, отображаемый в указанном окне документа или окне отображения слайдов. В следующем примере копируется слайд, который в настоящее время отображается в окне документа два в буфер обмена.
Используйте метод Добавить , чтобы создать новый слайд и добавить его в презентацию. В следующем примере в начале активной презентации добавляется слайд заголовка.
Методы
Свойства
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
I would like to perform following code, but make it runnable out of Excel!
Is there any chance to get the selected slide index without putting a macro into the PowerPoint file?
The Goal is basicly to allow the user to slected a certain Position in an core presentation and add slides out of a cloud into the certain Position, which he selected.
Does your code have a handle on the PowerPoint Application object? Your question would be easier to answer if you included the code you've got. Try pptApp.ActiveWindow.Selection.SlideRange.SlideIndex , where pptApp is the PowerPoint Application instance.
BTW, ActiveWindow.Selection.SlideRange.SlideIndex will throw an error if more than one slide is selected, or if no slide is selected (as can happen when the cursor is between slides in sorter view or in the thumbnail pane). Specifying the first slide in the range will solve the first problem: ActiveWindow.Selection.SlideRange(1).SlideIndex and forcing the view to Normal and back will generally force the selection onto the slide just prior in the second case.
2 Answers 2
Please try to use a possibly running instance of PowerPoint by this:
I added a VBA reference to "Microsoft PowerPoint x.x Object Library" for early binding and intellisense.
Here's the late binding alternative:
Here is an explanation of the early/late binding difference. If you want to implement both via conditional compilation as suggested in the comments, I found an explanation here.
Why use CreateObject(progId-that-hits-the-registry-to-locate-the-type) instead of New PowerPoint.Application , since the type is bound at compile-time?
If you meant to use the code late-bound, it would make for better example if you used conditional compilation to support both late and early binding just by setting a flag.
thank you guys a thousend times. Realy appreciate the Help!! Using the variable i bounded to PowerPoint application instead of the one that is linked to the presentation itself did the job for me !!
This is the Code i use now:
That code is dangerously ambiguous about what instance of PPT it's working with. Why to you need ppApp , when PowerPoint is already an active PowerPoint.Application instance? And if the PPT type library is referenced, you don't need to CreateObject , it's uselessly inefficient. just New it up. When the code stops running, make sure you bring up Task Manager and verify that all powerpoint.exe processes have cleanly exited. I suspect the PowerPoint instance might never exit if this code runs while PowerPoint is already open. Anyway, glad you got it working.
@MathieuGuindon As far as the best way of doing this, your suggestions are on target. But FWIW, PPT normally fire up multiple instances of itself, unlike Excel/Word. Checking TaskMan can be a bit misleading with some versions of PPT. If you have Win Explorer set to view previews and select a PPT file, the preview process will fire up a hidden instance of powerpnt.exe (it's powerpnt, not powerpoint, btw). Which can sometimes cause strange other problems because PPT knows it can only have one instance of itself and gets an upset tummy when there are two.
Я хотел бы выполнить следующий код, но сделать его работающим из Excel!
Есть ли шанс получить индекс выбранного слайда, не помещая макрос в файл PowerPoint?
Цель состоит в том, чтобы позволить пользователю выбрать определенную позицию в основной презентации и добавить слайды из облака в определенную позицию, которую он выбрал.
Есть ли в вашем коде дескриптор объекта PowerPoint Application ? На ваш вопрос было бы легче ответить, если бы вы включили код, который у вас есть. Попробуйте pptApp.ActiveWindow.Selection.SlideRange.SlideIndex , где pptApp — экземпляр PowerPoint Application .
Кстати, ActiveWindow.Selection.SlideRange.SlideIndex выдаст ошибку, если выбрано более одного слайда или если не выбран ни один слайд (что может произойти, когда курсор находится между слайдами в режиме сортировщика или в области эскизов). Указание первого слайда в диапазоне решит первую проблему: ActiveWindow.Selection.SlideRange(1).SlideIndex и принудительное переключение вида на обычный и обратно, как правило, принудительно выделит слайд, предшествующий во втором случае.
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 2
Пожалуйста, попробуйте использовать возможно запущенный экземпляр PowerPoint следующим образом:
Я добавил ссылку VBA на «Библиотеку объектов Microsoft PowerPoint x.x» для раннего связывания и intellisense.
Вот альтернатива позднего связывания:
Здесь — это объяснение разницы между ранним и поздним связыванием. Если вы хотите реализовать оба с помощью условной компиляции, как это предлагается в комментариях, я нашел объяснение здесь.
Зачем использовать CreateObject(progId-that-hits-the-registry-to-locate-the-type) вместо New PowerPoint.Application , если тип привязывается во время компиляции?
Если вы намеревались использовать код с поздней привязкой, было бы лучше, если бы вы использовали условную компиляцию для поддержки как поздней, так и ранней привязки, просто установив флаг.
@Mathieu Спасибо, что указали мне на эту разницу между CreateObject и New - только что отредактировал.
ppApp.ActiveWindow.Selection.SlideRange(1) возвращает ошибку, если ничего не выбрано
@ThierryDalonДа, спасибо. Я просто добавил проверку, если выбран слайд.
спасибо ребята тысячу раз. Очень ценю помощь!! Использование переменной, которую я привязал к приложению PowerPoint, вместо той, которая связана с самой презентацией, помогло мне!!
Это код, который я использую сейчас:
Этот код опасно двусмыслен в отношении того, с каким экземпляром PPT он работает. Зачем вам ppApp , когда PowerPoint уже активен PowerPoint.Application инстанс? И если есть ссылка на библиотеку типов PPT, вам не нужно CreateObject , это бесполезно неэффективно. просто New поднимите ее. Когда код перестанет работать, убедитесь, что вы открыли диспетчер задач и убедитесь, что все процессы powerpoint.exe завершились без ошибок. Я подозреваю, что экземпляр PowerPoint никогда не завершится, если этот код запустится, когда PowerPoint уже открыт. В любом случае, рад, что у вас все заработало.
Спасибо за ваш вклад, есть несколько улучшений в коде!
@MathieuGuindon Что касается лучшего способа сделать это, ваши предложения попадают в цель. Но FWIW, PPT обычно запускает несколько экземпляров самого себя, в отличие от Excel/Word. Проверка TaskMan может немного ввести в заблуждение в некоторых версиях PPT. Если у вас установлен Win Explorer для просмотра предварительного просмотра и выбора файла PPT, процесс предварительного просмотра запустит скрытый экземпляр powerpnt.exe (кстати, это powerpnt, а не powerpoint). Иногда это может вызвать странные другие проблемы, потому что PPT знает, что может иметь только один экземпляр самого себя, и расстраивается, когда их два.
Я хотел бы выполнить следующий код, но сделать его работоспособным из Excel!
Есть ли шанс получить выбранный указатель слайдов, не вставляя макрос в файл PowerPoint?
Основная цель состоит в том, чтобы позволить пользователю выбрать определенную позицию в основной презентации и добавить слайды из облака в определенную позицию, которую он выбрал .
Есть ли в вашем коде дескриптор Application объекта PowerPoint ? На ваш вопрос будет легче ответить, если вы включите код, который у вас есть. Попробуй pptApp.ActiveWindow.Selection.SlideRange.SlideIndex , где экземпляр pptApp PowerPoint Application .
Кстати, ActiveWindow.Selection.SlideRange.SlideIndex выдаст ошибку, если выбрано более одного слайда или если ни один слайд не выбран (что может случиться, когда курсор находится между слайдами в режиме сортировки или на панели эскизов). Указание первого слайда в диапазоне решит первую проблему: ActiveWindow.Selection.SlideRange (1) .SlideIndex и принуждение вида к нормальному и обратному режиму, как правило, заставит выделение на слайде непосредственно перед во втором случае.
Пожалуйста, попробуйте использовать возможно работающий экземпляр PowerPoint следующим образом:
Я добавил ссылку VBA на «Библиотеку объектов Microsoft PowerPoint xx» для раннего связывания и intellisense.
Вот альтернатива позднего связывания:
Вот объяснение разницы между ранним и поздним связыванием. Если вы хотите реализовать и то, и другое с помощью условной компиляции, как было предложено в комментариях, я нашел здесь объяснение .
Зачем использовать CreateObject(progId-that-hits-the-registry-to-locate-the-type) вместо New PowerPoint.Application , если тип привязан во время компиляции?
Если вы намеревались использовать код с поздним связыванием, лучше было бы, если бы вы использовали условную компиляцию для поддержки как позднего, так и раннего связывания, просто установив флаг.
@Mathieu Спасибо, что указали мне на это различие CreateObject и New - только что отредактировали его.
спасибо, ребята, тысячу раз . Очень ценю помощь !! Использование переменной, которую я привязал к приложению PowerPoint вместо той, которая связана с самой презентацией, помогло мне !!
Вот код, который я использую сейчас:
Этот код опасно неоднозначен в отношении того, с каким экземпляром PPT он работает. Зачем вам нужен ppApp , когда PowerPoint уже есть активный PowerPoint.Application экземпляр? И если имеется ссылка на библиотеку типов PPT, в этом нет необходимости CreateObject , это бесполезно неэффективно . просто New вверх. Когда код перестанет работать, убедитесь, что вы открыли диспетчер задач и убедитесь, что все процессы powerpoint.exe завершились корректно. Я подозреваю, что PowerPoint экземпляр никогда не завершится, если этот код будет запущен, пока PowerPoint уже открыт. В любом случае, рад, что у вас все получилось.
@MathieuGuindon Что касается наилучшего способа сделать это, ваши предложения попадают в цель. Но FWIW, PPT обычно запускает несколько экземпляров самого себя, в отличие от Excel / Word. Проверка TaskMan может немного ввести в заблуждение с некоторыми версиями PPT. Если у вас установлен Win Explorer для просмотра превью и выбора файла PPT, в процессе предварительного просмотра запустится скрытый экземпляр powerpnt.exe (это powerpnt, а не powerpoint, кстати). Что иногда может вызывать другие странные проблемы, потому что PPT знает, что может иметь только один экземпляр самого себя, и вызывает расстройство живота, когда их два.
Читайте также: