VBA语法和常用函数整理
Application.ScreenUpdating:控制宏运行时屏幕是否更新的属性。
防止在宏执行时屏幕闪烁和更新,从而使宏运行更快、更流畅,特别是在涉及大量对 Excel 界面的更改时。
Sub Main()
' 关闭屏幕更新
Application.ScreenUpdating = False
' 在这里编写你的宏代码
' 打开屏幕更新
Application.ScreenUpdating = True
End Sub
' 获取活动工作表的总行数和总列数
ActiveSheet.UsedRange.Rows.Count
ActiveSheet.UsedRange.Columns.Count
' 获取指定单元格
ActiveSheet.Cells(row,col)
ActiveSheet.UsedRange
ActiveSheet.Range("B9:B33")
' vbNullString 预定义常量,表示一个空字符串
' vbCrLf 换行符
' & 拼接字符串
' _ 行连接符 将过长的单行代码分割为多行 提高代码可读性
语法
变量
本地变量:在子程序中声明的变量,只能在当前程序内进行访问。当退出此程序时,变量也会失效。
普通变量:页面上的所有子程序都可以访问它。生存期始于它们被声明,止于页面被关闭。
dim name
name=some value
name=some value
option explicit
dim name
name=some value
**声明再赋值,和直接赋值效果是一样的。如果变量名写错,系统不会报错,而是新建一个变量。为避免这种情况,可以在脚本开头使用 **
Option Explicit
,现在要求所有变量必须先使用 dim、public 或 private 语句来声明才能使用。
数组变量
'包含三个元素
dim names(2)
names(0)="George"
names(1)="John"
names(2)="Thomas"
'二维数组 5行7列
dim table(4, 6)
子程序及调用
无参
Sub test()
'TODO
End Sub
Call test
test
有参
Sub test(arg1,arg2)
'TODO
End Sub
Call test(arg1,arg2)
test arg1,arg2
函数及调用
无参
Function test1()
'TODO
test1 = some value
End Function
' 可以通过Call调用函数 但一般都使用变量接收函数的返回值
Call test1
test1
a = test1()
有参
Function test2(a, b, c)
'TODO
test2 = some value
End Function
Call test2(1, 2, 3)
test2 1, 2, 3
b = test2(1, 2, 3)
分支结构
if condition Then 'TODO
if condition1 then
'TODO
elseif condition2 then
'TODO
elseif condition3 then
'TODO
else
'TODO
end If
如果要判断多个条件同时为真,推荐使用嵌套结构,而不是使用 And 连接多个条件,因为 VBA 不会因为某个条件为 False 而终止后面条件的判断(也就是不会短路)。
Case 后面可以跟多个值
Select Case str
Case ""
'TODO
Case ""
'TODO
Case Else
'TODO
End Select
Dim Selection As Integer
Selection = InputBox("请选择下列功能序号" & vbCrLf & _
"1、数据有效性校验" & vbCrLf & _
"2、数据逻辑性校验" & vbCrLf & _
"0、全部功能校验", "功能菜单", 0)
Select Case Selection
Case 1
MsgBox "1"
Case 2
MsgBox "2"
Case 0
MsgBox "0"
Case Else
MsgBox "输入错误!自动退出ヾ( ̄▽ ̄)Bye~Bye~"
End Select
循环结构
step 指定步长,即每次循环增加的幅度
For i=1 To 10 Step 2
'TODO
Next
Do
'TODO
flag = MsgBox("执行完成,是否继续执行?", vbYesNo, "格式错误")
Loop While (flag = vbYes)
常用函数
字符串
- Trim(ActiveSheet.Cells(row,col)),去掉字符串前后的空格
- UCase(ActiveSheet.Cells(row,col)),字符串转大写
- Left(ActiveSheet.Cells(row,col).Value, num),取最左边指定个数的字符
- Right(ActiveSheet.Cells(row,col).Value, num),取最右边指定个数的字符
- InStr(1, CStr(ActiveSheet.Cells(row,col).Value), str),查找单元格中是否存在指定字符串,索引从 1 开始
- 第一个参数 1,
- StrComp(ActiveSheet.Cells(row,col).Value, UCase(ActiveSheet.Cells(row,col).Value), vbBinaryCompare)
- vbBinaryCompare,二进制方式比较,区分大小写
- vbTextCompare,文本方式比较,不区分大小写
- vbDatabaseCompare,数据库方式比较
- 如果比较结果相同就返回 0,否则返回非零值(比较的是码表中的前后顺序)
- Mid(ActiveSheet.Cells(row,col).Value, pos, num),从指定位置提取指定个数的字符串
- Replace(Trim(str), Chr(10), vbNullString),先去前后空格,再去掉换行符,需要用一个变量接收返回值,否则编译失败
Cells.Replace What:=Chr(10), Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
用于替换单元格内容的语句,它将单元格中的换行符(Chr(10)
)替换为空字符串,即将换行符删除。
What:=Chr(10)
: 这里的Chr(10)
是一个特殊的函数,表示 ASCII 字符码为 10 的字符,即换行符("\n"
)。所以,此处是指定要替换的内容为换行符。Replacement:=""
: 这表示将被替换的内容替换为一个空字符串,即删除换行符。LookAt:=xlPart
: 这指定了在查找过程中如何匹配目标内容。xlPart
表示查找部分匹配,即只要单元格中包含要查找的内容的一部分,就会被视为匹配项。SearchOrder:=xlByRows
: 这表示搜索顺序,xlByRows
表示按行搜索,即从上到下逐行搜索。MatchCase:=False
: 这表示是否区分大小写。False
表示不区分大小写,即不管单元格中的内容是大写还是小写,都会被替换。SearchFormat:=False
: 这表示是否搜索单元格格式。False
表示不考虑单元格的格式。ReplaceFormat:=False
: 这表示是否保留替换后的格式。False
表示替换后的单元格将保持原有的格式。
数字
- IsNumeric(ActiveSheet.Cells(row,col).Value),判断是否数字
- Abs(ActiveSheet.Cells(row,col).Value),返回绝对值
- Val(ActiveSheet.Cells(row,col).Value),字符串转数字
- Fix(Val(ActiveSheet.Cells(row,col).Value)),将数字截取为最接近的整数,正数向下取,负数向上取
- Round(Trim(ActiveSheet.Cells(row,col).Value), "0.00"),四舍五入
- Format(ActiveSheet.Cells(row,col).Value, "0.00"),将日期和数字格式化为字符串
- CDbl(ActiveSheet.Cells(row,col)),将单元格内容转为双精度浮点数
1# 是 1.0 的缩写,用于明确指定这是一个双精度浮点数
日期和时间
- IsDate(ActiveSheet.Cells(row,col)).Value),判断是否日期
- DateDiff(unit,date1,date2),计算两个日期/时间的差异,第一个参数表达单位,比如计算秒、天、月等
- s、d、m
- Now(),返回当前日期和时间
- Date,表示当前日期
- DateSerial(1990, 1, 1),创建一个表示特定日期的日期序列
- DateAdd("yyyy", 2, Date),向指定日期添加一定的时间间隔,当前日期加两年
- DateSerial(Year(Date), 1, 1),获取当年第一天
- firstdayofyear = Format(CStr(Year(Date)) & "/01" & "/01", "yyyy/mm/dd")
- CDate(ActiveSheet.Cells(i, 14).Value),转日期
其他
- LBound(arr)、UBound(arr),用于确定数组的上下界,即第一个元素和最后一个元素的索引值
- Len(),返回单元格内容长度
- InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
prompt
: 必需,要显示给用户的提示字符串title
: 可选,输入框的标题default
: 可选,输入框中显示的默认值xpos
,ypos
: 可选,输入框的位置(以窗口左上角为原点)helpfile
,context
: 可选,指定帮助文件和帮助上下文 ID