Excel资讯 技术 技巧 资源 应用 ……及其他技术

来源:互联网 发布:ios10.3添加蜂窝数据 编辑:程序博客网 时间:2024/06/06 14:09
导读:
  RibbonX:自定义Office 2007功能区
  第4章 介绍VBA阅读笔记
  对于有一定VBA基础的人来说,本章较简单。因此,我的笔记相对也较简单,只是对内容进行粗略地概述,或者记下需要注意的事项及关键点。
  ————————————————————
  使用XML可以自定义功能区,然而,要创建真正的自定义解决方案,需要添加功能,此时就需要VBA啦。
  开始学习VBA
  学习VBA的一些基本原理和编程规则。
  一般而言,在Excel和Word中VBA过程的一组指令称作宏。然而,Access同时有称作宏的对象,提供了一些预先确定的在工程中容易使用的指令。因此,不应该将Excel和Word的宏与Access的宏相混淆。此外,在Excel和Word中有宏录制器,而Access则没有。然而,Access 2007有一个非常好的宏设计器,包括为用户提供的宏名、条件、动作、参数、批注等字段。并且,从Access 2007开始,Access向导产生宏代替VBA代码。
  虽然VBA不是用于编程Ribbon的唯一语言(也可以使用诸如C#、C++、VB.Net和VB),但本书只探讨VBA,因为VBA不仅强大,而且对拥有Microsoft Office的每个人都是可用的。
  1、什么是VBA
  VBA是一种编程语言,能够使人们处理使用内置工具不可能完成的功能,并且VBA常用于改进和自动化某项任务。
  一般说来,对于Excel和Word,VBA能够被分成两类代码:可录制的代码和不可录制的代码。这两类代码不会应用到Access,因为它没有提供宏录制功能。此外,虽然Access向导产生宏,但向导没有联系到Ribbon定制。因此,使用Access的讨论和示例大多数取决于VBA,但也有一些示例展示如何使用Access宏对象。
  2、启用宏的文档
  在需要代码的功能区定制中,由于需要允许运行宏,因此应该将Excel工作簿和Word文档保存为启用宏的文档。
  3、使用Visual Basic Editor(VBE)
  在VBE中编写VBA代码。VBE窗口中重要的元素包括:
  (1)代码窗口─—输入VBA代码的地方或者放置录制的代码的地方。每个主要的对象都有自已的代码窗口。标准模块和类模块也有自已的代码窗口。
  (2)代码窗口关闭按钮─—使用该按钮关闭一个打开对象的代码窗口。
  (3)代码窗口最大化/恢复按钮─—使用该按钮最大化/恢复某对象的代码窗口。
  (4)代码窗口最小化按钮─—使用该按钮最小化打开对象的代码窗口
  (5)立即窗口─—使用立即窗口调试按钮。从代码中发送结果到这个窗口或者可以直接在窗口中输入指令
  (6)菜单栏─—VBE菜单栏仍然保留与以前版本相同,不仅是内容而且外观
  (7)工程资源管理器─—工程对象的容器
  (8)属性窗口─—显示当前对象的可用属性
  (9)标题栏─—如果不清楚代码窗口指向的对象,看看标题栏,这里有它的名称
  (10)工具栏─—包含有用的命令,帮助更容易编写代码
  (11)VBE关闭按钮─—使用该按钮关闭VBE工作环境
  (12)VBE最大/恢复按钮─—使用该按钮来最大化/恢复VBE工作环境
  (13)VBE最小化按钮─—使用该按钮最小化VBE工作环境
  为Excel和Word录制宏
  了解Excel或Word对象模型最好的方式是录制宏。
  录制宏时在Excel和Word之间一个重大的区别是,当录制操作时Excel允许使用鼠标,相反Word仅录制输入。这意味着虽然能够在Excel中使用鼠标选择文本,然后执行对文本的某种操作,并且这些过程将被录制,但是在Word中录制宏时不能在文档窗口使用鼠标。
  虽然在文档中不能使用鼠标执行操作,但是可以使用鼠标选择功能区中的命令和/或选择UI中的元素。
  1、一个录制示例
  本节介绍一个录制宏的简单示例。假设在Excel中有某项计算,总要插入一个特定的批注。可以录制与插入批注相关的操作,然后重复利用该宏,而不需要每次都输入相同的批注。
  (1)在“开发工具”选项卡的“代码”组中,单击“录制宏”,打开“录制新宏”对话框。
  (2)输入宏名,这里使用“InsertComment”。
  (3)指定快捷键,这里使用Ctrl+Shift+C。
  (4)单击“确定”开始录制。
  (5)选择需要插入批注的单元格。
  (6)单击“审阅”选项卡的“批注”组中的“新建批注”。
  (7)输入批注,这里是“This is the comment!”。
  (8)完成后,单击“开发工具”选项卡的“代码”组中的“停止录制”。
  现在,应该在VBE中看到如下图所示的窗口:
  
  
  2、编辑录制的宏
  录制的宏将总是在单元格C4中插入批注,而现在想将批注插入到所选择的单元格中。并且,将试图覆盖已存在的批注时,将会产生错误。
  因此,现在需要修改录制的代码,使代码为重复使用切实可行。此时,需要:(1)在添加新批注之前删除旧的批注;(2)确保批注总是可见的。代码如下:
  Sub InsertComment()
  ‘InsertComment Macro
  ‘快捷键: Ctrl+Shift+C
   Range(”C4″).Comment.Delete
   Range(”C4″).AddComment
   Range(”C4″).Comment.Visible = True
   Range(”C4″).Comment.Text Text:=”fanjy:” &Chr(10) &“This is a comment!”
  End Sub
  由于在单元格C4中已经存在批注,因此在插入新批注前使用Comment对象的Delete方法将之清除。然而,如果在该单元格中没有批注,则会产生错误(后面将会介绍错误处理)。要在活动单元格中放置批注,则在代码中使用ActiveCell替换Range(“A1”)。
  注意,Comment对象没有Add方法,而是AddComment方法。可以直接使用该方法添加批注,如:Range(“A1”).AddComment (“fanjy:” &Chr(10) &“This is a comment!”)
  3、在录制后编辑宏选项
  在Excel和Word中稍有不同。在Word中需要调用“Word选项”中的“自定义”选项卡。
  子过程和函数
  1、对象模型(OM)
  (1)最高级别的对象是Application对象,通常称之为根对象。
  (2)对象模型基本上是一组对象和对象的集合,公开用于执行各种各样操作的属性和方法。
  (3)为使用对象模型,理解概念和语法是重要的。
  (4)例如,假设希望在Word文档中添加一个表格,必须包含从根对象到希望使用的对象的完整路径:
  Application.Documents(“Document1”).Tables.Add
  (5)也能够使用低层级对象的Parent属性,从底层级的对象到高层级的对象。例如:
  MsgBox ThisWorkbook.Parent
  将在消息框中显示“Microsoft Excel”。
  2、子过程
  子过程主要是一组指令,用来完成某项任务或者一系列任务。例如,在Access中创建打开报表的过程或者在Excel中创建将公式转换为文本的过程。
  下面是三个示例。
  (Excel示例)
  Sub WorkingWithCell()
  ThisWorkbook.Windows(1).ActiveCell.ClearContents
  ThisWorkbook.Windows(1).ActiveCell.Value=Now()
  ThisWorkbook.Windows(1).ActiveCell.NumberFormat=”dd-mm-yyyy hh:mm:ss”
  End Sub
  (Access示例)
  Private Sub cmdExit_Click()
  CloseCurrentDatabase
  End Sub
  (Word示例)
  Sub TableFit()
  ThisDocument.Tables(1).AllowAutoFit=True
  End Sub
  第一个示例处理单元格。第二个示例数据库。第三个示例处理表格。看了这三个示例后,您将认识到一些重要的对象:
  (1)ThisWorkbook:本身指Excel,引用包含代码的工作簿。有许多其他方式引用工作簿,但是如果需要处理工作簿级别的元素,则使用该对象。(ThisWorkbook也是Application对象的属性,返回一个Workbook对象)
  (2)ThisDocument:使用该对象意味着访问包含代码的文档的相关属性和方法。
  (3)CurrentProject:用于获取包含代码的数据库项目的重要信息,例如连接字符串、路径等等。
  例如,使用ThisWorkbook来识别工作簿的作者:
  Sub ThisWB()
  MsgBox ThisWorkbook.BuiltinDocumentProperties(“Author”)
  End Sub
  使用下面的代码从数据库项目中获取完整的连接资料:
  Sub connectionDetails()
  MsgBox CurrentProject.Connection
  End Sub
  3、函数
  与过程不一样,函数通常用于返回值。例如,如果希望获得计算的结果,那么使用函数。
  Function nthRoot(number As Double,nth As Integer) As Double
  nthRoot=number ^ (1/nth)
  End Function
  能够直接地或者间接地使用函数。意味着能够在窗体或者工作表中使用函数计算值,或者能够从VBA工程里的另一个过程中调用函数。
  VBA编码技术
  1、循环语句
  (1)For-Next循环
  语法:
  For counter=start To end [Step step]
  [statements]
  [Exit For]
  [statements]
  Next [counter]
  注意:不能指定一个Boolean型或者数组作为counter。step可以是负值。
  语法:
  For Each element In group
  [statements]
  [Exit For]
  [statements]
  Next [element]
  注意,element代表用于遍历集合或数组中的元素。对于集合,element可以仅为Variant型变量或者任何特定的对象变量(如Worksheet、Document、Database)。对于数组,element仅为Variant变量。
  例如,在对Windows Script Hosting模型引用后,下面的过程读取Excel工作簿所在文件夹中的每个文件,并在当前工作表中列出:
  Sub listFileNames()
  Dim fsoObj?????? As? New FileSystemObject
  Dim fsoFolder???? As? Folder
  Dim fsoFile?????? As? File
  Dim lngRow????? As? Long
  Dim strPath?????? As? String
  strPath=ThisWorkbook.Path
  Set fsoFolder=fsoObj.GetFolder(strPath)
  lngRow=1
  For Each fsoFile In fsoFolder.Files
   ActiveSheet.Cells(lngRow,1)=fsoFile.Name
   lngRow=lngRow+1
  Next fsoFile
  Set fsoFile=Nothing
  Set fsoObj=Nothing
  End Sub
  注意,此时必须先保存该工作簿。
  (2)Do-While/Do-Until循环
  在进入循环之前指定条件,语法为:
  Do [{While | Until } condition]
  [statements]
  [Exit Do]
  [statements]
  Loop
  在执行循环后判断条件,语法为:
  Do
  [statements]
  [Exit Do]
  [statements]
  Loop [{While | Until } condition]
  这两类循环在希望进行循环直到满足某条件时是有用的,例如:
  Sub DoUntilLoop()
  Dim lngRow As Long
  lngRow=1
  Do Until IsEmpty(ActiveSheet.Cells(lngRow,1))
   lngRow=lngRow+1
  Loop
  Msgbox ActiveSheet.Cells(lngRow,1).Address
  End Sub
  上面的循环将一直发生,直至到达活动工作表第一列中第一个空单元格,然后在消息框中显示该单元格的地址。
  下面的示例应用于Access(如果Excel和Word访问记录集并遍历时,则也能应用于这两个应用程序):
  Sub DoWhileLoop()
  Do While (Not(rst.EOF))
   rst.MoveNext
  Loop
  End Sub
  当没有到文件结尾时上述循环一直发生。
  Do While循的一种变体如下:
  While (Not(rst.EOF))
  rst.MoveNext
  Wend
  (3)With … End With语句
  当需要对单个的对象或用户自定义类型执行一系列语句时,该语句相当有用。语法为:
  With object
  [statements]
  End With
  其中,object表示对象名称或用户自定义类型。当对相同的对象或属性执行一系列语句时,With语句的优势时不需要重复对象名称。
  例如,重写上面的WorkingWithCell过程如下:
  With ActiveCell
  .ClearContents
  .Value=Now()
  .NumberFormat=”dd-mm-yyyy hh:mm:ss”
  End With
  使用With语句,不仅节省输入代码时间,并且结构化代码使之层次分明,因而使代码更容易阅读和理解,并且能使代码执行得更快。
  (4)If…Then…Else…End If语句
  根据满足的条件,执行相应的语句。语法为:
  If condition Then [statements] [Else elsestatements]
  或:
  If condition Then
  [statements]
  [ElseIf condition-n Then
  [elseifstatements]
  [Else
  [elsestatements]]
  End If
  例如,下面的代码比较字符串:
  Function isLike(varValue As Variant,strLike As Variant) As Boolean
  If varValue Like strLike Then
   isLike=True
  Else
   isLike=False
  End If
  End Function
  在过程中调用函数:
  Sub compare()
  MsgBox isLike(“robson”,”rob*”)
  End Sub
  (5)Select Case语句
  使用该语句能够使多条件判断更简洁。语法为:
  Select Case testexpression
  [Case expressionlist-n
   [statements-n]
  [Case Else
   [elsestatements]]
  End Select
  其中,expression-n有下列形式:expression,expression To expression,Is comparison operator expression。
  注意:(1)表达式文本与Case后的值必须正确匹配,并且区分大小写。
  (2)如果表达式文本与多个Case后的值匹配,则只执行第一个匹配的Case后的语句。
  (3)当没有匹配值时,执行Case Else后的语句。

本文转自
http://www.excelperfect.com/2008/04/19/ribbonxdeveloper41/
原创粉丝点击