Board logo

标题: [原创] 管中窥豹 VBA学习的扩展方法--新人进阶必读 [打印本页]

作者: ldy    时间: 2009-6-30 16:45     标题: 管中窥豹 VBA学习的扩展方法--新人进阶必读

观此文者必是先能熟练使用互联网搜索引擎,对象浏览器,本地窗口,注册表等基本技能者。
就像吃饭必须认得什么是碗,哪个是锅,什么时候用筷子,什么时候该用汤勺。

  管中窥豹有两种截然不同的理解:一种是褒义的,意谓人们可以从观察到的事物的一部分来推测该事物的全貌。从字面上理解“管中窥豹”,那就是从“竹管”中透过视线来看到豹子,由于视线受到“竹管”圆孔面积的限制,而无法看到“全豹”,只能看到豹子身上极具豹子特征的斑点花纹,于是就此推论这就是一只豹子。这种思路是极具智慧的。
“由一斑而见全豹”,“由一粒沙子看到世界”,“由一滴水了解大海”,这些话常常被用来赞颂那些以小见大,通过小事情了解大道理的聪明人。

一种是贬义的:从竹管的小孔中看豹,只看到豹身上的一块斑纹。比喻只看到事物的一部分。有时可以和略见一斑连用,比喻比喻只看到事物的一部分,指所见不全面或略有所得。
这里指的是前者。

观察到论坛上很多人是从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
[attach]540196[/attach]

按F8单步运行在本地窗口可以看到 obj 对象的类型是 Variant/Object/IWshNetwork2
现在知道obj.SetDefaultPrinter 方法,如果还想了解其他方法,在obj后面打个“.”,并不会出现代码提示框,
因为这是后期绑定,编译器不能告诉你还有什么东西可用。
要想前期绑定这个对象,就必须知道它存在于哪个文件中,这样才能进行引用,这要通过注册表进行搜索实现。
(也可以编写代码用API函数 从 WScript.Network 字符串得到,这不是本文所要讲的,略过)

开始--》运行 输入 regedit 后确认,在注册表编辑器中选中 我的电脑,按ctrl+F 打开搜索框 输入 WScript.Network勾选数据后查找,
[attach]540197[/attach]
[attach]540198[/attach]

十几秒后,找到了在 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
[attach]540199[/attach]
这是因为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 回车
[attach]540200[/attach]


看图,  “ 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个类供你选择,有些你可能觉得熟悉,因为其他的库也有这些类。

[attach]540201[/attach]
还有些陌生的类,搜索吧,尽可能多的了解它们是干什么的........

你很快就会成为“牛人”的。
作者: laoyebin    时间: 2009-6-30 17:02

ldy版这个贴的作用可以直追山版发的数组入门贴了

搜索注册表,学会了,哈哈,以后找起来就方便多了
作者: LAOMALIN    时间: 2009-6-30 17:10

api会了,那就无所不能了
太难了
作者: zldccmx    时间: 2009-6-30 18:02

好久不见LDY版主的作品了,一出来就是一鸣惊人!
狠狠的学习!

顺便将老朽在引用外部对象时,觉察到的 前期绑定与后期套用之间的差别 一并贴上,希望对大家有所帮助。
记得在使用字典对象时,由于是后期套用,直接使用Set Dic = CreateObject("scripting.dictionary"),而没有在工程引用中相应的对象,以致于在使用 Dic.CompareMode = TextCompare 时失去作用,而Dic.CompareMode = 1 就能达到要求,原来是后期套用对象并没有将对象的保留字TextCompare 一并带出来,TextCompare 自然就为空,如果是前期引用,TextCompare 就是1。
所以,老朽愚见,如果你希望引用其它对象时,请尽量使用前期绑定,这对我们调试代码特别有帮助!
作者: zldccmx    时间: 2009-6-30 18:40


举例说明:
先不进行前期绑定,运行前面两段代码,记录结果,然后再进行前期绑定,运行最后一段代码,与前面两段代码运行的结果对照,就明白了。
Option Explicit


      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-6-30 下午 06:35:12

Sub Test0()    '后期套用,引用对象保留字
'不经绑定,后期套用,不需要前述引用,照样可以使用这个对象
    Dim Dic,I&
    Set
Dic = CreateObject("scripting.dictionary")
    Dic.CompareMode = TextCompare    '如果使用了Option Explicit语句,这时系统会提示TextCompare为未定义变量
    For
I = 65 To 122
        Dic(Chr(I)) = ""
    Next

    MsgBox Dic.Count    '如果没有Option Explicit语句,强制要求声明变量,则返回58
End Sub


      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-6-30 下午 06:35:13

Sub Test1()    '后期套用,用常数代替对象保留字
'不经绑定,后期套用,不需要前述引用,照样可以使用这个对象
    Dim Dic,I&
    Set
