一、 vba两个integer变量相乘可能会出现溢出,无论储存结果的变量数据类型是多大
例如:
Dim a As Long
a = 30000 * 2 (这里会发生溢出错误)
处理办法是在30000后面加&符号,将其声明为long类型
a = 30000**&** * 2
如果程序比较长可以用下划线连接,但是前后必须有空格字符串连接,用下面办法
把多行程序拼成一行用冒号
****是做整数除法
二、异常处理(GOTO语句还可以用来跳出多层循环,exit可以跳出本层循环)
exit do;exit sub;exit function;exit for
直接屏蔽错误行
三、关于vab中的四舍五入
- 函数Cint和Round函数都是采用的银行家四舍五入,就说将0.5转换成离他最近的整数,就说说3.5和4.5都会转换成4,这样有利于当四舍五入较多时,数据变大的问题
- 如果要用我们常用的0.5都进位,可以用excel自带的函数Round;就是
Application.WorksheetFunction.Round(X,2);2表示标记小数点后的位数,就是说将3.1415 =》
3.14
四、数组
注意10代表最大下标,就是这个数组有11个元素,存放的是字符串
如何定义数组的时候没有声明最大下标,可以用ReDim进行声明,或是通过split拆分字符串直接赋值
定义二维数组Dim cn(9,10) As String 有10行,11列的二维数组(多维数组只需在后面加逗号即可)
定义二维数组Dim cn(1 to 9,1 to 10) As String 有9行,10列的二维数组
将range对象转换成二维数组必须声明为动态数组,必须是变体类型(不指定数据类型),下标是从1,1开始而不是默认的0,0
将***range对象***写回到单元格,让range对象等于单元格即可,二维数组不要求是变体
将一维数组写入到表格中,直接给range赋值,但是写入一列要用下面方法转置
获取多维数组的最大最小小标
五、操作文件
fileName = Dir(“d:\dome*.xlsx”) 可以找到目录下的所有xlsx文件
六、ActiveSheet
ActiveSheet.Cells.Rows.Count表示当前工作表的最大行数
ActiveSheet.UsedRange 表示使用过的范围对象
ActiveSheet.UsedRange.Row 起始行
ActiveSheet.UsedRange.Rows.Count 使用的行数
ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 结束行
七、通过range对象查询表格边界
range对象的find方法,可以使用office自带的几个通配符
在find时关心格式,在查找的时候要制定***LookAt、LookIn、SearchOrder、MatchByte参数***,否则会造成结果不可预测,会记录住搜索框的选项
八、可变参数 Optional
函数传递参数 myFun(c:=5,a:=1)等价于myFun(1,5)
Function myFun(a,Optional b As Integer = 0, Option c As Integer = 0)
End Function
VBA默认传递的是引用(就是函数中变量修改后,主函数值也跟着修改),如果想不影响主函数Function myFun(ByVal a)
九、算数运算
-
List item a Mod b 返回的是a模b的值,就是a除以b的余数
-
List item 生成[a,b]区间的随机整数,包含a,b Int(Rnd()*(b-a+1)+a) 【为了避免每次都生产一样的随机数列,在前面加上 Randomize】
十、事件处理
Application.EnableEvents = False 可以关闭事件触发
十一、查找边界的方式
1.通过do while判断单元格下一行是否为空
缺点:不能处理连续数据
2.通过ActiveSheet.UsedRange
缺点:①可能会将只设置的格式,而没有数据的单元格包含进去
②删除最后一行后,UsedRange不会立刻变化,由于Excel考虑执行效率,不会立刻更新,只有执行保存操作后才会返回正确的结果
3.通过Range.End(方向)方法,相当于Ctrl+上下左右键
缺点:
- 如果表格没有数据,还是会返回第一行
- 如果表格写满数据,则会返回数据的上边界
- 只能找某一列的最后一行
- 如果遇到合并的单元格,会返回合并单元格的第一个单元格
- 筛选过或者是隐藏的行不会被处理,会从边界跳过去
Set r = Cells(Rows.Count,1).End(xlUp)
Set r = Cells(1,Columns.Count).End(xlToLeft) '查找最后一列 - 通过Range.SpecialCells(xlCellTypeLastCell) 【返回最后一个单元格(右下角的单元格)相当于UsedRange】
- 通过find方法
Dim r As Range
Set r = Cells.Find("*",after:=Range("A1"),searchorder:=xlRows,searchdirection:=xlPrevious)
If r Is Nothing Then
MsgBox "表格中没有数据"
Else
MsgBox r.Row
End If
十二、自定义排序排序
多关键字排序原理:相当于先对次要关键字排序,在对主关键字排序的多次单关键字排序
十二、正则表达式
1.()圆括号的使用
2.正则中的环视功能
十三、打开文件对话框的几种方式
- 方法:Application.GetOpenFilename
- 方法:Application.GetSaveAsFilename
- 属性:Application.FileDialog
十四、错误处理
- 从现在开始不处理错误,直接跳到下一行 On Error Resume Next
- 在可能出现错误的代码前面写上 ,On Error GoTo somethingWrong,再程序最后写上标签somethingWrong: 在这个标签前要Exit Sub
- Err常量代表系统中最近一次发生的错误,Err.Number错误代码;Err.Description该错误的详细描述;Err.Clear将错误清空
- 使用Resume Next可以让程序提示完错误以后再跳转回程序
- On Error GoTo 0 恢复VBA默认的错误处理机制
十五、Excel加载项
将一个函数保存为加载项,可以在任何文件的单元格中调用函数
将一个子程序保成一个加载项,让他可以被任何程序调用
在工具栏中添加按钮