Есть ли будущее у PowerPoint VBA/VSTO?

Кто-нибудь знает, какое будущее ждет программирование VBA/VSTO в PowerPoint? Я работаю над проектом автоматизации Office, и мне неприятно работать с PowerPoint, в частности, потому что он, кажется, на один уровень ниже поддержки VBA, найденной в Excel или Word.

Создается впечатление, что MS пытается поэтапно отказаться от поддержки VBA в PowerPoint, поскольку они отказались от записи макросов в версии 2007, а в объектной модели отсутствует поддержка некоторых ключевых функций.


person Sam Russo    schedule 11.11.2009    source источник
comment
Это очень старо, но для других (таких как я), которые ищут способы работы с PowerPoint (или другими программами Office) программно, это может представлять интерес: github.com/NetOfficeFw/NetOffice   -  person RenniePet    schedule 02.09.2017


Ответы (4)


Я не уверен, что это тот ответ, который вы хотите услышать, но разработка в PowerPoint с помощью VBA на самом деле хороша. Я использую его довольно часто (а также Word и Excel), и он достаточно надежен. OM PowerPoint, которую можно запрограммировать с помощью VBA, обновляется с каждой новой версией PPT. В PPT 2007 вы можете создать собственный XML для любого объекта на слайде — гораздо более мощные возможности, чем в Excel и Word. Напротив, в Word 2007 есть средства управления содержимым, которые, если PPT станет своего рода облегченной заменой Crystal Reports, принесут пользу. В PPT 2010 (бета-версия) вы можете программно создавать SmartArt, например, как в Word/Excel 2010. Вы также можете программно работать с мультимедийными элементами лучше, чем раньше. Однако VSTO, с точки зрения OM, предлагает не намного больше, чем VBA.

Это может зависеть только от ваших потребностей — вы создаете стандартные слайды? Делаете ли вы расширенную анимацию? Вы делаете отчетность? Вы создаете «приложения» для электронного обучения? Если у вас есть конкретные вопросы по OM, мы можем попытаться помочь вам здесь (но, возможно, эта функция просто не существует).

Согласен, что удаление макрорекордера было отстойным, это была полезная функция. Непосредственная работа с PML/DML также является проблемой. Есть вещи, которые я бы хотел, чтобы ОМ также поддерживал. Но, учитывая спелеотуризм, я не верю, что VBA исчезнет в ближайшее время.


ПРИМЕЧАНИЕ: ЭТО НЕ РАБОТАЕТ. ЭТО ПРЕДОСТАВЛЯЕТСЯ ТОЛЬКО В КАЧЕСТВЕ ОТПРАВНОЙ ТОЧКИ, ЕСЛИ ЛЮДИ ХОТЯТ ПОПЫТАТЬСЯ РАЗВИВАТЬ ЭТО В ЧТО-ТО, ЧТО МОЖЕТ РАБОТАТЬ (если вы можете заставить это работать, не стесняйтесь редактировать это сообщение).

  1. Создайте класс под названием «clsPPTEvents».
  2. Вставьте следующий код.

    Public WithEvents PPTEvent As Application
    Private Declare Function GetCursorPos Lib "user32" (ByVal lpPoint As POINTAPI) As Long
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
    Dim ret As Long
    Dim mousePosition As POINTAPI
    Private Sub PPTEvent_WindowSelectionChange(ByVal Sel As Selection)
        Dim ElementID As Long
        Dim Arg1 As Long
        Dim Arg2 As Long
        With Sel
            If .Type = ppSelectionShapes Then
                Dim sr As ShapeRange
                sr = .ShapeRange
                If sr.Type = msoChart Then
                    Dim sh As Shape
                    Dim slideNumber As Integer
                    slideNumber = ActiveWindow.View.Slide.SlideIndex
                    sh = ActivePresentation.Slides(slideNumber).Shapes(sr.Name)
                    Dim crt As Chart
                    crt = sh.Chart
                    H = ActiveWindow.Height
                    w = ActiveWindow.Width
                    ret = GetCursorPos(mousePosition)
                    x = mousePosition.x
                    y = mousePosition.y
                    crt.GetChartElement(x, y, ElementID, Arg1, Arg2)
                    MsgBox("X: " & x & ", Y: " & y & vbNewLine & _
                    "ElementID: " & ElementID & ", Arg1: " & Arg1 & ", Arg2: " & Arg2)
                End If
            End If
        End With
    End Sub
    
  3. В обычном модуле вы можете запустить/остановить обработку события следующим образом:

    Public newPPTEvents As New clsPPTEvents
    Sub StartEvents()
        Set newPPTEvents.PPTEvent = Application
    End Sub
    Sub EndEvents()
        Set newPPTEvents.PPTEvent = Nothing
    End Sub
    