Dic = CreateObject("scripting.dictionary")
    Dic.CompareMode = 1    '这时候,我们只有通过使用常数1来代替TextCompare,即Dic.CompareMode = 1
    For
I = 65 To 122
        Dic(Chr(I)) = ""
    Next

    MsgBox Dic.Count    '返回32
End Sub


      '撰写:老朽
      '网址:http://Club.ExcelHome.net
      '日期:2009-6-30 下午 06:35:13

Sub Test2()    '前期绑定
'VBE窗口,工具->引用->勾选 Microsoft Scripring Runtime
    Dim Dic As New Dictionary,I&
    Set
Dic = New Dictionary
    '我们希望在进行字典比较时,采用文本方式比较,不区分大小写,即a,A是当相同字符处理

    Dic.CompareMode = TextCompare    '这时TextCompare=1
   
For I = 65 To 122
        Dic(Chr(I)) = ""
    Next

    MsgBox Dic.Count    '返回32
End Sub

作者: laoyebin    时间: 2009-6-30 19:32

引用:
原帖由 zldccmx 于 2009-6-30 18:02 发表
好久不见LDY版主的作品了,一出来就是一鸣惊人!
狠狠的学习!

顺便将老朽在引用外部对象时,觉察到的 前期绑定与后期套用之间的差别 一并贴上,希望对大家有所帮助。
记得在使用字典对象时,由于是后期套用,直接 ...
确实如此
我也喜欢前期引用,一则方便输入,二则方便调试
假如给别人用就再改后期引用
作者: www.36600.net    时间: 2009-6-30 20:41

现在对WMI对象模型感兴趣,找不到参考资料
作者: 向東    时间: 2009-6-30 21:07

授人以渔,好贴!
作者: 987654321    时间: 2009-6-30 22:17

好贴,学习学习
作者: taller    时间: 2009-7-24 23:06

非常不错的学习方法,谢谢分享
作者: e丫丫    时间: 2009-7-25 07:05

我也来学学,谢谢
作者: 飞云楼主    时间: 2009-7-25 09:17

学习,谢谢分享指教
作者: lbl016    时间: 2009-7-25 09:20

好贴,学习学习
作者: ojh2008    时间: 2009-7-25 10:16

这个贴好象对我,太难于理解~我VBA才入门~佩服~也让我看到了方向~谢谢
作者: zjdh    时间: 2009-7-25 18:53

学习啦,谢谢!!
作者: 寅鹞    时间: 2009-7-25 19:30

此乃授人以渔之妙文。
作者: 鱼求雨    时间: 2009-7-25 23:07

授人以渔!看多少教程也学不到的方法哇
作者: icelan2008    时间: 2009-7-26 10:31

很不错,过程讲的很细。谢谢,学到很多!

作者: icelan2008    时间: 2009-7-26 10:58

对了,有个问题,这个代码到别的没有设置过的机器上能运行吗?
作者: 蓝桥玄霜    时间: 2009-7-26 14:48

版主真会钻研啊,所以能成为高手中的高手!
好帖!学习了。
作者: 赵国辉    时间: 2009-7-26 17:33

好贴!
作者: dsp5000    时间: 2009-7-26 21:51

关注学习中。。。。。。。
作者: ljl008    时间: 2009-7-27 15:51

现在看不明白,留个记号,慢慢学。谢谢版主!
作者: bibisin    时间: 2009-7-27 19:07

一分供于学习的好资料,谢谢LZ分享
作者: zhenzhen0927    时间: 2009-7-28 10:54

先作下记号,以后慢慢研究,对我来说有点太深奥了
作者: tte3    时间: 2009-7-28 11:23

新手学习,谢谢老师!
作者: maillgh    时间: 2009-7-28 16:31

多谢版主!学习下
作者: everee    时间: 2009-7-29 13:14

太感谢了,学习的方法比纯结果更有用
作者: aibaobo    时间: 2009-7-31 16:22

崇拜、收藏、学习、感谢 !
作者: Fae    时间: 2009-8-2 19:43

谢谢版主!学习中
作者: baoshaobo000    时间: 2009-8-3 10:59

真是好贴,学习了

作者: hanter007    时间: 2009-8-5 11:45

宝贵的学习经验,谢谢版主分享.
作者: hqj137    时间: 2009-8-5 15:54

学习了。谢谢楼主。
作者: hqj137    时间: 2009-8-5 16:05

学习。。。。。。。
作者: dingboy_VBA    时间: 2009-8-5 16:45

确实是授人以渔的好文章
作者: 好123    时间: 2009-8-7 19:30

ldy兄
作者: zj54891    时间: 2009-8-9 11:08

顶下
感谢大侠分享
拨云见雾的感觉

作者: hhzjxss    时间: 2009-8-9 21:17

谢谢李老师,真是篇好文章!
作者: danking20256753    时间: 2009-8-11 22:46

谢谢 学习学习
作者: sunjing-zxl    时间: 2009-8-16 09:24

好东西。。下载学习!
作者: 1997078    时间: 2009-8-19 23:15

难 ,太难了。
作者: fandk    时间: 2009-8-20 13:23

确实是好贴!楼主的钻研精神和钻研方法都是我们的榜样....
作者: zhairong001    时间: 2009-8-25 17:08

太厉害了,慢慢学习。
作者: 背景问题    时间: 2009-8-25 18:10


作者: 背景问题    时间: 2009-8-25 18:14

最好的人!感谢...
作者: 背景问题    时间: 2009-8-25 18:15

啊  看一会 眼珠子掉出来了  我不急 嘿嘿
作者: qbliu    时间: 2009-8-28 13:28

学习了,赞一个!
作者: ae068    时间: 2009-8-31 12:28

ldy
服你了,写得很好。
请问怎样才能快速弄懂其属性和方法呢?
作者: eqzh    时间: 2009-9-8 16:00

太感谢了!希望楼主好贴不断
作者: byl2005    时间: 2009-9-8 17:27

厉害啊 向版主学习
作者: papapa1001    时间: 2009-9-10 20:53

不能光是捧场噻!
应该整点有用的东东来
api是难,需要好好学习
作者: 如饥似渴    时间: 2009-9-11 09:24     标题: 回复 1楼 ldy 的帖子

楼主朋友,您的帖子拜读了,收益多多,谢谢您。
    另外,下面的网址是我又一个难题,发表在论坛上至今无人问津,请您帮帮忙吧,伸出您的援手帮我一次,谢谢您。
http://club.excelhome.net/thread-481308-1-1.html
作者: linux118    时间: 2009-9-11 21:16

别出机杼,赞楼主
作者: yvw    时间: 2009-9-15 17:08

留个记号,慢慢学。谢谢版主!
作者: 饭团控    时间: 2009-9-21 13:19

mark  后看
作者: MOWENZHOU    时间: 2009-9-22 09:57

支持
作者: jhonsun    时间: 2009-9-22 10:03

多谢,学习先!!!
作者: jhonsun    时间: 2009-9-22 10:07

多谢,学习先!!!
作者: iellen    时间: 2009-9-25 18:24

论坛果然知识丰富啊!!没来错
作者: zbwxlxy    时间: 2009-9-26 23:03

呵呵,该部分内容不太熟悉,所以看起来有些累。
作者: trustwxq    时间: 2009-9-28 22:23

刘版主就是 ,今后要多向刘版主请教,至于类和API基本上不懂是什么东东!很想学,因为日子过一天少一天,知识学一点多一点嘛!我想多多的了解整个世界的事实真相,黑客帝国是我最最喜爱的电影之一,只可惜我大学学的不是计算机专业,现在工作好几年了,化工直接干够了,不过也没办法,唉!就这命了~~
作者: zbwxlxy    时间: 2009-10-1 08:17

留个记号,带有时间时在学习。谢谢!
作者: chenming279    时间: 2009-10-3 17:05

就此谢过,青山不改,绿水长流
作者: joforn    时间: 2009-10-3 21:17

为了可读性,我放弃了汇编、API,选用控件;
为了代码效率,我放弃了控件,用API。
任何东西都不能一概而论,主要还是要看自己的需求是什么,安全性、效率、可读性都要考虑,但有时不可能全部都要。
作者: smhf_6    时间: 2009-10-4 08:18

谢谢版主的大作,版主辛苦了。
我的几点感想:
1、关于注册表,从网上的介绍,知道很有用,但记得10多年前有一位同事告诉我,随便不要去动它。因此我想,除非非常熟悉这方面的知识,否则还是不要涉足,弄不好会把电脑搞坏。
2、关于API, 网上介绍说,如果不学API,水平最高,也是初级!我也坚信如此,能学当然最好。但是,我想:如果不想成为一个程序开发人员,就不要学了,因为API不仅是难,而且我们也用不了多少,我看API好象是WINDOWS操作系统的关联太密切了,我们日常数据处理中也用不着这把牛刀,即使在用的也集中在:动画、声音、时间、图片、任务栏的最小化图标等等等等。
    到EXCELHOME来的,绝大多数都是办公软件的使用者,是为了提高工作的效率而学习的,如果要开发一个系统,那是更高一个层次的问题了,是专业技术人员的工作了。
3、关于控件,工具-引用中有很多,我用过的也就是ado, html,字典,正则,FileSystemObject,WScript,WebBrowser 等等,但这些都不是我发现的,是因为其他人在用,所以我也用了。
那么引用中,还有很多的控件,是干什么用的?我也不知道,希望能有一个系统的对每个控件有个简要介绍资料。

