找回密码
 立即注册
搜索

PPT vba入门教程

10
回复
1246
查看
[复制链接]

4

主题

10

帖子

35

幻币

一流武者

Rank: 3Rank: 3

积分
211
QQ
2014-4-25 09:49:00 显示全部楼层 |阅读模式
PPT vba入门教程
1.Application对象
该对象代表PowerPoint应用程序,通过该对象可访问PowerPoint中的其他所有对象。
(1)Active属性:返回指定窗格是否被激活。
(2)ActivePresentation属性:返回Presentation对象,代表活动窗口中打开的演示文稿。
(3)ActiveWindow属性:返回DocumentWindow对象,代表当前文档窗口。
(4)Presentations属性:返回Presentations集合,代表所有打开的演示文稿。
(5)SlideShowWindows属性:返回SlideShowWindows集合,代表所有打开的幻灯片放映窗
口。
(6)Quit方法:用于退出PowerPoint程序。
2.DocumentWindow对象
该对象代表文档窗口。使用“Windows(index)”语法可返回DocumentWindow对象。
(1)ActivePane属性:返回Pane对象,代表文档窗口中的活动窗格。
(2)Panes属性:返回Panes集合,代表文档窗口中的所有窗格。
(3)ViewType属性:返回指定的文档窗口内的视图类型。[NextPage]
3.Presentation对象
该对象代表演示文稿,通过“Presentations(index)”语法可返回Presentation对象。
(1)BuiltInDocumentProperties属性:返回DocumentProperties集合,代表演示文稿的所有文
档属性。
(2)ColorSchemes属性:返回ColorSchemes集合,代表演示文稿的配色方案。
(3)PageSetup属性:返回PageSetup对象,用于控制演示文稿的幻灯片页面设置属性。
(4)SlideMaster属性:返回幻灯片母版对象。
(5)SlideShowSettings属性:返回SlideShowSettings对象,代表演示文稿的幻灯片放映设置。
(6)SlideShowWindow属性:返回幻灯片放映窗口对象。
(7)AddTitleMaster方法:为演示文稿添加标题母版。(8)ApplyTemplate方法:对演示文稿应用设计模板。
4.SlideShowWindow对象:该对象代表幻灯片放映窗口。
IsFullScreen属性:用于设置是否全屏显示幻灯片放映窗口。[NextPage]
5.Master对象:该对象代表幻灯片母版、标题母版、讲义母版或备注母版。
TextStyles属性:为幻灯片母版返回TextStyles集合,代表标题文本、正文文本和默认文本。
6.Slide对象:该对象代表幻灯片。
(1)SlideID属性:返回幻灯片的唯一标识符。
(2)SlideIndex属性:返回幻灯片在Slides集合中的索引号。
7.SlideShowView对象:该对象代表幻灯片放映窗口中的视图。
(1)AcceleratorsEnabled属性:用于设置是否允许在幻灯片放映时使用快捷键。
(2)CurrentShowPosition属性:返回当前幻灯片在放映中的位置。
(3)DrawLine方法:在指定幻灯片放映视图中绘制直线。
(4)EraseDrawing方法:用于清除通过DrawLine方法或绘图笔工具在放映中绘制的直线。
(5)GotoSlide方法:用于切换指定幻灯片。
powerpoint学习笔记
转自:http://www.rdpslides.com/pptlive/index.html
Sub PowerPointBasics_1()
'PowerPoint的对象模型Ojbect Model(OM)
'模型导航
'每个东东在PowerPoint中都是某个类型的对象
'想操作好PowerPoint,你就要和对象打交道
'有些对象是另外一些对象的集合。
'对象具有属性–用来描述对象的东东
'对象具有方法–对象可以做或你可以对他做什么
'对象模型就是所有PowerPoint对象自成一个体系的集合
'就像一个倒置的树图
'按F2浏览查看对象
'数的最顶层是应用对象(Application)
'就是PowerPoint本身
'应用对象有他的属性
Debug.Print Application.Name
'用Debug.Print代替MsgBox能节省一点时间'我们就不需要点击对话框的“确定”按钮
'Debug.Print的结果输出在VB编辑器环境中的立即窗口中
'如果它没有显示,通过点击菜单“视图”/“立即窗口”或者按Ctrl+G来显示
'.Presentations属性返回当前打开演示文档的一个集合
'我们通过“点”提示来调用它的功能
Debug.Print Application.Presentations.Count
'我们可以指定一个特定的对象
Debug.PrintApplication.Presentations(1).Name
'所以说PowerPoint(即application对象)包含Presentations对象
'Presentations包含Slides对象
'Slides包含Shapes对象,如rectangles和circles。
'所以我们可以自然的这样写:
Debug.PrintApplication.ActivePresentation.Slides(2).Shapes.Count
'但是这么长的引用有些令人乏味
'另一种形式对我们来说更容易一些同时也会让PowerPoint处理的更快一些
'使用With关键字来引用你用的对象..
With ActivePresentation.Slides(2).Shapes(2)
'这样你可以直接引用他的下级功能Debug.Print.Name
Debug.Print.Height
Debug.Print.Width
'最后用End With关键字来表明引用完毕
End With
'我们也可以嵌套着使用
With ActivePresentation.Slides(2).Shapes(2)
Debug.Print.Name
With.TextFrame.TextRange
Debug.Print.Text
Debug.Print.Font.Name
End With
End With
End Sub
Sub PowerPointBasics_2()'控制当前选中的对象
With ActiveWindow.Selection.ShapeRange(1)
Debug.Print.Name'显示对象的名字
End With
'更改名字并移动他:
With ActiveWindow.Selection.ShapeRange(1)
.Name="My favorite shape"'命名对象非常有用
.Left=.Left+72'72像素即1英寸
End With
End Sub
Sub PowerPointBasics_3()
    '控制一个已命名的对象,如果你知道一个对象的名字
    WithActivePresentation.Slides(2).Shapes("My favorite shape")
        .Top=.Top-72
    EndWith'每页幻灯片也可以有名字
    WithActivePresentation.Slides(2)
        .Name="My favorite slide"
    EndWith
