如何在Excel中使用VBA编程
2014-01-13苏子伟
苏子伟
利用Excel软件处理大量数据的过程中,分离有些需要的数据是比较困难的,并且Excel中的宏函数并不能很容易、很纯粹地解决这些问题。这时使用VBA进行数据处理就是最佳的选择。VBA本身与Excel的结合是无缝的,且提供了大量丰富的函数。用VBA操纵表格的过程简单,并且效率极高。
一、下面从六个方面说明VBA编程语言的结构
1.运算符
(1)赋值运算符: =
(2)数学运算符:&(字符连接符)、+(加)、-(减)、*(乘)、
/(除)、Mod(取余)、\(整除)、-(负号)、^(指数)
(3)逻辑运算符:Not(非)、And(与)、Or(或)、Xor(异或)、Eqv(相等)、Imp(隐含)
(4)关系运算符:= (相等)、<>(不等)、>(大于)、<(小于)、>=(不小于)、<=(不大于)、Like、Is
(5)位运算符:Not(逻辑非)、And(逻辑与)、Or(逻辑或)、Xor(逻辑异或)、Eqv(逻辑等)、Imp(隐含)
2.数据类型
下面列举了一些常用类型及其所占的字节空间。
3.VBA的变量
4.VBA中的流程控制
(1)判断结构
(2)循环结构
5.函数和过程的声明与使用
函数和过程都是为了实现一个特定的机能而写的独立的模块代码。函数的声明采用Function、End Function,而过程使用Sub和End Sub来表示。二者形式上很相像,但是函数与过程也有一些区别。
首先,Sub过程定义时无需定义返回值类型,而Function声明一般需要用“As 数据类型”定义函数返回值类型。
其次,Sub过程中没有对过程名赋值的语句,而Function实现中一定有对函数名赋值的语句。
再次,Sub与Function的调用方式不同。调用Sub过程是一个独立的语句,而调用Function函数只是表达式的一部分。Sub过程不会用名字返回一个值,而Function函数一般会有一个返回值。
例子:
6.VBA中的注释
注释语句是用来说明程序中某些语句或函数实现了什么样的功能,提供了什么样的接口,使用者应该怎么使用的一种辅助性文字。VBA中注释语句有两种标识方法。
(1)单引号 例如:this is compare function.
(2)Rem 例如:Rem this is compare function.
这样注释语句就会变成绿色,区别于代码字体的颜色。
二、一些经常使用的VBA操作
三、一个根据表格数据自动生成代码的例子
下面表格中的Message列是代码中用到的整形变量,ID(Hex)列列出了该整形变量的值。String列是通过整形变量能索引到的字符串。这样程序中只要使用Message列的变量就能找出相应的字符串信息。如果有新的变量要追加,只需要在No.6的后面添加一行,重新运行生成代码的宏(CreateMessagefile),代码就会自动生成,维护起来非常的方便。
下面是例子的代码实现。
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
以上代码运行后,会在和excel相同的目录下生成文件MessageInfo.h,即我们需要自动生成的文件。
自动生成的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编程中的一个例子,使VBA的初学者对VBA的应用能有一个初步的认识,进而在工作学习中处理表格数据时能多一种解决思路。当然,想要精通VBA还需要读者去深入地学习其相关的知识点,多学,多练,多总结,从而利用VBA工具更高效地处理数据。