1.7 VBA之惑
许多人可能认为编写代码是一项神秘而又复杂的工作,同时也充满了疑惑。
↘ 疑惑一:学习VBA困难吗
这是许多初学者学习编程最大的心理障碍,随着时间的发展,所有的编程语言都在朝着极单化方向发展,VBA在这方面走在了前列。从这点上来说,学习VBA是容易的,是编程入门的最佳选择。另一方面,运用VBA编程只需要了解两个内容:一个是VBA语言规范,一个是组件对象(即COM)。VBA的语言规范指定了代码如何编写,执行的方式,而组件对象是可重用的二进制代码,如PowerPoint对象模型。VBA的终极目标是用最简单的语法访问应用程序对象以扩展其功能。
下面的代码,看起来就是这么简单,复杂的代码也不过是这些简单代码的有机排列。所以,学习VBA没有想象中的那么困难,有这种疑虑的人需要的是重塑信心。
'把演示文稿中所有图形的颜色改变为红色 Sub ChangeAllShapeColor() Dim sld As Slide, shp As Shape For Each sld In ActivePresentation.Slides For Each shp In sld.Shapes shp.Fill.ForeColor.RGB=vbRed Next Next End Sub
↘ 疑惑二:为什么要在PPT中使用VBA
对于许多在VBA面前举棋不定的人来说,这是最常见的疑惑。笔者以为,在PPT中使用VBA主要有以下几个主要原因。
①自动完成重复的任务
尽管标准的PowerPoint用户界面(UI)中提供了丰富的功能集,可以完成大部分的任务,但是对于某些任务来说,需要不断地重复执行,而VBA在这方面有无与伦比的优势。
参考下面的代码,体会VBA与手工操作的差异。
'将演示文稿中所有不等于32的字体替换为32 Sub ChangeFontSize() Dim aSlide As Slide Dim aShape As Shape For Each aSlide In ActivePresentation.Slides For Each aShape In aSlide.Shapes ' 图形上有文本框吗? If aShape.HasTextFrame Then ' 文本框中有文本吗? If aShape.TextFrame.HasText Then ' 文本是否小于32,是则改变为32 If aShape.TextFrame.TextRange.Font.Size <>32 Then aShape.TextFrame.TextRange.Font.Size=32 End If End If End If Next Next End Sub
不用多说,你肯定有自己的答案了。
②让操作更准确,更快捷
在PowerPoint中,对一系列图形进行规则性排列是一项常见的任务,虽然利用鼠标也可以胜任,但是非常费时且不易精确控制,并且还达不到理想的效果,此时VBA可以大显身手。
参考下面的代码,是不是感觉到还是使用VBA来处理更迅速,更精确。
Const pi=3.1415926 Sub 排列图形() Dim tShp As Shape Set tShp=ActivePresentation.Slides(1).Shapes ("TempShp") Dim x0 As Single Dim y0 As Single Dim w0 As Single Dim h0 As Single '图形的中心点 x0=tShp.Left+tShp.Width / 2 y0=tShp.Top+tShp.Height / 2 w0=tShp.Width / 2 h0=tShp.Height / 2 Dim shps As ShapeRange Dim shp As Shape Set shps=ActiveWindow.Selection.ShapeRange Dim angle As Single '角度 angle=360 / shps.Count Dim x As Single Dim y As Single Dim i As Integer For Each shp In shps '图形的位置 x=x0+w0 * Cos(i * angle * pi / 180) y=y0+h0 * Sin(i * angle * pi / 180) shp.Left=x - shp.Width / 2 shp.Top=y - shp.Height / 2 i=i+1 Next End Sub
图1-12见证了奇迹的产生:
图1-12
③与用户交互
现在的演示文稿越来越重视交互的作用,交互让沟通由单向变为双向,使用VBA将极大地增强PPT在交互方面的功能。
参考下面的代码,这样的交互是不是智能多了。
' 演示答案选择的对错 Public Sub Selectda(ByVal shp As Shape) Dim txtda As String, shpdui As Shape, shpcuo As Shape txtda=shp.TextFrame.TextRange.Text ' 获取所单击形状中的文本 Set shpdui=ActivePresentation.Slides(1).Shapes("对") '在答案对错时显示对错图片 Set shpcuo=ActivePresentation.Slides(1).Shapes("错") '对答案进行判断 Select Case txtda Case"100" '对时显示对图片 shpdui.Left=shp.Left+shp.Width+10 shpdui.Top=shp.Top shpdui.Visible=True shpcuo.Visible=False Case Else '错时显示错图片 shpcuo.Left=shp.Left+shp.Width+10 shpcuo.Top=shp.Top shpdui.Visible=False shpcuo.Visible=True End Select End Sub
上面代码的执行结果如图1-13所示。
图1-13
上面的代码实现的是一个很神奇的过程,如果你学会了VBA,比这神奇的效果还有很多。VBA是一个工具,是一个不断创造惊奇的工具。
④为PPT增加新的功能
如果希望在PPT演示的过程中,任意拖动所选择的对象,以展现某个图形的构建过程或者演示某个业务进程,使用VBA就能轻松实现,PPT本身是没有这项功能的。
下面的VBA代码可以轻松地解决这个问题。
'在所拖动的对象上设置这个动作 'sh表示所要拖动的对象 Sub DragandDrop(sh As Shape) dragMode=Not dragMode '是否处于拖动模式,如果是就拖动它 If dragMode Then Drag sh End Sub
详细代码见本书盘,对象拖动效果图如图1-14所示。
⑤与其他Office应用程序交互
在PPT中使用VBA可以很方便地访问其他的Office应用程序,例如我们可以读取Excel中的数据在PPT中建立精美的图表,也可以根据Word中的文本自动生成若干个幻灯片。
⑥增强职场安全感
图1-14
现在的职场竞争非常激烈,每个人都在不断地给自己充电,以提高工作的效率和能力,VBA对于经常使用Office的办公一族来说就是能力的证明,能让你高效而轻松地工作,从而获得同事的尊敬和上司的肯定,极大地增强了你在职场中的安全感。
在PowerPoint中使用VBA的理由有千万种,它们驱动着人们的创造力和生产力。
↘ 疑惑三:VBA的末日到了
即使微软不再授权VBA许可证,并建议开发人员转往VSTO,而且也有人在不断鼓吹“VBA末日论”的观点,但我以为VBA的末日还远未来到,主要有以下几个原因。
目前基于VBA的解决方案有成千上万个,微软还没有找到好的迁移策略可以让现有的VBA代码轻松迁移到其他的平台。
①使用VBA更容易实现Office应用程序操作的自动化,且所需的代码较少。
②VBA的代码不需要部署庞大的.net框架,使用起来更容易,更直接。
③并不是所有的解决方案都需要写成COM,对于少量的代码来说更是如此。
④到目前为止,VBA是唯一可以在Office文档中嵌入代码的语言。
所以,VBA还将在很长的时间内生存下来,没有必要担心什么末日的问题。即使有朝一日VBA被抛进了历史的垃圾堆中,也并不代表你所学习的VBA知识毫无用处,VB.net秉承了VBA多数的特性,只需要了解两者之间并不太多的区别,你就能很快地由VBA转向VB.net,甚至其他的语言。