'无论我们移动他到那个地方,名字不变
'这样我们就可以方便的操作啦
With ActivePresentation.Slides("My favoriteslide").Shapes("My favorite shape")
    .Height=.Height*2
End With
End Sub
Sub PowerPointBasics_4()
    '对象的引用
    '可以通过变量来保持对对象的引用
    '可能会有些难于理解,不过不用担心
    '参照实例很容易理解的。
    '先看下面的例子:'定义一个变量为某个类型
Dim oShape As Shape
    '让他指向某个特定的对象
    SetoShape=ActivePresentation.Slides("My favorite slide").Shapes("Myfavorite shape")
    '注意我们使用已命名的对象。
    '从现在开始,我们就可以把oShape认作为我们命名的那个对象。
    Debug.PrintoShape.TextFrame.TextRange.Text
    oShape.TextFrame.TextRange.Font.Color.RGB=RGB(255,0,0)
    '直到我们删除这个变量,都可以认为他就是我们命名的那个对象。
    SetoShape=Nothing
End Sub
Sub PowerPointBasics_5()
    '遍历所有的幻灯片
    '遍历所有的对象
Dim x As Long'使用X作为计数器
    Forx=1 To ActivePresentation.Slides.Count'遍历每张幻灯片并打印名字
       Debug.Print ActivePresentation.Slides(x).Name
    Nextx
    WithActivePresentation.Slides(3)
       For x=1 To.Shapes.Count'打印出第三个片上所有图片的名字;
           Debug.Print.Shapes(x).Name
       Next x
End With
End Sub
Sub PowerPointBasics_6()
    '处理异常错误
    '运行下,看看会出现什么现象?
    WithActivePresentation.Slides(42)
       MsgBox("Steve,you moron,there IS no slide 42!")
    EndWith
