VBA语法基础
-
注释是用 单引号开头
‘
-
语句结束不需要分号
Function F2() MsgBox F1 Range("A1").Value = 99 End Function
-
定义子程序
Sub 方法名字() ... end Sub
-
方法体不需要{}包裹
Function F2() MsgBox F1 Range("A1").Value = 99 End Function
-
函数 ,和子程序的区别在于有返回值,他们都可以被office 调用
Function xfe1(a As Integer, b As Integer) ‘返回值是是直接是 方法名 = 返回值,如果多个返回值可以使用数组 xfe1 = a + b End Function
-
函数变量命名规范,不能使用保留关键字,不能数字开头
需要注意的是excel中的纵坐标已经是三个字母开头了,所以要避免使用低于4个字母的方法名或者变量名,比如a1,f1,m1这种会和excel的单元格坐标冲突,如果一定要用三个字符开头,需要取xfd以后得名字,至少要去xfe1以后得名字,全局变量和方法名字建议直接4个字符以上的开头(在VBA里面是不会冲突的,在excel里面当做公式使用会报错)。 -
有参数的子程序和函数的定义和调用
Function func1(a As Integer, b As Integer) MsgBox a * b xfe1 = a + b End Function Sub subp1(a As Integer, b As Integer) MsgBox a + b End Sub Sub subp2() '不行 func1(1, 2) '可以 func1 1, 2 '不行 subp1(1, 2) '可以 subp1 1, 2 '可以 MsgBox func1(1, 2) '不行 MsgBox func1 1, 2 '不行 MsgBox subp1(1, 2) '不行 MsgBox subp1 1, 2 End Sub
- 子程序调用后面不能加括号,子程序没有返回值不能赋值给别的变量或者作为实参赋值给形参
- 函数调用可以 使用用括号调用或者无括号调用
- 函数调用 赋值给别的变量或者作为实参的时候必须使用括号
- 函数调用 不需要使用返回值赋值给别的变量的时候不能使用括号
- 总的来说子过程不能使用括号,函数在使用到返回值的时候必须使用括号,没有使用到返回值的时候不能使用括号
-
弹出提示框
MsgBox "xxxx" -
变量申明
Dim xxx As Interger ’可以一次申明多个变量 Dim var1 As String,var2 As Integer
-
如果不指定数据类型,就是自动类型(Variant),会自动变长,会不会自动变小?
Dim var2
var = 100
-
常量申明
Const var3 as Integer
-
vba里面的变量默认没申明也可以直接使用,可以指定为必须申明才能使用
‘下面这代码指定变量必须申明才能用 Option Explicit Sub 方法名字() ... Sub end
-
vba的数据类型
- Byte 1字节
- Boolean 2字节 ?还是1位?
- Integer 只有2 字节?
- Long ,只有4个字节,是java的 Long 的一半?
- Currency 8个字节 这个才是真的Long
- Single 4字节, 单精浮点数
- Double 8字节 双精浮点数
- Date ,需要写成 #01/30/2024# 格式
- String
-
vba的关键字,数据类型第一个字符都是大写,申明的变量和方法没有强制要求大写开头,为了区分可以建议小写开头
但是貌似VBA的内置方法和属性都是大写开头,比如excel里面的内置属性和方法 -
变量的三种生命周期,子程序内有效<模块内有效<全局有效
’可以使用 生命变量跨模块有效。 需要写在子函数外面 Public var1 As Integer Sub 方法名字() ... Sub end
-
Static 修饰子程序里面的变量,这样的变量在子程序执行完以后不会回收内存,效果类把变量定义在子程序外面,
Sub 方法名字() Static var1 As Integer End Sub
-
VBA 里面的运算符和access的类似,或者说因为使用VBA office 全套都是这用法
/
表示除,\
表示整除Mod
表示取余数,不等于用<>
,等于还是用的 = 不是==? -
VBA 的 逻辑运算符 And ,Or ,Not
isTure = (1>2) And (2>1) isTure = (1>2) Or (2>1) isTure = Not (2>1)
-
if 的写法
If var1 = 0 Then MsgBox "0" ElseIf var1 = 1 Then MsgBox "1" Else MsgBox "其他" End If
-
select case 类似 switch case
Dim var1 As Integer var1 = 3 Select Case var1 Case Is = "1" MsgBox "1" Case Is = "2" MsgBox "2" Case Else MsgBox "其他" End Select
-
for next 就是for循环
Sub m6() Dim var1 As Long var1 = 100 '前面的赋值会被1 覆盖 For var1 = 1 To 5 MsgBox var1 ’效果等于var1++ Next var1 End Sub Sub m7() Dim var1 As Long var1 = 100 '设置步长是2,类似i+=2 For var1 = 1 To 5 Step 2 MsgBox var1 Next var1 End Sub Sub m8() Dim var1 As Long var1 = 100 'Exit for 退出for循环,类似 break For var1 = 1 To 50 Step 2 MsgBox var1 If var1 > 5 Then Exit For End If Next var1 End Sub Sub m9() Dim var1 As Long, var2 As Long 'Exit For 和 breack一样只能退出当前循环 For var1 = 1 To 3 MsgBox var1 For var2 = 3 To 10 MsgBox var1 & "" & var2 If var2 > 4 Then Exit For End If Next var2 Next var1 End Sub
-
do while 后面写的执行条件
Do While 执行条件 执行代码 ‘改变条件变量退出循环 或者 Exit Do While? Loop
-
do until 后面写的是退出条件
Do Until 退出条件 执行代码 ‘改变条件变量退出循环 或者 Exit Do While? Loop
-
数组的定义和使用
Dim array1(1 to 10) as Integer array1(1) = 1 array1(2) = 2 array1(3) = 3 array1(4) = 4 array1(10) = 10 ‘LBound,UBound可以取到上下标 Dim i as Integer For i = LBound(array1) to UBound(array1) MsgBox array(i) Next i
-
数组的定义可以只写上标
’默认是0-10 Dim array1(10) as Integer
-
可以通过 option base 1 设置默认下标
Option base 1 ’默认是1-10 Dim array1(10) as Integer
-
二维数组的定义,需要注意的是二维数组里面的那一维是列,外围是行
考虑excel 格子是A1这种格式,在二维数组遍历的时候,内层先执行完,这和excel坐标列在前是相符合的‘定义了一个5行,10 列的二维数组 Dim array1(1 to 5,1 to 10) as Integer ’赋值 array1(1,1) = 11 array1(1,2) = 12 array1(2,1) = 21 ’取行数 UBound(array1,1) ‘取列数 UBound(array1,2)
-
动态数组
‘定时动态数组 Dim array1() as Integer ’确定边界 ReDim array1(1 to 3) ‘然后正常使用 ’可以再次调整,这就是用处了 ReDim array1(1 to 50) ’可以通过Preserve保留历史数组 ReDim Preserve array1(1 to 20)
-
VB是面向对象的语言为啥C语言是面向过程的语言?还是说VB之前是面向过程,后来补充的面向对象的模块?
-
excel里面的对象层级关系是 程序>工作簿>工作表>表格
' 完整写法 Application.Workbooks(“打开的工作部的名称.xlsm”).Worksheets(“Sheet1”).Range("A1").Value=100 ’ 能这样简写是因为前面都使用的当前环境,sheet用的当前选中的sheet Range("A1").Value=100
-
Range 可以定位excel的单元格
’单个格子 Range("D4") ’连续区域 Range("D4:F14") ’多格格子 Range("D4,f6") ’多个区域 Range(""D4:F14,H11,Z66")
-
Range(xxx).Cells是相对Range的相对坐标,Range(xxx).Offset 的区别
- Offset只能在Range以后使用,表示相对位置,Cells可以直接使用表示绝对位置,也能在Range 后面使用表示相对位置
- 使用相对坐标的时候,Offset没有0坐标,Cells有0,0 坐标等价于Offset(-1,-1)
- 他们的坐标都是数字,Range("A1")的坐标是字母表示纵坐标
-
Range(xxx).Select 和 Range(xxx).Activate的区别
- Select 是选中一个区域,默认激活第一个选中的格子
- Activate是激活一个格子,激活一个区域的时候等同于选中一个区域,然后激活第一个格子
- 可以先用Select 选中范围,然后使用activate指定激活的格子,在激活单个格子并且位于之前选中区域的时候选中区域不会改变
- 然后可以通过 Selection.Value,ActiveCell.Value 设置值
-
end方法,相当于ctrl+shift+箭头
Range(xxx).End(Xl方向) 相当于 ctrl + 箭头Range(左上,Range(xxx).End(Xl方向)) 可以选中指定区域
Range("C3", Range("C3").End(xlDown).End(xlToRight)).Select
-
excel 里面的单元格坐标是默认的变量,比如A1,并且A1默认指向A1.Value
-
with语句 ,类似链式编程
'with里面的可以链式的对Worksheets("Sheet1").Range("A1:C10")对象进行调用 With Worksheets("Sheet1").Range("A1:C10") .Value = 30 .Font.Bold = True .Interior.Color = RGB(255, 255, 0) End With
-
使用for each 变量 excel 的 range
-
接受excel单元格的几种方式
'定义一个区域的方法参数 Function func2(rng As Range) Dim cell As Range For Each cell In rng Sum = Sum + cell.Value Debug.Print cell.Row; "," & cell.Column Next cell func2 = Sum End Function '定义的2个单元格的方法 Function func3(c1 As Range, c2 As Range) func3 = c1.Value + c2 End Function '动态参数,输入参数是 A1,A2,A3这样的格式,且是动态多个参数 Function func4(ParamArray params()) For i = LBound(params) To UBound(params) Sum = Sum + params(i) Next i func4 = Sum End Function
-
excel 要弃用vba宏需要 保存为xlsm格式,xlsx格式默认没有开启宏
能耍的时候就一定要耍,不能耍的时候一定要学。
--天道酬勤,贵在坚持posted on 2024-08-16 17:40 zhangyukun 阅读(133) 评论(0) 编辑 收藏 举报