蘇子偉
利用Excel軟件處理大量數(shù)據(jù)的過程中,分離有些需要的數(shù)據(jù)是比較困難的,并且Excel中的宏函數(shù)并不能很容易、很純粹地解決這些問題。這時(shí)使用VBA進(jìn)行數(shù)據(jù)處理就是最佳的選擇。VBA本身與Excel的結(jié)合是無縫的,且提供了大量豐富的函數(shù)。用VBA操縱表格的過程簡(jiǎn)單,并且效率極高。
一、下面從六個(gè)方面說明VBA編程語(yǔ)言的結(jié)構(gòu)
1.運(yùn)算符
(1)賦值運(yùn)算符: =
(2)數(shù)學(xué)運(yùn)算符:&(字符連接符)、+(加)、-(減)、*(乘)、
/(除)、Mod(取余)、\(整除)、-(負(fù)號(hào))、^(指數(shù))
(3)邏輯運(yùn)算符:Not(非)、And(與)、Or(或)、Xor(異或)、Eqv(相等)、Imp(隱含)
(4)關(guān)系運(yùn)算符:= (相等)、<>(不等)、>(大于)、<(小于)、>=(不小于)、<=(不大于)、Like、Is
(5)位運(yùn)算符:Not(邏輯非)、And(邏輯與)、Or(邏輯或)、Xor(邏輯異或)、Eqv(邏輯等)、Imp(隱含)
2.數(shù)據(jù)類型
下面列舉了一些常用類型及其所占的字節(jié)空間。
3.VBA的變量
4.VBA中的流程控制
(1)判斷結(jié)構(gòu)
(2)循環(huán)結(jié)構(gòu)
5.函數(shù)和過程的聲明與使用
函數(shù)和過程都是為了實(shí)現(xiàn)一個(gè)特定的機(jī)能而寫的獨(dú)立的模塊代碼。函數(shù)的聲明采用Function、End Function,而過程使用Sub和End Sub來表示。二者形式上很相像,但是函數(shù)與過程也有一些區(qū)別。
首先,Sub過程定義時(shí)無需定義返回值類型,而Function聲明一般需要用“As 數(shù)據(jù)類型”定義函數(shù)返回值類型。
其次,Sub過程中沒有對(duì)過程名賦值的語(yǔ)句,而Function實(shí)現(xiàn)中一定有對(duì)函數(shù)名賦值的語(yǔ)句。
再次,Sub與Function的調(diào)用方式不同。調(diào)用Sub過程是一個(gè)獨(dú)立的語(yǔ)句,而調(diào)用Function函數(shù)只是表達(dá)式的一部分。Sub過程不會(huì)用名字返回一個(gè)值,而Function函數(shù)一般會(huì)有一個(gè)返回值。
例子:
6.VBA中的注釋
注釋語(yǔ)句是用來說明程序中某些語(yǔ)句或函數(shù)實(shí)現(xiàn)了什么樣的功能,提供了什么樣的接口,使用者應(yīng)該怎么使用的一種輔助性文字。VBA中注釋語(yǔ)句有兩種標(biāo)識(shí)方法。
(1)單引號(hào) 例如:this is compare function.
(2)Rem 例如:Rem this is compare function.
這樣注釋語(yǔ)句就會(huì)變成綠色,區(qū)別于代碼字體的顏色。
二、一些經(jīng)常使用的VBA操作
三、一個(gè)根據(jù)表格數(shù)據(jù)自動(dòng)生成代碼的例子
下面表格中的Message列是代碼中用到的整形變量,ID(Hex)列列出了該整形變量的值。String列是通過整形變量能索引到的字符串。這樣程序中只要使用Message列的變量就能找出相應(yīng)的字符串信息。如果有新的變量要追加,只需要在No.6的后面添加一行,重新運(yùn)行生成代碼的宏(CreateMessagefile),代碼就會(huì)自動(dòng)生成,維護(hù)起來非常的方便。
下面是例子的代碼實(shí)現(xiàn)。
Sub writeheader(obj As Variant, str As String)
obj.WriteLine ("/********************************")
obj.WriteLine (" file name : " & str)
obj.WriteLine (" author : zzzz")
obj.WriteLine (" Create date :" & Date)
obj.WriteLine ("********************************/")
End Sub
Sub CreateMessagefile()
Dim fso_h As Object
Dim fname_h As String
Dim col_message As Long
Dim col_ID_hex As Long
Dim col_string As Long
col_message = 3
col_ID_hex = 4
col_string = 5
'file name
fname_h = "MessageInfo.h"
fname_h = ThisWorkbook.Path & "\" & fname_h
'open header file
Set fso_h = CreateObject("Scripting.File
SystemObject")
Set obj_h = fso_h.CreateTextFile(fname_h, True, False)
'to write comment header of the function
writeheader obj_h, "MessageInfo.h"
'to guard multi-include header file
Dim multi_str As String
multi_str = "__LOG_INFORMATION_H__"
obj_h.WriteLine ("#ifndef " & multi_str)
obj_h.WriteLine ("#define " & multi_str)
obj_h.WriteLine ("")
Cells(65536, 2).Select
Selection.End(xlUp).Select
Row_num = ActiveCell.Row
For i = 3 To Row_num
obj_h.WriteLine ("#define " & Cells(i, col_message).Value & " " & "0x" & Cells(i, col_ID_hex).Value)
Next i
obj_h.WriteLine ("")
obj_h.WriteLine ("typedef struct msg_info")
obj_h.WriteLine ("{")
obj_h.WriteLine (Chr$(9) & "unsigned int msg_val;")
obj_h.WriteLine (Chr$(9) & "char * pMsg;")
obj_h.WriteLine ("}msg_info;")
obj_h.WriteLine ("")
obj_h.WriteLine ("msg_info MsgInfoTotal[] = {")
For i = 3 To Row_num
obj_h.WriteLine (Chr$(9) & "{" & Cells(i, col_message).Value & ", " & """" & Cells(i, col_string).Value & """" & "},")
Next i
obj_h.WriteLine ("};")
obj_h.WriteLine ("")
obj_h.WriteLine ("#endif")
obj_h.Close
MsgBox ("It is over to make Message information!")
End Sub
以上代碼運(yùn)行后,會(huì)在和excel相同的目錄下生成文件MessageInfo.h,即我們需要自動(dòng)生成的文件。
自動(dòng)生成的MessageInfo.h代碼如下所示:
/*************************************************
file name : MessageInfo.h
author : zzzz
Create date :2013/12/20
**************************************************/
#ifndef __LOG_INFORMATION_H__
#define __LOG_INFORMATION_H__
#define msg_inf_1 0xC01A0001
#define msg_inf_2 0xC01B0002
#define msg_inf_3 0xD0120005
#define msg_inf_4 0xD0130006
#define msg_inf_5 0xD0140007
#define msg_inf_6 0xD0150008
typedef struct msg_info
{
unsigned int msg_val;
char * pMsg;
}msg_info;
msg_info MsgInfoTotal[] = {
{msg_inf_1, "file param error!"},
{msg_inf_2, "file logic error!"},
{msg_inf_3, "disk error!"},
{msg_inf_4, "no memory error!"},
{msg_inf_5, "function call failure!"},
{msg_inf_6, "array overflow!"},
};
#endif
本文通過VBA編程中的一個(gè)例子,使VBA的初學(xué)者對(duì)VBA的應(yīng)用能有一個(gè)初步的認(rèn)識(shí),進(jìn)而在工作學(xué)習(xí)中處理表格數(shù)據(jù)時(shí)能多一種解決思路。當(dāng)然,想要精通VBA還需要讀者去深入地學(xué)習(xí)其相關(guān)的知識(shí)點(diǎn),多學(xué),多練,多總結(jié),從而利用VBA工具更高效地處理數(shù)據(jù)。