End Sub
Sub PowerPointBasics_6a()
On Error GoTo ErrorHandler  '设置错误跳转句柄;
    WithActivePresentation.Slides(42)
       MsgBox("Steve,you moron,there IS no slide 42!")
    EndWith
    '后面带有冒号标志的为句柄代码;
    '如果无误,则能进行到这里
    '句柄代码:
    NormalExit:
    ExitSub
    ErrorHandler:’此处即为句柄代码
    MsgBox("Error:"&Err.Number&vbCrLf&Err.Description)
    'resumenext
    'exitsub
    ResumeNormalExit
End Sub
Option Explicit
Public strText As String
Public strOption As String
Sub Forms_1()
    '创建、显示和卸载窗体;
    '窗体是比普通的输入窗口更为复杂的东西。如:
    frmMyForm1.Show
    Debug.PrintfrmMyForm1.TextBox1.Text
    IffrmMyForm1.OptionButton1.Value=True Then
       Debug.Print"Yes"End If
       If frmMyForm1.OptionButton2.Value=True Then
           Debug.Print"Chocolate"
       End If
       If frmMyForm1.OptionButton3.Value=True Then
           Debug.Print"Teal"
       End If
       '下面是卸载窗体
       Unload frmMyForm1
       '但是如果我们想让窗体数据用更久该怎么做?让数据留在窗体中岂不是更有意义?
End Sub
PPT学习论坛
回复

使用道具 举报

3

主题

14

帖子

104

幻币

一流武者

Rank: 3Rank: 3

积分
370
2014-4-25 10:59:31 显示全部楼层
Sub Forms_2()
‘这个例子中使用了全局变量,所以窗体中的数据能一直保持。
Unload frmMyForm2
'让我们看看用户在窗体中指定的值:
'为窗体指定的代码:
Debug.Print strText
Debug.Print strOption
'重复利用代码
'我们可以将窗体输出为一个文件并引入到其他工程中。
End Sub
下面是有关动画技巧的代码:
Option Explicit
'告诉VBA如何调用sleep函数的API
'此函数让VBA停顿数毫秒:
Private Declare Sub SleepLib"kernel32"(ByVal dwMilliseconds As Long)
Sub xYouClicked(oSh As Shape)
Dim oShThought As Shape
    SetoShThought=oSh.Parent.Shapes("Thought")
    '使Thought气球可见;
    oShThought.Visible=True
    '移动到被点击图形的右侧;
    oShThought.Left=oSh.Left+oSh.Width
    '垂直置于被点击图像的上方
    oShThought.Top=oSh.Top-oShThought.Height
    SelectCase UCase(oSh.Name)
Case Is="EENIE"
    oShThought.TextFrame.TextRange.Text="est!"
Case Is="MEENIE"
    oShThought.TextFrame.TextRange.Text="Thisis annoying!"
Case Is="MINIE"
    oShThought.TextFrame.TextRange.Text="Thisis REALLY annoying!!"Case Is="MOE"
    oShThought.Visible=False
    oSh.Parent.Shapes("STOP").Visible=True
End Select
End Sub
Sub yYouClicked(oSh As Shape)
    '这一次我们将使用标签,使其更易于维护
Dim oShThought As Shape
    SetoShThought=oSh.Parent.Shapes("Thought")
    '使气球可见并移动到我们点击的图像处。
    oShThought.Visible=True
    oShThought.Left=oSh.Left+oSh.Width
    oShThought.Top=oSh.Top-oShThought.Height
    '使用标签来收集文本
    oShThought.TextFrame.TextRange.Text=oSh.Tags("Thought")
End Sub
Sub AddATag()
    'Alittle macro to add a tag to the selected shape
