VBA语法基础

  1. 注释是用 单引号开头

  2. 语句结束不需要分号

    Function F2()
      MsgBox F1
        Range("A1").Value = 99
    End Function
    
  3. 定义子程序

    Sub 方法名字()
    ...
    end Sub 
    
  4. 方法体不需要{}包裹

    Function F2()
      MsgBox F1
        Range("A1").Value = 99
    End Function
    
  5. 函数 ,和子程序的区别在于有返回值,他们都可以被office 调用

    Function xfe1(a As Integer, b As Integer)
        ‘返回值是是直接是 方法名 = 返回值,如果多个返回值可以使用数组
        xfe1 = a + b
    End Function
    
  6. 函数变量命名规范,不能使用保留关键字,不能数字开头
    需要注意的是excel中的纵坐标已经是三个字母开头了,所以要避免使用低于4个字母的方法名或者变量名,比如a1,f1,m1这种会和excel的单元格坐标冲突,如果一定要用三个字符开头,需要取xfd以后得名字,至少要去xfe1以后得名字,全局变量和方法名字建议直接4个字符以上的开头(在VBA里面是不会冲突的,在excel里面当做公式使用会报错)。

  7. 有参数的子程序和函数的定义和调用

    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
    
    
    • 子程序调用后面不能加括号,子程序没有返回值不能赋值给别的变量或者作为实参赋值给形参
    • 函数调用可以 使用用括号调用或者无括号调用
    • 函数调用 赋值给别的变量或者作为实参的时候必须使用括号
    • 函数调用 不需要使用返回值赋值给别的变量的时候不能使用括号
    • 总的来说子过程不能使用括号,函数在使用到返回值的时候必须使用括号,没有使用到返回值的时候不能使用括号
  8. 弹出提示框
    MsgBox "xxxx"

  9. 变量申明

    Dim xxx As Interger
    ’可以一次申明多个变量
    Dim var1 As String,var2 As Integer
    
  10. 如果不指定数据类型,就是自动类型(Variant),会自动变长,会不会自动变小?

Dim var2 

var = 100
  1. 常量申明

    Const var3 as Integer
    
  2. vba里面的变量默认没申明也可以直接使用,可以指定为必须申明才能使用

    ‘下面这代码指定变量必须申明才能用
    Option Explicit
    
    Sub 方法名字()
    ...
    Sub end
    
  3. vba的数据类型

    • Byte 1字节
    • Boolean 2字节 ?还是1位?
    • Integer 只有2 字节?
    • Long ,只有4个字节,是java的 Long 的一半?
    • Currency 8个字节 这个才是真的Long
    • Single 4字节, 单精浮点数
    • Double 8字节 双精浮点数
    • Date ,需要写成 #01/30/2024# 格式
    • String
  4. vba的关键字,数据类型第一个字符都是大写,申明的变量和方法没有强制要求大写开头,为了区分可以建议小写开头
    但是貌似VBA的内置方法和属性都是大写开头,比如excel里面的内置属性和方法

  5. 变量的三种生命周期,子程序内有效<模块内有效<全局有效

    ’可以使用 生命变量跨模块有效。 需要写在子函数外面
    Public  var1 As Integer
    
    Sub 方法名字()
    ...
    Sub end
    
  6. Static 修饰子程序里面的变量,这样的变量在子程序执行完以后不会回收内存,效果类把变量定义在子程序外面,

    Sub 方法名字()
    	Static var1 As Integer
    End Sub 
    
  7. VBA 里面的运算符和access的类似,或者说因为使用VBA office 全套都是这用法 / 表示除,\ 表示整除 Mod 表示取余数,不等于用 <>,等于还是用的 = 不是==?

  8. VBA 的 逻辑运算符 And ,Or ,Not

    isTure =  (1>2) And (2>1)
    
    isTure =  (1>2) Or  (2>1)
    
    isTure =  Not (2>1)
    
  9. if 的写法

    If var1 = 0 Then
        MsgBox "0"
    ElseIf var1 = 1 Then
        MsgBox "1"
    Else
        MsgBox "其他"
    End If
    
    
  10. 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
    
  11. 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
    
  12. do while 后面写的执行条件

    Do While 执行条件
        执行代码
        ‘改变条件变量退出循环 或者 Exit Do While?
    Loop
    
  13. do until 后面写的是退出条件

    Do Until 退出条件
        执行代码
        ‘改变条件变量退出循环 或者 Exit Do While?
    Loop
    
  14. 数组的定义和使用

    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
    
  15. 数组的定义可以只写上标

    ’默认是0-10
    Dim array1(10) as Integer
    
  16. 可以通过 option base 1 设置默认下标

    Option base 1
    
    ’默认是1-10
    Dim array1(10) as Integer
    
  17. 二维数组的定义,需要注意的是二维数组里面的那一维是列,外围是行
    考虑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)
    
  18. 动态数组

    ‘定时动态数组
    Dim array1() as Integer
    
    ’确定边界
    ReDim array1(1 to 3)
    
    ‘然后正常使用
    
    ’可以再次调整,这就是用处了
    ReDim array1(1 to 50)
    
    
    ’可以通过Preserve保留历史数组
    ReDim Preserve  array1(1 to 20)
    
    
  19. VB是面向对象的语言为啥C语言是面向过程的语言?还是说VB之前是面向过程,后来补充的面向对象的模块?

  20. excel里面的对象层级关系是 程序>工作簿>工作表>表格
    image-20240816231937005

    ' 完整写法
    Application.Workbooks(“打开的工作部的名称.xlsm”).Worksheets(“Sheet1”).Range("A1").Value=100
    
    ’ 能这样简写是因为前面都使用的当前环境,sheet用的当前选中的sheet
    Range("A1").Value=100
    
  21. Range 可以定位excel的单元格

    ’单个格子
     Range("D4")
    ’连续区域
     Range("D4:F14")
     ’多格格子
     Range("D4,f6")
    ’多个区域
     Range(""D4:F14,H11,Z66")
    
  22. Range(xxx).Cells是相对Range的相对坐标,Range(xxx).Offset 的区别

    • Offset只能在Range以后使用,表示相对位置,Cells可以直接使用表示绝对位置,也能在Range 后面使用表示相对位置
    • 使用相对坐标的时候,Offset没有0坐标,Cells有0,0 坐标等价于Offset(-1,-1)
    • 他们的坐标都是数字,Range("A1")的坐标是字母表示纵坐标
  23. Range(xxx).Select 和 Range(xxx).Activate的区别

    • Select 是选中一个区域,默认激活第一个选中的格子
    • Activate是激活一个格子,激活一个区域的时候等同于选中一个区域,然后激活第一个格子
    • 可以先用Select 选中范围,然后使用activate指定激活的格子,在激活单个格子并且位于之前选中区域的时候选中区域不会改变
    • 然后可以通过 Selection.Value,ActiveCell.Value 设置值
  24. end方法,相当于ctrl+shift+箭头
    Range(xxx).End(Xl方向) 相当于 ctrl + 箭头

    Range(左上,Range(xxx).End(Xl方向)) 可以选中指定区域

     Range("C3", Range("C3").End(xlDown).End(xlToRight)).Select
    
  25. excel 里面的单元格坐标是默认的变量,比如A1,并且A1默认指向A1.Value

  26. 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 
    
  27. 使用for each 变量 excel 的 range
    image-20240817233730857

  28. 接受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
    
    
    
  29. excel 要弃用vba宏需要 保存为xlsm格式,xlsx格式默认没有开启宏
    image-20240818001642240

posted on 2024-08-16 17:40  zhangyukun  阅读(133)  评论(0编辑  收藏  举报

导航