codecamp

怎么使用VBA对象库

在前面的例子里,你学习使用了Excel对象库里的Shapes(图形)集合成员的属性。Excel库包含专门使用Excel的对象,而VBA库则提供对许多内置VBA函数的访问,这些函数按类别分组。这些函数是通用的,它们使你能够管理文件,设置日期和时间,与用户交流,转换数据类型,处理文本串或者进行数学计算。在下面的练习中,你将学习如何使用内置的VBA函数来创建一个新文件夹,而不需要离开Excel界面:


1.回到模块Manipulations,那里有你的MoveTextBox和MoveCircle过程
2.  输入一个新的过程:
Sub NewFolder()
3.  点击回车键,VB会自动输入结束关键词End Sub
4.  按下F2激活对象浏览器
5.  在“工程/库”列表框里选择VBA
6.  在搜索文本框里输入file并且回车
7.  滚动成员列表框,并且选中MkDir方法(参见图2-21)
8.  点击对象浏览器上的“复制”按钮,将被选择的方法名称复制到剪贴板



图2-21 编写过程时,向对象浏览器寻求帮助来找内置的VBA函数


9.  返回Manipulations窗口,并且将复制的指令粘贴到NewFolder过程
10. 输入一个空格,接着是”C:\Study”。确保你在引号里输入了整个路径名。NewFolder过程为:

Sub NewFolder()
     MkDir "C:\Study" 
End Sub

11. 运行过程NewFolder

当你运行NewFolder过程,VB在C盘上创建了一个新的文件夹。激活Windows浏览器可以查看该新文件夹。创建一个新的文件夹后,你可能会发现你根本就不需要它,虽然你可以轻易地从Windows浏览器里删除该文件夹,但是,如何从编程上去掉它呢?对象浏览器上列出了许多对文件夹和文件操作很有帮助的其它方法。RmDir方法正如MkDir 方法一样使用简单。想要删除你硬盘上的“Study”文件夹,只要将MkDir方法换成RmDir方法然后重新运行NewFolder过程就可以了。或者,你也可以创建一个新的过程RemoveFolder,如下:

Sub RemoveFolder()

RmDir "C:\Study"

End Sub

RmDir方法允许你从硬盘上删除不需要的文件夹。

用对象浏览器来定位过程

除了定位对象,属性和方法外,对象浏览器还是个定位在不同工程里面的过程非常方便的工具。下
面的例子给你演示如何查看存在“Personal”工作簿里面的过程:

1.  激活对象浏览器并且选择工程/库下拉列表里的Personal。(因为我没有Personal这个文件。。。)


图2-22 对象浏览器列出所有在某个特定VBA工程里可用的过程

对象浏览器的左边显示所选工程里面对象名称,而右边则列出了所有可用的过程。

2.双击NewFolder过程名称,VB将光标定位到该过程的第一行

3.关闭对象浏览器

使用立即窗口

在你开始创建一个完善的VBA过程前(在下一章),先来做一些热身练习,增加你的VBA词汇。你怎样才能学得快而且没有痛苦?你如何试验一下一些新学的VBA指令?这里有一些简短的,互动的语言练习:输入一个简单的VBA指令,Excel会检查并且将结果显示在下一行。我们开始来设定你的练习屏幕:

1.在VB编辑器窗口,选择“视图”-“立即窗口”
在决定使用在你自己的VBA过程之前,立即窗口可以用来试验VB语言中不同的指令,函数和运算符。这是一个非常好的调试新语言的工具,你输入在这个窗口里面的指令,将会立即显示结果。

立即窗口可以在VB编辑器窗口上任意移动,也可以设置为可连接的,这样它就会出现在相同的地方。可以通过选项对话框上的“可连接的”页来打开或关闭可连接设置。在VB编辑器窗口上按下Ctrl+G就可以快速访问立即窗口。立即窗口允许你输入VBA语句,并且测试它们的结果,而不需要写成一个过程。立即窗口就像一个草稿板,你可以用它测试你的语句。如果该语句输出了你希望的结果,你就可以将立即窗口上的语句复制到你的过程中去(或者,你也可以将语句拖曳到代码窗口,如果代码窗口是可见的)

