2009-11-11 41 views
7

有沒有人知道未來在PowerPoint中使用VBA/VSTO編程的前景?我一直在研究一個Office自動化項目,並且發現使用PowerPoint尤其令人沮喪,因爲它似乎比Excel或Word中的VBA支持低一級。PowerPoint VBA/VSTO有未來嗎?

感覺MS正試圖逐步停止PowerPoint中的VBA支持,因爲他們在版本2007中刪除了宏記錄,並且對象模型缺少一些關鍵功能支持。

+0

這是很老,但對於其他人(如我自己)看對於以編程方式使用PowerPoint(或其他Office程序)的方式,可能會感興趣:https://github.com/NetOfficeFw/NetOffice – RenniePet 2017-09-02 10:40:08

回答

8

我不確定這是否是您想要聽到的答案,但使用VBA進行PowerPoint開發實際上是不錯的。我做了一些(以及Word和Excel),它足夠強大。使用VBA編程的PowerPoint OM可以使用PPT的每個新版本進行更新。在PPT 2007中,您可以根據幻燈片上的任意對象創建自定義XML - 這比Excel和Word中提供的選項功能要強大得多。相比之下,Word 2007擁有內容控制功能,爲了讓PPT成爲某種水晶報表的輕量級替代品,它將從中受益。在PPT 2010(測試版)中,您可以像使用Word/Excel 2010一樣以編程方式創建SmartArt。您還可以以編程方式更好地處理媒體元素。從OM的角度來看,VSTO雖然不提供比VBA更多的功能。

它可能只是取決於您的需求,但 - 您是否創建標準的子彈幻燈片?你做擴展動畫嗎?你做報告嗎?您是否在創建電子學習「應用程序」?如果你對OM有特定的問題,我們可以嘗試在這裏幫助你(但也許這個功能根本不存在)。

一致認爲,刪除宏記錄器類吸,這是一個有用的功能。直接與PML/DML合作也很痛苦。有些事情我希望OM也支持。但是,在同意放棄的同時,我不認爲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想要的是窗口或窗格邊界框的座標或圖表本身。

+0

感謝回覆宅男和洞穴!在我們公司,我們用嵌入式圖表做了大量的演示,這是一個令人痛苦的發展。 2007 SP2改進了OM(+)並導致更多圖表崩潰( - ),但它們仍然留下空白。例如:你可以知道用戶點擊了一個圖表,但你不知道選擇了哪個圖表元素。我還沒有在2010年嘗試過。 – 2009-12-17 15:49:47

+0

我已經做了更多的檢查。看起來雖然GetChartElement方法在PPT中可用,但由於缺少可提供適當(窗口,非屏幕)X,Y座標的事件,因此無法訪問它(很容易?)。有很多適用於Excel的示例,但是相同的示例在PowerPoint中不起作用。我嘗試過使用GetCursorPos API調用和WindowSelectionChange事件來獲取X,Y值,但沒有多少運氣。這確實看起來像是微軟完全忽略了這種方法,但在PowerPoint中變得毫無用處。 – 2009-12-29 01:34:45

4

Powerpoint從未成爲VBA開發的流行平臺。在這種情況下,我可以理解爲VBA丟棄UI功能。 Tt很容易在Excel和Word的強大功能中包含對Powerpoint的VBA支持 - 即使這樣也不會很快消失。從長遠來看,我的資金將得到傳統支持,微軟對於問題的幫助可能微乎其微。

請記住,MS是關於向後兼容性 - 他們非常小心,當他們放棄它。

+0

我認爲這些評論大體上是正確的。我認爲宏錄像機的問題雖然比較複雜。如果你挖掘,你會發現來自微軟的各種參考文獻,指出當他們重新繪製圖表並在2007年塑造OM的部分時,這會對宏記錄器代碼產生影響。 – 2012-06-27 22:27:47

1

我同意PPT遠低於其他vba。首先它似乎馬車看到 Weird bug on powerpoint vba

型號事件是尷尬一樣,沒有自動執行 How to automatically trigger the App Object initialization in Powerpoint?

auto_open可能只有circumvoluted方式創建用戶的哪些誰接收你的PPT,不知道怎麼的插件安裝插件:(

+0

我不同意這個答案。看起來你在給你鏈接的問題上給出了答案...... http://skp.mvps.org/autoevents.htm另外爲什麼創建一個插件是一件「壞事」?幾乎在我工作的任何環境中,都希望確保所有用戶都能訪問代碼,因此使用ppt文件打包代碼是一種不好的做法。 – 2012-06-27 22:29:46

0

的總結爲什麼VSTO是要走的路看到這個article。用VBA將Excel,但同樣的道理也適用於簡報了。

+0

您的文章是關於VBA與VSTO的良好討論;然而,這並沒有解決這個問題,該問題圍繞着PowerPoint自動化及其支持。 – Mathias 2012-01-02 01:09:15

+0

是啊同意Mathias,覺得我真的應該低估你,但鏈接是質量。 :)如果你留下你的答案,我肯定其他人不會那麼善良。 xie xie鏈接Bhuvan – 2012-06-27 22:33:05

+0

2012已經過去了,現在已經與Office 2013 .....以編程方式使用DataModel OM 新的DataModel對象模型(VBA對象模型的一部分)使您能夠以編程方式加載和刷新數據源。 – mooseman 2013-02-20 20:35:48