1. 注释是用 单引号开头
  2. 语句结束不需要分号
Function F2()
  MsgBox F1
    Range("A1").Value = 99
End Function
  • 1.
  • 2.
  • 3.
  • 4.
  1. 定义子程序
Sub 方法名字()
...
end Sub
  • 1.
  • 2.
  • 3.
  1. 方法体不需要{}包裹
Function F2()
  MsgBox F1
    Range("A1").Value = 99
End Function
  • 1.
  • 2.
  • 3.
  • 4.
  1. 函数 ,和子程序的区别在于有返回值,他们都可以被office 调用
Function xfe1(a As Integer, b As Integer)
    ‘返回值是是直接是 方法名 = 返回值,如果多个返回值可以使用数组
    xfe1 = a + b
End Function
  • 1.
  • 2.
  • 3.
  • 4.
  1. 函数变量命名规范,不能使用保留关键字,不能数字开头
    需要注意的是excel中的纵坐标已经是三个字母开头了,所以要避免使用低于4个字母的方法名或者变量名,比如a1,f1,m1这种会和excel的单元格坐标冲突,如果一定要用三个字符开头,需要取xfd以后得名字,至少要去xfe1以后得名字,全局变量和方法名字建议直接4个字符以上的开头(在VBA里面是不会冲突的,在excel里面当做公式使用会报错)。
  2. 有参数的子程序和函数的定义和调用
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 子程序调用后面不能加括号,子程序没有返回值不能赋值给别的变量或者作为实参赋值给形参
  • 函数调用可以 使用用括号调用或者无括号调用
  • 函数调用 赋值给别的变量或者作为实参的时候必须使用括号
  • 函数调用 不需要使用返回值赋值给别的变量的时候不能使用括号
  • 总的来说子过程不能使用括号,函数在使用到返回值的时候必须使用括号,没有使用到返回值的时候不能使用括号
  1. 弹出提示框
    MsgBox "xxxx"
  2. 变量申明
Dim xxx As Interger
’可以一次申明多个变量
Dim var1 As String,var2 As Integer
  • 1.
  • 2.
  • 3.
  1. 如果不指定数据类型,就是自动类型(Variant),会自动变长,会不会自动变小?
Dim var2 

var = 100
  • 1.
  • 2.
  • 3.
  1. 常量申明
Const var3 as Integer
  • 1.
  1. vba里面的变量默认没申明也可以直接使用,可以指定为必须申明才能使用
‘下面这代码指定变量必须申明才能用
Option Explicit

Sub 方法名字()
...
Sub end
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. vba的数据类型
  • Byte 1字节
  • Boolean 2字节 ?还是1位?
  • Integer 只有2 字节?
  • Long ,只有4个字节,是java的 Long 的一半?
  • Currency 8个字节 这个才是真的Long
  • Single 4字节, 单精浮点数
  • Double 8字节 双精浮点数
  • Date ,需要写成 #01/30/2024# 格式
  • String
  1. vba的关键字,数据类型第一个字符都是大写,申明的变量和方法没有强制要求大写开头,为了区分可以建议小写开头
    但是貌似VBA的内置方法和属性都是大写开头,比如excel里面的内置属性和方法
  2. 变量的三种生命周期,子程序内有效<模块内有效<全局有效
’可以使用 生命变量跨模块有效。 需要写在子函数外面
Public  var1 As Integer

Sub 方法名字()
...
Sub end
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. Static 修饰子程序里面的变量,这样的变量在子程序执行完以后不会回收内存,效果类把变量定义在子程序外面,
Sub 方法名字()
	Static var1 As Integer
End Sub
  • 1.
  • 2.
  • 3.
  1. VBA 里面的运算符和access的类似,或者说因为使用VBA office 全套都是这用法 / 表示除,\ 表示整除 Mod 表示取余数,不等于用 <>,等于还是用的 = 不是==?
  2. VBA 的 逻辑运算符 And ,Or ,Not
isTure =  (1>2) And (2>1)

isTure =  (1>2) Or  (2>1)

isTure =  Not (2>1)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  1. if 的写法
If var1 = 0 Then
    MsgBox "0"
ElseIf var1 = 1 Then
    MsgBox "1"
Else
    MsgBox "其他"
End If
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  1. 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  1. 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  1. do while 后面写的执行条件
Do While 执行条件
    执行代码
    ‘改变条件变量退出循环 或者 Exit Do While?
Loop
  • 1.
  • 2.
  • 3.
  • 4.
  1. do until 后面写的是退出条件
Do Until 退出条件
    执行代码
    ‘改变条件变量退出循环 或者 Exit Do While?
Loop
  • 1.
  • 2.
  • 3.
  • 4.
  1. 数组的定义和使用
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  1. 数组的定义可以只写上标
’默认是0-10
Dim array1(10) as Integer
  • 1.
  • 2.
  1. 可以通过 option base 1 设置默认下标
Option base 1

’默认是1-10
Dim array1(10) as Integer
  • 1.
  • 2.
  • 3.
  • 4.
  1. 二维数组的定义,需要注意的是二维数组里面的那一维是列,外围是行
    考虑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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  1. 动态数组
‘定时动态数组
Dim array1() as Integer

’确定边界
ReDim array1(1 to 3)

‘然后正常使用

’可以再次调整,这就是用处了
ReDim array1(1 to 50)


’可以通过Preserve保留历史数组
ReDim Preserve  array1(1 to 20)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  1. VB是面向对象的语言为啥C语言是面向过程的语言?还是说VB之前是面向过程,后来补充的面向对象的模块?
  2. excel里面的对象层级关系是 程序>工作簿>工作表>表格
' 完整写法
Application.Workbooks(“打开的工作部的名称.xlsm”).Worksheets(“Sheet1”).Range("A1").Value=100

’ 能这样简写是因为前面都使用的当前环境,sheet用的当前选中的sheet
Range("A1").Value=100
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  1. Range 可以定位excel的单元格
’单个格子
 Range("D4")
’连续区域
 Range("D4:F14")
 ’多格格子
 Range("D4,f6")
’多个区域
 Range(""D4:F14,H11,Z66")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  1. Range(xxx).Cells是相对Range的相对坐标,Range(xxx).Offset 的区别
  • Offset只能在Range以后使用,表示相对位置,Cells可以直接使用表示绝对位置,也能在Range 后面使用表示相对位置
  • 使用相对坐标的时候,Offset没有0坐标,Cells有0,0 坐标等价于Offset(-1,-1)
  • 他们的坐标都是数字,Range("A1")的坐标是字母表示纵坐标
  1. Range(xxx).Select 和 Range(xxx).Activate的区别
  • Select 是选中一个区域,默认激活第一个选中的格子
  • Activate是激活一个格子,激活一个区域的时候等同于选中一个区域,然后激活第一个格子
  • 可以先用Select 选中范围,然后使用activate指定激活的格子,在激活单个格子并且位于之前选中区域的时候选中区域不会改变
  • 然后可以通过 Selection.Value,ActiveCell.Value 设置值
  1. end方法,相当于ctrl+shift+箭头
    Range(xxx).End(Xl方向) 相当于 ctrl + 箭头
    Range(左上,Range(xxx).End(Xl方向)) 可以选中指定区域
Range("C3", Range("C3").End(xlDown).End(xlToRight)).Select
  • 1.
  1. excel 里面的单元格坐标是默认的变量,比如A1,并且A1默认指向A1.Value
  2. 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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  1. 使用for each 变量 excel 的 range
  2. 接受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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  1. excel 要弃用vba宏需要 保存为xlsm格式,xlsx格式默认没有开启宏