2.
将Excel和VB编辑器窗口并排排列
3.
在立即窗口里输入下述指令,并且回车

Worksheets("Sheet2").Activate

当你按下回车键,VB开始工作,如果你上面输入的语句是正确的话,VBA激活当前工作簿里的第二个工作表。工作簿底部的Sheet2这时应该是突出显示的。

4.
在立即窗口,输入其它VBA语句并回车

Range("A1:A4").Select

你一旦按下回车,VB将选中当前工作表的A1,A2,A3和A4

5.
在立即窗口里输入下述指令:

[A1:A4].Value = 55

当你按下回车,VB在A1:A4中的每个单元格里放置数字55。上面的语句是引用Range对象的一种所写方式,完整的语法可读性更强:

Range("A1:A4").Value = 55


图2-23 将Excel和VB窗口并排排列让你可以观察指令的运行

6.在立即窗口输入下述指令:

Selection.ClearContents

7.回车后,VBA清除所选单元格区域的内容,区域A1:A4现在是空的

在立即窗口输入下述指令:

ActiveCell.Select

回车后,VB激活A1单元格


图2-24 在立即窗口里输入指令,一旦你按下回车键,指令就会被执行

图2-24显示了上面练习中在立即窗口里输入的所有指令。你每次按下回车键后,Excel总是执行光标所在行的语句。如果你想要再次执行同一指令,那么点击该指令行的任意位置,回车。为了更多的练习,重新运行图2-24里语句,从立即窗口的第二行指令开始,点击合适的地方并回车,一个一个地执行这些指令。

获取立即窗口里的信息

到目前为止,你已经使用立即窗口执行操作了,这些操作也可以是手动地在工作表的任意区域点击鼠标并且输入数据。立即窗口也允许你问问题。假设你想要找到下面问题的答案:“现在选中的是哪些单元格?”,“当前单元格里的值是多少?”,“当前工作表的名称是什么?”,“当前窗口的编号是多少?”使用立即窗口,你可以轻易地找到这些问题,以及其它问题的答案。在前面的例子里,你输入了好几个指令,让我们返回立即窗口去问几个问题。Excel甚至在你关闭了立即窗口后还能记住你在立即窗口里输入的指令。当你退出Excel时,立即窗口的内容自动会被删除。

1.  鼠标点击立即窗口第二行你输入Range("A1:A4").Select的任意地方

2.  回车,让Excel再次选择单元格A1:A4

3.  在立即窗口新的一行输入下面的问题:

?Selection.Address

当你按回车,Excel不会选择工作表的任何东西,取而代之,立即窗口上会在另外一行显示该指令的结果。在该例中,Excel返回的是当前被选择的单元格的绝对地址($A$1:$A$4)。问号(?)告诉Excel在立即窗口显示指令的结果。除了问号,你还可以使用Print关键字。让我们使用关键字Print问工作表名称

4.  在立即窗口新的一行,输入下述问题:

Print ActiveWorkbook.Name

回车后,Excel在立即窗口新的一行输入了当前工作簿的名称。找找应用程序的名称如何?Chap02.xls的父对象是谁?

5.  在立即窗口新的一行,输入下述问题:

?Application.Name

Excel会显示它自己的全名:Microsoft Excel

立即窗口也可以用来做一个快速计算

6.  在立即窗口新的一行,输入下述问题:

?12/3

回车后,Excel会在下一行显示该除法运算的结果。但是,万一你想立即知道3+2和12*8的结果呢?你可以将它们输入在一行,而不必分成两行,例如:?3+2:?12*8
注意,冒号将两个代码块分割开来。

当你按下回车键,Excel分别在立即窗口的两行显示结果5,96。下面是你在立即窗口里输入的所有指令,以及Excel对你问题的回答:

Worksheets("Sheet2").Activate
Range("A1:A4").Select
[A1:A4].Value = 55
Selection.ClearContents
ActiveCell.Select
?Selection.Address
$A$1:$A$4
Print ActiveWorkbook.Name
Chap02.xls
?Application.Name
Microsoft Excel
?12/3
4
?3+2:?12*8
5
96

VBA对象浏览器的使用方法
VBA对象及电子表格单元格操作
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }