VBA语料库应用编程的一个例子

Office 的VBA也是一种颇强大的编程工具,一般认为是用来操作Office的各种对象,其实不然,不了解Office颇为复杂的对象体系一样可以使用VBA及其 开发环境,且还有非常简单易用的图形编程功能。VBA语言就是Visual Basic,同早已过时却仍在广为使用的Visual Basic 6,完全可以把它用作一个高度精简的Visual Basic编程环境。当然了,若要使用VBA,前提是保证在安装Office时把VBA安装完全。微软曾有取消VBA的想法,但后来宣称长期支持,或许是 因为VBA用户太多,且是Office的一个关键优势。

掌握了VBA,就会发现它绝对是快速编程最佳工具之一,能够用它来很方便的解决很多问题。VBA程序的缺点是运行速度稍慢一些,尤其是文本处理,所以,大规模的项目不适合用VBA完成。

以Office 2007为例,使用Word或Excel的“开发工具”>“插入”>“ActiveX控件”,可以直接在Excel工作表或Word文档上插 入按钮,文本框等可编程控件。比如放置了一个按钮(默认名称CommandButton1),双击该按钮,就会弹出VBA的IDE,出现以下代码框架:

Private Sub CommandButton1_Click()

End Sub

这是一个空白的VBA的所谓“过程”,下一步是在其间添加代码,比如写入一行:MsgBox "Hello World",那么这个过程的完整代码就是:
Private Sub CommandButton2_Click()
MsgBox "Hello World"
End Sub

注 意如下几个要点与难点,1)或者回到之前插入控件的Excel工作表或Word文档,以Word文档为例,在开发工具菜单下有一个“设计模式”显示激活状 态,再点它一下,关闭“设计模式”,就可以运行插入的按钮与代码了;还有一种运行代码的方式更简单,只要是可运行的过程(也就是所谓“宏”),把光标定位 在过程代码的字里行间,热键F5,或者是点VBA IDE菜单上的运行宏图标(三角)。所谓过程的可运行:不带参数的Sub可直接运行,函数(Function)与带参数的Sub只能被其他Sub或 Function调用。


2) 注意代码在什么“位置”,IDE左侧有一个“工程-project"或者"工程-VBAProject”的侧栏,以Word文档为例,仅有一个所谓文档对 象“ThisDocument”,需要回到代码编辑时点这个“ThisDocument”,就会出现代码。类推,在Excel中,工程结构图中默认有三个 Sheet,每一个中都可以加入控件、代码。


3) 在“工程-project侧栏右击鼠标,会看到右键菜单中有一项”插入“,鼠标移到此,会出现”用户窗体“、”模块“,”类模块“,初学的话,应该先掌 握”模块“,这个所谓模块,就是一个代码的”语篇“,一个Word文档中的代码、一个Excel工作表中的代码本质上都是一个代码模块,模块里可以写入变 量声明,如: ”Public Dim X as String“,也可以写过程(Sub)或函数(Function)。所谓Public,与Private相对,Public指的是在整个VBA工程中都 可见、可调用,Private指的是只对模块内部开放。比如在Excel的Sheet1中写一个Private Function,只有Sheet1中的代码可调用这个Function。



如 下是一个用VBA制作的Concordancer,示例之用而已。包括三个控件,CommandButton1,TextBox1(显示索引 行),Textbox2(输入关键词)。三个控件直接放在在Word文档中,代码写入Word文档(即工程结构中的ThisDocument)的代码模 块。

代码中使用了一些 Windows提供的所谓“类”,这些“类”包含在系统提供的一些库里,使用前需要打开“对象浏览器”(F2),在“工具”菜单下打开“引用”,找到 “Microsoft Scripting Runtime”,在选框中打勾,表示引用这个类库。类库中提供的一个名为FileSystemObject的类很有用,使文件操作简单易行,需要用 New关键词生成实例对象,不过不是所有对象都用New生成,比如TextStream(文本流),成功调用FileSystemObject的 OpenTextFile函数返回TextStream对象,对于这种对象构造方式,需要使用Set关键字。

Concordance 函数返回一个字符串(String()),这个函数中使用了正则表达式,正则表达式使用的类库是Windows系统自带的“Microsoft VBScript Regular Expressions 5.5”,提供RegExp,这是一个精炼的恰到好处的正则表达式对象类,官方文档介绍十分详细,这里就不细说了。

详细代码如下:

代码:
Private Sub CommandButton1_Click()
Dim fso As New FileSystemObject
'referencing "Microsoft Scripting Runtime"
Dim ts As TextStream
Set ts = fso.OpenTextFile("f:\programming\perlScripts\BEV8.TXT", ForReading, False)
Dim ls() As String
ls = Concordance(ts.ReadAll, Trim(TextBox2.Text), True, 50)
For i = 0 To UBound(ls)
TextBox1.Text = TextBox1.Text & ls(i) & vbCrLf
Next
ts.Close
End Sub

Private Function Concordance(ByVal TXT As String, ByVal PTTRN As String, ByVal IGNCS As Boolean, ByVal SPN As Integer) As String()
Dim STRS() As String
Dim STT As Long: Dim FIN As Long
Dim i As Long: i = 0
Dim RE As New RegExp
'referencing "Microsoft VBScript Regular Expressions 5.5"
RE.Global = True
RE.IgnoreCase = True
RE.Pattern = PTTRN
Dim MS As MatchCollection, M As Match
On Error Resume Next
Set MS = RE.Execute(TXT)
If MS.Count < 1 Then Exit Function
For Each M In MS
ReDim Preserve STRS(i)
STT = M.FirstIndex - SPN
FIN = M.FirstIndex + M.Length + SPN
On Error GoTo ERRHDL
STRS(i) = Replace(Mid$(TXT, STT, FIN - STT), vbCrLf, "^^", , , vbTextCompare)
i = i + 1
GoTo FINI
ERRHDL:
If STT < 1 Then
STT = 1
STRS(i) = Space$(SPN - 2 - Abs(STT)) & Replace(Mid$(TXT, STT, FIN - STT), vbCrLf, "^^", , , vbBinaryCompare)
i = i + 1
End If
If FIN > Len(TXT) Then
FIN = Len(TXT)
STRS(i) = Replace(Mid$(TXT, STT, FIN - STT), vbCrLf, "^^", , , vbBinaryCompare)
i = i + 1
End If
FINI:
Next
Concordance = STRS
End Function
 
Back
顶部