[ 本帖最后由 smhf_6 于 2009-10-4 08:21 编辑 ]
作者: xiaowang2999    时间: 2009-10-4 09:50

版主好高啊,需仰视!
作者: sanddudong    时间: 2009-10-7 08:18

学习中,有点天书
作者: 良凤精品    时间: 2009-10-12 17:07

原来这么复杂的内容.
作者: youxian8    时间: 2009-10-12 22:20

找到学习方向,事半功倍!!!谢谢LZ!!!
作者: xyesterday    时间: 2009-10-14 22:42     标题: 回复 5楼 zldccmx 的帖子

5楼的用的是什么编辑器的啊,显示的好清晰漂亮啊,告诉一下的咯.
作者: yq558866    时间: 2009-10-16 16:40

首先谢谢ldy老师
看懂了百分之80,现在就还有一点不明。
主项默认值:Windows Script Host Network Object 这个是引用窗口中将看到的名称。
这个主项默认值应该怎么查看啊?
作者: ldy    时间: 2009-10-16 20:40

引用:
原帖由 yq558866 于 2009-10-16 16:40 发表
首先谢谢ldy老师
看懂了百分之80,现在就还有一点不明。
主项默认值:Windows Script Host Network Object 这个是引用窗口中将看到的名称。
这个主项默认值应该怎么查看啊?
一楼有说明 : 在注册表里 HKEY_CLASSES_ROOT\CLSID\{093FF999-1EA0-4079-9525-9614C3504B74}的默认值
作者: sanddudong    时间: 2009-10-17 06:02

看不懂
作者: xmdefu    时间: 2009-10-18 11:11

留下记号,有空再细读。
作者: 舒琼    时间: 2009-10-20 01:13


作者: yangAAA    时间: 2009-10-20 11:32     标题: 回复 1楼 ldy 的帖子

好贴,可是看不懂,请老师指点如何学呢?
作者: hhzjxss    时间: 2009-10-20 20:23

好文章,一时搞不清楚,慢慢看看!
作者: ctn1985    时间: 2009-10-21 16:17

好多高手啊,学习中
作者: 艳阳    时间: 2009-10-25 09:26     标题: 好贴

虽然看不懂
作者: fish_gz    时间: 2009-10-28 00:51

thank thank you.
作者: abcd321abcd    时间: 2009-10-31 06:38

多谢提供如此好贴,学习学习!!!
作者: liurj    时间: 2009-11-2 23:38

我现在肯定是看不懂这些
但也留个记号
能看时再来
作者: mayiwan    时间: 2009-11-4 11:28

好貼  謝謝樓主
作者: pst168    时间: 2009-11-5 13:54

不错,过程讲的很细。谢谢
作者: lrd3639    时间: 2009-11-7 08:33

我在读天书
作者: haqiuhaqiu    时间: 2009-11-8 21:34

授人以渔,好贴!
作者: gjj136138139    时间: 2009-11-9 13:35

头一回知道从注册表中也可以搜索开来,真是耳目一新。高!
作者: sunny3234    时间: 2009-11-10 11:31

有意思,有道理
作者: 流泪的雨    时间: 2009-11-17 19:43

好贴,学习学习
谢了
作者: anniegirl    时间: 2009-11-18 13:56

谢谢分享啦!
作者: zty3162258    时间: 2009-11-22 17:14     标题: 评价

楼主的帖子 就相当于

你站在十字路口,不知道走那条路
轰!!!!!
楼主闪亮登场,给你插了一个指示牌
作者: 风行无边    时间: 2009-11-23 01:06

拜帖 沙发~现在还不是很懂~
作者: bengdeng    时间: 2009-11-24 09:48

好文!很好的学习方法,如黑夜的一盏明灯,指明了一条学习的方向!
作者: clbt    时间: 2009-11-25 21:25

另类的方法,见识了
作者: a2680935    时间: 2009-11-26 13:56

宝贵的学习经验,谢谢版主分享
作者: 杏花雨V翟    时间: 2009-12-14 12:54

哎 还像看天书一样
希望早日能读懂
作者: li0305    时间: 2010-1-8 09:20

会者一通百通,我等还是未涉及过,要认真来研究一下,
作者: hefenglin    时间: 2010-4-4 20:52

是个好方法,学习
作者: HUANGYI2010    时间: 2010-4-26 19:48

victory: 俺赚够课券来学习
作者: fxr2003    时间: 2010-7-15 13:22

受益匪浅,多谢版主!
6楼的朋友提到“如果给别人用就改为后期绑定”,是否是因为前期绑定会存在版本兼容性问题,而后期绑定不会?




欢迎光临 Excel Home论坛 (http://club.excelhome.net/) Powered by Discuz! 6.1.0