Обратите внимание, что в коде в № 2 это не работает из-за того, что возвращает GetCursorPos, то есть экран X, Y. Глядя на событие, кажется, что GetChartElement хочет получить либо координаты ограничивающей рамки окна или панели, либо только сам график.

person Todd Main    schedule 26.11.2009
comment
Спасибо за ответы отаку и спелеологии! В нашей фирме мы делаем много презентаций со встроенными диаграммами, и это была болезненная разработка. 2007 SP2 улучшил OM (+) и вызвал больше сбоев диаграммы (-), но они по-прежнему оставляли пробелы. Пример: вы можете сказать, что пользователь щелкнул диаграмму, но вы не можете сказать, какой элемент диаграммы выбран. Я еще не пробовал это в 2010 году. - person Sam Russo; 17.12.2009
comment
Я сделал немного больше проверки на этом. Похоже, что, хотя метод GetChartElement доступен в PPT, к нему нельзя (легко?) получить доступ из-за отсутствия какого-либо события, которое предоставило бы правильные (оконные, а не экранные) координаты X, Y. Есть много примеров, которые хорошо работают для Excel, но те же самые не работают в PowerPoint. Я пробовал играть с вызовом API GetCursorPos и ​​событием WindowSelectionChange, чтобы получить значения X, Y, но мне не повезло. Это похоже на полную оплошность со стороны Microsoft, чтобы сделать этот метод доступным, но бесполезным в PowerPoint. - person Todd Main; 29.12.2009

Powerpoint никогда не был популярной платформой для разработки VBA. Я могу понять отказ от функций пользовательского интерфейса для VBA в этом контексте. Очень легко включить поддержку VBA для Powerpoint в силу возможностей Excel и Word, которые не исчезнут в ближайшее время, если вообще исчезнут. Мои деньги будут в долгосрочной перспективе на устаревшую поддержку, с плохой или несуществующей помощью Microsoft для решения проблем.

Помните, что MS занимается обратной совместимостью, и они очень осторожны, когда отказываются от нее.

person caving    schedule 24.11.2009
comment
Я думаю, что эти комментарии во многом верны. Я думаю, что проблема с макрорекордером более сложная. Если вы покопаетесь, вы найдете различные ссылки от Microsoft, в которых говорится, что когда они переделали части диаграммы и формы OM в 2007 году, это повлияло на код записи макросов. - person Anonymous Type; 28.06.2012

Я согласен, что PPT намного ниже других vba. Прежде всего, это кажется ошибочным, см. Странная ошибка в powerpoint vba

Событие модели неудобно, как и отсутствие автоматического выполнения. инициализация объекта приложения в Powerpoint?

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

person user310291    schedule 05.06.2010
comment
Я не согласен с этим ответом. Кажется, вам дали ответ на вопрос, на который вы ссылались... skp.mvps.org/autoevents. htm И почему создание надстройки — это плохо? Почти в любой среде, в которой я работал, вы хотите, чтобы все пользователи имели доступ к коду, поэтому упаковка кода в файл ppt является плохой практикой. - person Anonymous Type; 28.06.2012

См. эту статью, в которой резюмируется, почему VSTO является способ пойти. Сравнимо с VBA для Excel, но то же самое относится и к Powerpoint.

person Bhuvan    schedule 02.01.2012
comment
Ваша статья представляет собой хорошее обсуждение VBA и VSTO; однако это не решает вопрос, связанный с автоматизацией PowerPoint и ее поддержкой. - person Mathias; 02.01.2012
comment
Да, согласен с Матиасом, чувствую, что должен поставить тебе минус, но ссылка была качественной. :) Я уверен, что другие не будут так любезны, если вы оставите свой ответ. се се за ссылку Bhuvan - person Anonymous Type; 28.06.2012
comment
2012 год пришел и ушел, а теперь с Office 2013..... хорошо Программно с использованием DataModel OM Новая объектная модель DataModel (часть объектной модели VBA) позволяет вам программно загружать и обновлять источники данных. - person mooseman; 21.02.2013
comment
Мы обнаружили, что VSTO очень ограничен, и по-прежнему используем старый COM API. Это прекрасно работает, и вы можете написать все это на C#. - person David Thielen; 22.08.2014