Sam*_*sso 7 powerpoint vba vsto powerpoint-vba
有谁知道PowerPoint中的VBA/VSTO编程的未来是什么?我一直在研究Office自动化项目,发现使用PowerPoint特别令人沮丧,因为它似乎比Excel或Word中的VBA支持低一级.
感觉MS正试图逐步淘汰PowerPoints中对VBA的支持,因为他们在2007版本中放弃了宏录制,而对象模型缺少一些关键功能支持.
我不确定这是否是您想要听到的答案,但使用VBA开发PowerPoint实际上是好的.我做了很多(以及Word和Excel)并且它足够强大.可以使用VBA编程的PowerPoint OM随每个新版本的PPT更新.在PPT 2007中,您可以针对幻灯片上的任何对象创建自定义XML - 远比Excel和Word中可用的选项强大.相比之下,Word 2007具有内容控件,为了使PPT成为某种Crystal Reports轻量级替代品,它将从中受益.例如,在PPT 2010(测试版)中,您可以使用Word/Excel 2010以编程方式创建SmartArt.您还可以以编程方式更好地使用媒体元素.从OM的角度来看,VSTO并不比VBA提供更多的功能.
它可能仅取决于您的需求 - 您是否创建标准子弹幻灯片?你做扩展动画吗?你做报道吗?你在创建电子学习"应用程序"吗?如果您对OM有特定问题,我们可以尝试在这里为您提供帮助(但可能该功能不存在).
同意删除宏记录器的类型,这是一个有用的功能.直接使用PML/DML也很痛苦.有些事情我希望OM也支持.但与洞穴探险同时发生,我不相信VBA会很快消失.
注意:这不起作用.它只是作为一个起点提供,如果民众想要尝试将其发展为可能有用的东西(如果你可以使它工作,请随时编辑这篇文章).
粘贴以下代码.
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
Run Code Online (Sandbox Code Playgroud)在常规模块中,您可以使用以下命令启动/停止事件处理:
Public newPPTEvents As New clsPPTEvents
Sub StartEvents()
Set newPPTEvents.PPTEvent = Application
End Sub
Sub EndEvents()
Set newPPTEvents.PPTEvent = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)请注意,在#2中的代码中,它不起作用,因为GetCursorPos返回的是屏幕X,Y.在查看事件时,看起来GetChartElement想要的是Window或Pane边界框的坐标或只是图表本身.