不怕学得杂,就怕学得杂之后过段时间什么都忘掉了,还是把笔记贴这里吧
一. EXCEL VBA 基础语法
1. 对变量或对象属性赋值使用等号(=),对变量进行赋值使用set或:=,如:
Set myobj=oldobj或myobj:=oldobj
2. 基本语句
长语句可以用 空格+下划线 换行
(1) If then [else]
或If then elseif then elseif then …..else end if
(2) Select case …case …end case,如:
Select case PID
Case “a101”
Price=100
Case “a102”
Price=200
……..
Case else
Price=900;
End case
(3) choose(index,choice1,hoice2….)
用来选择由index指定的后面的一列数据,下标由1开始,如:
gotchoice = Choose(1, "11111", "2222"),返回“11111”
(4) Switch(expr-1,value-1[,expr-2,value-2_[,expr-n,value-n]])
如果expr-1为真,则返回value-1,否则返回expr-2
(5) For counter=start to end [Step step] ' step缺省值为1
[statements]
[Exit For] '在这里在达到某种条件是退出循环
[statements]
Next counter
如:
For Words=10To1 Step-1 ' 建立10次循环
For Chars=0 To 9 ' 建立10次循环
MyString=MyString & Chars ' 将数字添加到字符串中
Next Chars ' Incrementcounter
MyString=MyString & " " ' 添加一个空格
Next Words
(6) For Each…in Next语句 主要功能是对一个数组或集合对象进行,让所有元素重复执行一次语句
For Each element In group
Statements
[Exit for]
Statements
Next[element]
(7) Do {while |until} condition
Statements
Exitdo
Loop
或者是
Do
Statements
Exitdo
Loop {while |until} condition 如:
Dim a As Integer
a = 90
Do While a < 100
a = a + 6
Loop
(8) on expression goto
On error goto
3. 数据类型:string,integer,…..
字符串的合并采用关键字:&,如
Dim myStr as String
Dim i as integer
i=10
myStr= “the I is “ & i ‘输出the I is 10
系统会自动将其他类型的数据转换为字符串形式
常用的字符串函数有:
Strcomp(str1,str2),返回的值有-1,0,1
Mid(strSource,startIndex,len),取出字符串strSource第startIndex开始的Len个字符,下标是从1开始的
Left(strSource,len),取strSource里从左边开始的Len个字符
Vba.trim(strSource),去除strSource里面的空格,对应类似的函数还有vba.trimLeft(strSource),vba.trimRight(strSouce),分别去除左边的空格和右边的空格
split(strSouce,strDelimiter),分割字符串
类型转换:
CInt(sourceContent),将sourceContent里的数据转换成整形
CSng(sourceContent),将sourceContent里的数据转换成浮点型
CDate(sourceContent),将sourceContent里的数据转换成日期型数据,日期型数据可以进行加减运算
自定义数据类型,相当于C里面的结构体,使用Type typeName …..end Type,应将其定义到模块中,如:
Type DealInfo
strDate As String
startIndex As Integer
endIndex As Integer
End Type
4. 过程和函数
VBA具有四种过程:Sub过程、Function函数、Property属性过程和Event事件
1Sub过程
Sub过程的参数有两种传递方式:按值传递(ByVal)和按地址传递(ByRef)。如下例:
Sub password(ByVal x as integer, ByRef y as integer)
If y=100theny=x+ y else y=x-y
x=x+100
End sub
默认的情况是按byRef传递的
2function 和sub过程类似,但是可以有返回值,返回值传递给函数名
Function password(ByVal x as integer,byref y as integer)as boolean
If y=100then y=x+y else y=x-y
x=x+100
if y=150 then password=true else password=false
End Function
函数和过程的级别有工作表级和工作簿级,写在工作表上的函数和过程一般开头都有private限定符,这表示这个函数(或过程)只能由当前工作表里的其他函数调用,而工作簿级的函数则一般写在模块中,限定符使用Public,这时它可以被所有的函数或过程调用,还可以在EXCEL的表单里使用这个函数。
调用过程:call subName(…)
调用函数:
Dim retureVal as type
returnVal=FuncName(…)
5. 数组:包括静态数组和动态数组
静态数组定义:dim arrayName( length) as type 一维数组
dim arrayName(row,colum) as type 二维数组
默认的情况下,数组的下标是从0开始的
动态数组定义:dim arrayName( ) as type
这样定义的时候没有分配任何内存空间,在使用之前,必须用redim对其进行初始化,如:
Dim stuName() as string
Redim stuName(10)
……….赋值
Redim preserve stuName(20) ‘增加长度为20,并保留原来前10个数据
二. 操作EXCEL 对象
EXCEL里面的对象根据不同级别有:application,workbook,worksheet,range,cells
Application:
是可用的顶级对象,由于所有的EXCEL VBA程序都是以EXCEL作为容器来运行的,所以Application对象就是EXCEL这个程序本身
Workbook:
是一个EXCEL文件
Worksheet:
是EXCEL文件里的一个工作表,可以使用worsheets(”sheetName”)或worksheets(index)即可获得相应的工作表对象
Range:
是一个工作表里的区域,可以为不相互连通的多个区域集合,通过指定区域来获得,如Range(“A1:B3”)则获得当前工作表里的A1到B3的所有单元格的集合,构成一个区域。如果是多个区域,可以用逗号分开,如Range(“A1:B3,C4:D5”),使用Range可以对一个区域进行赋值,如Range(“A2:D10”)=””,为将A2到D10的内容清空
Cells:
工作表里的单元格,根据Cells(rowIndex,columIndex)获得指定的单元格,下标是从1开始的,而非0。如Cells(1,2).value=”test”,是将B1的值设为test
Selection:
表示当前被选中对象
Excel里的对象的获得都是通过OLE接口调用获得的,而OLE接口的调用是费时的,所以在代码里,如果要多次用到一个从其上级对象下溯到的对象,应该先取出这个的对象的引用,后面的操作都在这个引用上面进行。同时如果要在一个对象上设置多个属性的值,应该使用with语句,如:
With thisObj
.property1=val1
.property2=val2
………………..
End with
使用EXCEL表单函数,在excel数据界面可以使用的函数,在程序里面也可以使用,都被封装在WorksheetFunction对象中,例如要获得A列的非空单元个数,可以使用
WorksheetFunction.Counta(Range("A:A"))
三. 学习EXCEL VBA编程的方法
EXCEL里面几乎所有的操作都可以录制成宏,所以如果要用代码实现那些可以用录制宏实现的功能,但是又不知道一些属性和方法,就可以先把这些操作录制成宏,然后查看其宏代码,了解其所用到的属性和方法,然后自己就可以写出精简版的代码了