给你另一种学习VBA的方法
时间:2009-12-08 22:40:30
作者:officeba 【认证】
从VBA开始学编程的,大致步骤是这样的,了解一些VBA(VB)的语法、对象,深层次一点的就研究API。
相对于VBA来说API近乎天书,学起来就一个字 “真TMD苦”,往往为了实现一个小目标,要写几乎一篇作文一样的代码。
对于快速实现目的来说,在VBA 到 API之间还有一个中间过程被大家忽略了,就是对于Windows提供的一些对象的使用。
有非常多的API实现的方法,可以通过引用对象的方式来简单的实现。
windows中有很多dll、ocx等系统文件,相当多的部分是可以被VBA借用的,但目前还没发现哪一本书是介绍这些文件及对象的使用方法的。
想要通过这些文件去了解用法,不现实,因为有些用不上,有些VBA根本无法引用。
但是碰到了就不能错过,学习过程中经常能看到
Set obj = CreateObject("aaa.bbb")
obj.xxxx
obj.yyyy = zzzz
类似这样的代码,大部分人都是直接复制使用,所知者仅限于xxxx方法和yyyy属性,下次看到 obj.cccc 于是惊呼 “太感谢了,原来obj还有cccc这个方法。”
但善于学习者从看到Set obj = CreateObject("aaa.bbb") 时就会想方设法去了解这个obj对象的所有内容,
于是他不仅知道有cccc方法,还知道obj的所有方法和属性。
他还会把这个后期绑定的代码改写为前期绑定的代码,以提高效率,并扩展出其他VBA自身不能实现的方法。
来吧,成为一个善于学习的人吧,自己端碗拿筷子吃饭。
看个实例,如何做到 “窥一斑而知全豹”
sub 设置默认打印机()
Set obj = CreateObject("WScript.Network")
obj.SetDefaultPrinter "Epson Stylus COLOR 680" '这个打印机名称请根据自己控制面板中打印机名称修改
end sub
按F8单步运行在本地窗口可以看到 obj 对象的类型是 Variant/Object/IWshNetwork2
现在知道obj.SetDefaultPrinter 方法,如果还想了解其他方法,在obj后面打个“.”,并不会出现代码提示框,
因为这是后期绑定,编译器不能告诉你还有什么东西可用。
要想前期绑定这个对象,就必须知道它存在于哪个文件中,这样才能进行引用,这要通过注册表进行搜索实现。
(也可以编写代码用API函数 从 WScript.Network 字符串得到,这不是本文所要讲的,略过)
开始--》运行 输入 regedit 后确认,在注册表编辑器中选中 我的电脑,按ctrl+F 打开搜索框 输入 WScript.Network勾选数据后查找,
十几秒后,找到了在 HKEY_CLASSES_ROOT\CLSID\{093FF999-1EA0-4079-9525-9614C3504B74}\ProgID 看到默认值为 WScript.Network.1
看看 HKEY_CLASSES_ROOT\CLSID\{093FF999-1EA0-4079-9525-9614C3504B74} 项下的两个值
主项默认值:Windows Script Host Network Object 这个是引用窗口中将看到的名称。
InProcServer32 下的默认值 :C:\WINDOWS\system32\wshom.ocx 这是所在的系统文件
有这两个内容就可以进行引用了。VBE菜单栏 工具 --》引用 打开引用窗口,但却找不到 Windows Script Host Network Object
这是因为VBE只默认加载dll文件,对于ocx需要通过浏览方式来指定。点击浏览按钮,默认打开C:\WINDOWS\system32\ 文件夹
找到wshom.ocx 文件 点击打开,这下引用窗口中多了一个 Windows Script Host Object Model 选择,勾上它确定,这个名称与在注册表中看到的有些不同,
个人理解:
这是VBA的VBE干的,很多一样的引用在不同的编程工具中所反映出来的名称都会有差异,
最典型的就是IE浏览器对象(WebBrowser控件)在VBA中 显示 Microsoft Web 浏览器
而在VB 6.0 中显示 Microsoft Internet Controls,但这仅仅是显示的文字而已,里面的东西还是一致的。
现在引用成功了,再来编写一个前期绑定的代码,用New关键字来创建对象,但具体使用那个具体的类名称还不确定,需要通过对象浏览器来查找。
找什么?就找SetDefaultPrinter方法,按F2 在所有库 下面输入 SetDefaultPrinter 回车
看图, “ IWshRuntimeLibrary.WshNetwork 的成员”
刚才所引用的是IWshRuntimeLibrary类型库
而 obj是 IWshRuntimeLibrary库中的WshNetwork类
SetDefaultPrinter则是WshNetwork类的一个方法。
在对象浏览器中可以看到多个关于打印机的方法,如果认的几个英文,这些方法就相当于大白话。
EnumPrinterConnections 枚举打印机连接
SetDefaultPrinter 设置默认打印机
RemovePrinterConnection 删除打印机
.........
不认的也不要紧,复制了上网找Google翻译去。
输入 Dim obj As New 后会自动弹出代码提示框(New后面有个空格),这下知道该如何“选”代码了
Sub 设置默认打印机前期绑定()
Dim obj As New WshNetwork
Dim ptrs As WshCollection
Set prts = obj.EnumPrinterConnections
For Each n In prts
Debug.Print n
Next
obj.SetDefaultPrinter "Epson Stylus COLOR 680"
End Sub
当你研究完WshNetwork类的各种方法属性后,先别急,既然IWshRuntimeLibrary叫做类型库,那就不止一个类
接着输入 Dim tmp As New IWshRuntimeLibrary. 代码提示框又来了,你会看到7个类供你选择,有些你可能觉得熟悉,因为其他的库也有这些类。
还有些陌生的类,搜索吧,尽可能多的了解它们是干什么的........