Dim strTag As String
    '我们的老伙计输入框获取标签文本...
    strTag=InputBox("Typethe text for the thought balloon","What is the shape thinki
    '如果输入为空则退出。'必须输入东西,否则无法为图像添加标签。
    IfstrTag=""Then
       Exit Sub
    EndIf
    WithActiveWindow.Selection.ShapeRange(1)
       .Tags.Add"Thought",strTag
    EndWith
End Sub
Sub YouClicked(oSh As Shape)'现在为其增加个API的停顿使其过渡的更平滑自然。
Dim oShThought As Shape
    SetoShThought=oSh.Parent.Shapes("Thought")
    '使用标签来提取文本
    oShThought.TextFrame.TextRange.Text=oSh.Tags("Thought")
    '使气球可见并移动到我们点击的图像处。
    oShThought.Left=oSh.Left+oSh.Width
    oShThought.Top=oSh.Top-oShThought.Height
    oShThought.Visible=True
    DoEvents'将控制权交给系统。常用与for循环或do…loop循环中。
    Sleep1000'等待1秒;
    oShThought.Visible=False'使其重新不可见
End Sub
Sub Reset()
'重设我们的陷阱,为下一个粗心的用户做准备;
ActivePresentation.Slides("AnimationTricks").Shapes("STOP").Visible=Fa
ActivePresentation.Slides("AnimationTricks").Shapes("Thought").Visible=
End Sub
Option Explicit
Sub GreenToRed() '绿色转红色
Dim oSh As Shape'幻灯片的对象变量
Dim oSl As Slide
    ForEach oSl In ActivePresentation.Slides
       For Each oSh In oSl.Shapes
           If oSh.Fill.ForeColor.RGB=RGB(0,255,0) Then
                oSh.Fill.ForeColor.RGB=RGB(255,0,0)
           End If
       Next oSh
    NextoSl
End Sub
Sub FolderFull()
    '对于符合我们要求的文件夹中的每个ppt,
    '-打开文件,调用过程函数处理;
    '保存并关闭文件;
Dim strCurrentFile As String'用于单纯文件名的变量;
Dim strFileSpec As String'用于文件扩展名的变量;
    strFileSpec="C:\Documentsand
    Rindsberg\Desktop\PPTLive\Automation\LotsOfFiles\*.ppt"'获取符合要求的第一个文件;
    strCurrentFile=Dir$(strFileSpec)
    '如果未找到符合条件的文件则什么也不做;
    WhileLen(strCurrentFile)>0'持续这一过程,直至再也找不到文件;
    Presentations.Open(strCurrentFile)'打开ppt
    Debug.PrintActivePresentation.Name 可通过修改这句来调用其他的函数,可用同样的代码做其他的任务;
    CallGreenToRed ’调用GreenToRed函数;
    ActivePresentation.SaveAs(ActivePresentation.Path&"\"_
    &"Fixed_"&ActivePresentation.Name)'保存成带FIXED_前缀的新名称;
    '关闭ppt并处理下一个符合条件的文件;
    '如果你不提供新的扩展名,Dir$将会返回符合上前一个要求的文件;
    strCurrentFile=Dir$
    Wend
    注意不要在循环代码中使用dir【此处翻译可能有问题'Note don't use Dir incode that's called from within a loop】,使用时只能是一个Dir,而且一会激活一次。在产品代码中,最好是用于一个非常短的循环或者在一个短的循环中收集文件名,然后使用更有用的数组来处理;
End Sub
PPT学习论坛
回复 支持 反对

使用道具 举报

1

主题

5

帖子

8

幻币

一流武者

Rank: 3Rank: 3

积分
264
QQ
2014-4-25 11:59:33 显示全部楼层
Option Explicit
Sub FolderFullFromArray()'使用数组来收集文件名进行处理
    '这比在循环中使用dir处理文件名更加可靠
Dim rayFileNames()As String
Dim strCurrentFile As String'代表文件名的变量
Dim strFileSpec As String'代表扩展名的变量
    '给出一个在计算机能正常应用的路径值
    strFileSpec="C:\Documentsand
    Rindsberg\Desktop\PPTLive\Automation\LotsOfFiles\*.ppt"
    ReDimrayFileNames(1 To 1)As String'重定义数组维数为1
    strCurrentFile=Dir$(strFileSpec)'获取符合我们要求的第一个文件
    WhileLen(strCurrentFile)>0
    rayFileNames(UBound(rayFileNames))=strCurrentFile'添加到数组
    strCurrentFile=Dir'重定义数组维数
    ReDimPreserve rayFileNames(1 To UBound(rayFileNames)+1)As St
    Wend
    '如果没有文件了,数组只有一个元素,如果还有更多的元素,则最后一个为空
    IfUBound(rayFileNames)>1 Then'去掉最后一个空元素
       ReDim Preserve rayFileNames(1 To UBound(rayFileNames)-1)As St
    Else
       '没有找到文件
       Exit Sub
    EndIf'如果运行到了这里,则我们已经收集好了文件名数组
   
Dim x As Long
    Forx=1 To UBound(rayFileNames)
       Presentations.Open(rayFileNames(x)) '打开ppt文件
       Debug.Print ActivePresentation.Name
       Call GreenToRed'调用过程函数
       ActivePresentation.SaveAs(ActivePresentation.Path&"\"&"Fixed_"& ActivePresentation.Name)
       ActivePresentation.Close
    Nextx
End Sub
这是从宏录制的演示代码,录制宏是对于新手很容易掌握和学习ppt对象模型是如何运作的,但是其不会产生很有用的代码。这表明要获取非常有用的代码,还需要自己去对其进行修改和整理。假设共同的颜色都由绿色转为了红色,有数百个这样填充的ppt需要设置为原来的绿色,首先,你打开一个ppt,选择一个图形,将其颜色由绿色变为红色,并录制了一个宏,到这里结束:
Sub Macro1()
    ActiveWindow.Selection.SlideRange.Shapes("Rectangle5").Select
    WithActiveWindow.Selection.ShapeRange
       .Fill.Visible=msoTrue
       .Fill.ForeColor.RGB=RGB(255,0,102)
       .Fill.Solid
    EndWith
    ActivePresentation.ExtraColors.AddRGB(Red:=255,Green:=0,Blue:=102)
End Sub
但是存在一些问题:它仅仅适用于当前的一张有一个名字为"Rectangle 5"的图形的ppt,仅仅改变这个图形,没有其他的改变如透明度填充,可见性等。而且为ppt调色板增加了额外的颜色。总之,只是改变了当前页ppt的当前的图形的颜色从绿变红。仅仅如此。而且在这个过程中还创设了潜在的一些问题。然而其却向我们展示了如何用VBA代码去改变一个图形的颜色,所以也并不是全无用处。让我们看看能否让其变成更加通用的东西。选择绿色的图形,再录制一个宏,将其改变为红色。
Sub Macro2()
    WithActiveWindow.Selection.ShapeRange.Fill.ForeColor.RGB=RGB(255,0,102)
       .Fill.Visible=msoTrue
       .Fill.Solid
    EndWith
End Sub
这个更好了,好多了,在任何选定的图形,而且事实上在多个选定的图形上都适用。它仍旧设置了一些额外的我们不需要的属性,不过我们可以将这些东西都注释掉。你可以在任何一页ppt上选择所有图形来运行这个宏,不过,最好不要那样做,因为其不仅会将绿色,还会将蓝色、紫色等其他颜色的图形统统变为红色。因此你需要逐张ppt遍历,去选定所有绿色的图形并一遍又一遍的运行这个宏。这些就够了。下面就是你和其他的VBA高手所做的东西:
Sub GreenToRed()
Dim oSh As Shape
Dim oSl As Slide
   
    ForEach oSl In ActivePresentation.Slides'在当前ppt查找每张幻灯片:
       For Each oSh In oSl.Shapes'在每张幻灯片查找每个图形
           
           If oSh.Fill.ForeColor.RGB=RGB(0,255,0)Then'如果图形的填充颜色=纯绿色,就改变其为红色
                oSh.Fill.ForeColor.RGB=RGB(255,0,0)
           End If
       Next oSh
    NextoSl
End Sub
哈哈,弹指之间,数百个ppt中数千的图形的颜色实现了由绿色变为了红色。而且仅仅是改变了我们目标中的绿色图形,而不改变其他的颜色的图形。对带有文本的情况是安全的吗?并非所有的图形内都有文本,如果你试图去访问其中的一个文本属性,ppt将会弹出错误。此外,ppt97创建的文本会出现冲突,虽然它们有保留文本的能力,但当你试图去检查其中的文本时会出现错误。下面是个安全检查函数,用于测试所有可能引发错误的情况,如果没有任何错误,则返回值为Ture。
Public Function IsSafeToTouchText(pShape AsShape)As Boolean
On Error GoTo Errorhandler
    IfpShape.HasTextFrame Then
       If pShape.TextFrame.HasText Then
           If Len(pShape.TextFrame.TextRange.text)>0 Then'若果是个假的形状这里将出现错误
                IsSafeToTouchText=True'安全的情况
                Exit Function
           End If         '长度>0
       End If         '存在文本
    EndIf         '存在文本框
    Normal_Exit:
    IsSafeToTouchText=False
    ExitFunction
    Errorhandler:
    IsSafeToTouchText=False
    ExitFunction
End Function
加载宏PPA文件的路径是什么?如果你需加载额外的加载行,你可能需要将它们放进加载宏的文件夹。但是它在哪里呢?用户可能会从本地磁盘或网络驱动器去安装加载项,因此你不确定加载项和相关的文件到底在哪里。至少不是没有这种情况:
Public Function PPAPath(AddinName asString)As String
    返回找到的加载项的路径,斜杠结尾,没有找到则返回空
Dim x AsInteger
    PPAPath=""
    For x=1 ToApplication.AddIns.count
       If UCase(Application.AddIns(x).Name)=UCase(AddinName)Then
           
           PPAPath=Application.AddIns(x).path&GetPathSeparator'我们找到了
           '不需要去检查其他的加载项
           Exit Function
       End If
    Nextx
    '因此我们从ppt的IDE中运行,而非从PPA中:
    IfPPAPath=""Then
       PPAPath=SlashTerminate(ActivePresentation.path)
    EndIf
End Function
到此算是翻译完了。讲的都是比较简单的ppt的遍历的用法。其实个人认为,ppt的精髓——动画部分的VBA才真正是麻烦的和高级的东西。不过作为入门,这个应该是很有帮助的。
PPT学习论坛
回复 支持 反对

使用道具 举报

2

主题

3

帖子

40

幻币

一流武者

Rank: 3Rank: 3

积分
292
QQ
2014-4-25 12:34:56 显示全部楼层
很好的内容,怎么没人发现?
PPT学习论坛
回复 支持 反对

使用道具 举报

2

主题

11

帖子

9

幻币

一流武者

Rank: 3Rank: 3

积分
218
QQ
2014-4-25 12:56:05 显示全部楼层
顶上去
PPT学习论坛
回复 支持 反对

使用道具 举报

1

主题

8

帖子

46

幻币

江湖少侠

Rank: 2

积分
167
QQ
2014-4-25 13:22:59 显示全部楼层
可以加精了
PPT学习论坛
回复 支持 反对

使用道具 举报

1

主题

9

帖子

87

幻币

江湖少侠

Rank: 2

积分
153
QQ
2014-4-25 13:30:51 显示全部楼层
Application.Presentations.Count
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

11

帖子

22

幻币

江湖少侠

Rank: 2

积分
120
QQ
2014-4-25 13:48:07 显示全部楼层
涨姿势了~
PPT学习论坛
回复 支持 反对

使用道具 举报

2

主题

9

帖子

90

幻币

一流武者

Rank: 3Rank: 3

积分
289
QQ
2014-4-25 14:03:43 显示全部楼层
Application.Presentations.Count
PPT学习论坛
回复 支持 反对

使用道具 举报

5

主题

10

帖子

104

幻币

一流武者

Rank: 3Rank: 3

积分
255
2014-4-25 14:13:38 显示全部楼层
Application.Presentations.Count
PPT学习论坛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册