【excel】VBA简介(Visual Basic for Applications)

文章目录

  • 一、基本概念
  • 二、语法
    • [2.1 数据类型](#2.1 数据类型)
      • [2.11 基本数据类型](#2.11 基本数据类型)
      • [2.12 常量](#2.12 常量)
      • [2.13 数组](#2.13 数组)
    • [2.2 控制语句](#2.2 控制语句)
      • [2.21 条件语句](#2.21 条件语句)
      • [2.22 循环语句](#2.22 循环语句)
      • [2.23 错误处理:On Error](#2.23 错误处理:On Error)
      • [2.24 逻辑运算](#2.24 逻辑运算)
    • [2.3 其它语句](#2.3 其它语句)
      • [2.31 注释](#2.31 注释)
      • [2.32 with语句](#2.32 with语句)
    • [2.4 表达式](#2.4 表达式)
      • [2.41 常见表达式类型](#2.41 常见表达式类型)
      • [2.42 表达式的优先级](#2.42 表达式的优先级)
    • [2.5 VBA 的代码结构](#2.5 VBA 的代码结构)
  • 三、VBA开发环境
  • 四、VBA的内存管理
  • 五、常用内置函数
  • 六、VBA和宏
  • =====================

跟很多面向过程的编程语言类似的。本文写的很简单,我基本不用VBA的。自己可以去微软看文档。

一、基本概念

VBA(Visual Basic for Applications)是一种由微软开发的编程语言,主要用于自动化操作和扩展Microsoft Office应用程序的功能。

它是Visual Basic编程语言的一个子集,能够让用户创建自定义的脚本、自动化任务、构建应用程序界面以及进行复杂的数据处理。VBA不仅局限于Excel,还可以用于Word、PowerPoint、Outlook等多种Microsoft Office应用程序。

还有一个东西叫COM,比如用C语言读写excel等。

VBA的基本特点:

  1. 集成性:VBA与Microsoft Office应用程序紧密集成,允许用户通过编程接口访问Office应用的对象模型,从而控制应用程序的各项功能。

  2. 易学易用: 相对于其他编程语言,VBA的语法相对简单,且与Visual Basic相似,对于初学者来说较为友好。

  3. 宏功能:VBA被广泛应用于Excel的宏录制中,用户可以通过录制操作生成VBA代码,并对其进行编辑和扩展。

  4. 跨平台支持 :VBA代码在Windows和Mac版的Office中都有支持,但在Mac版Office中的一些功能有所限制。

VBA的应用领域:

  1. 自动化重复性任务

    利用VBA可以实现一些重复性任务的自动化,如在Excel中处理大量数据、生成报表、自动填充表单等。

  2. 自定义Excel函数

    用户可以通过VBA编写自定义函数,在Excel中实现一些标准公式无法完成的任务。

  3. 创建用户界面

    使用VBA可以创建表单和控件,如文本框、按钮、下拉菜单等,增强用户与Excel交互的体验。

  4. 数据处理和分析

    通过VBA可以实现复杂的数据操作,如筛选、排序、数据转换、生成图表等。

  5. Office应用集成

    VBA不仅可以用于Excel,也可以与Word、Outlook、PowerPoint等其他Office应用程序集成,实现跨应用的数据操作和功能扩展。

二、语法

2.1 数据类型

2.11 基本数据类型

数据类型 描述 存储大小 取值范围/精度
Byte 存储0到255之间的整数 1 字节 0 到 255
Integer 存储-32,768到32,767之间的整数 2 字节 -32,768 到 32,767
Long 存储-2,147,483,648到2,147,483,647之间的整数 4 字节 -2,147,483,648 到 2,147,483,647
Single 存储单精度浮点数,精度为7位有效数字 4 字节 -3.402823E38 到 3.402823E38
Double 存储双精度浮点数,精度为15位有效数字 8 字节 -1.7976931348623157E308 到 1.7976931348623157E308
Currency 存储货币类型数据,精度为4位小数 8 字节 -922,337,203,685,477.5808 到 922,337,203,685,477.5807
Decimal 存储高精度的十进制数 16 字节 范围较大,精度更高,用于需要高精度的小数计算
String 存储文本数据,动态长度 动态 0 到 2GB(取决于内存和平台)
Date 存储日期和时间 8 字节 从公元100年1月1日到9999年12月31日,时间精度到秒
Boolean 存储布尔值 2 字节 True(1)或 False(0)
Object 存储对象的引用 4 字节(通常) 适用于任何COM对象,如Excel、Word应用对象等
Variant 存储任何类型的数据,类型动态分配 16 字节(通常) 可以存储任意类型的数据,如Integer, String, Date
Any 用于函数参数,允许传入任何类型的数据 根据类型 任何数据类型
User-defined Types (UDT) 自定义数据类型,用于组合多个不同的数据类型 依据结构体大小 组合多个数据类型
数组 存储多个同类型的元素 动态/定长 数量及大小根据定义,数组元素类型相同
Enum 定义一组命名常量值 4 字节(通常) 可指定每个常量值,默认从1开始递增

补充说明:

  • 定长字符串String * n(例如:String * 10)表示一个长度为 n 的固定长度字符串。
  • 动态数组 :数组大小可以通过 ReDim 动态调整。
  • Variant 类型:可以存储任何类型的数据,并根据存储的内容动态转换,通常用于存储不确定类型的数据。

自定义类型相当于C语言的struct,例如:

bash 复制代码
Type 自定义类型名
     元素名  As 类型
      ...
     [元素名 As 类型]
End Type 

2.12 常量

常量是用于定义固定值的标识符,这些值在程序运行期间不能改变。

VBA支持不同类型的常量,常用的包括数字常量、字符串常量、布尔常量、以及用户定义常量。

在VBA中,常量通过Const语句来声明,常量的值一旦设置就无法改变。

vba 复制代码
Const 常量名 As 数据类型 = 常量值

例如:

vba 复制代码
Const pi As Double = 3.14159

常量的类型与变量类似,可以是数值型、字符串型、布尔型等。

常量类型 示例定义 说明
数值常量 Const pi As Double = 3.14159 用于定义固定的数字值。
布尔常量 Const isEnabled As Boolean = True 用于定义固定的布尔值,通常是 TrueFalse
字符串常量 Const greeting As String = "Hello, World!" 用于定义固定的字符串值。
日期常量 Const startDate As Date = #1/1/2025# 用于定义固定的日期值。

VBA还提供了许多预定义的内置常量,常用于特定的编程任务,例如与文件操作、错误处理、对象模型等相关的常量。以下是一些常见的内置常量:

常量名称 说明
vbYes 在消息框中表示"是"按钮的常量
vbNo 在消息框中表示"否"按钮的常量
vbCancel 在消息框中表示"取消"按钮的常量
vbOK 在消息框中表示"确定"按钮的常量
vbCritical 在消息框中显示"错误"图标
vbInformation 在消息框中显示"信息"图标
vbExclamation 在消息框中显示"警告"图标
vbDefaultButton1 表示消息框中第一个按钮是默认按钮
vbTab 表示制表符,通常用于文本格式化
vbCrLf 表示回车换行符(用于文本换行)
vbObjectError 用于自定义错误代码的常量
vbTrue 布尔值常量,表示 True(逻辑真)
vbFalse 布尔值常量,表示 False(逻辑假)
vbNull 为空值,通常用于数据库操作,表示未设置或空值

VBA允许用户自定义常量,可以通过Const语句为特定的应用场景定义常量。例如,定义一个表示每年365天的常量:

vba 复制代码
Const DaysInYear As Integer = 365

常量作用范围

  • 常量的作用范围通常是其所在的模块。如果常量在一个子程序或函数内部声明,则其作用范围仅限于该子程序或函数。
  • 如果常量在模块级别(模块的最顶端)声明,则它的作用范围是整个模块。若使用Public关键字,则常量在整个项目中可用。

例如:

vba 复制代码
' 在模块级别声明常量
Public Const MaxAttempts As Integer = 3

常量与变量的区别

特性 常量 变量
值是否可变 不可变,一旦赋值后不能修改 可修改,程序运行时值可以改变
声明方式 使用 Const 关键字声明 使用 DimPrivate 等声明
存储位置 存储在内存中,且值是固定的 存储在内存中,值是动态的

常量的示例:

vba 复制代码
Sub TestConstants()
    ' 数值常量
    Const Pi As Double = 3.14159
    Debug.Print Pi  ' 输出:3.14159

    ' 布尔常量
    Const IsActive As Boolean = True
    Debug.Print IsActive  ' 输出:True

    ' 字符串常量
    Const WelcomeMessage As String = "Welcome to VBA!"
    Debug.Print WelcomeMessage  ' 输出:Welcome to VBA!

    ' 日期常量
    Const StartDate As Date = #1/1/2025#
    Debug.Print StartDate  ' 输出:1/1/2025

    ' 使用内置常量
    If MsgBox("Do you want to continue?", vbYesNo + vbQuestion, "Confirm") = vbYes Then
        Debug.Print "User clicked Yes"
    Else
        Debug.Print "User clicked No"
    End If
End Sub

2.13 数组

数组 是用来存储多个相同类型数据的一种数据结构。数组可以包含多个元素,每个元素通过索引访问。VBA支持定长数组 (固定大小)和动态数组(大小可变)。

❄️数组可以使用Dim语句声明,并且可以是定长数组或动态数组。

  • 定长数组:定长数组的大小在声明时就被固定下来,不能改变。
vba 复制代码
Dim arr(5) As Integer  ' 声明一个包含6个元素的整型数组,索引从0到5
  • 动态数组:动态数组的大小可以在运行时通过ReDim语句动态调整。
vba 复制代码
Dim arr() As Integer  ' 声明一个未指定大小的整型数组
ReDim arr(5)          ' 运行时指定数组大小为6,索引从0到5

默认情况是下标从0开始,所以数组长度是最大索引+1,但是也可以设置下标从1开始,最大长度则和最大索引相同:

使用语句:Option Base 1即可设置(默认是0)。

这会影响到你在整个模块中声明的数组

❄️数组的元素通过索引来访问,索引通常从0开始,也可以自定义起始索引。

vba 复制代码
Dim arr(5) As Integer
arr(0) = 10  ' 给第一个元素赋值
arr(1) = 20  ' 给第二个元素赋值
Debug.Print arr(0)  ' 输出:10
Debug.Print arr(1)  ' 输出:20

🧪 二维数组:

vba 复制代码
Dim arr(2, 3) As Integer  ' 创建一个二维数组,3行4列
arr(0, 0) = 1
arr(1, 2) = 5
Debug.Print arr(1, 2)  ' 输出:5

🧪三维数组:

vba 复制代码
Dim arr(2, 2, 2) As Integer  ' 创建一个三维数组
arr(0, 0, 0) = 10
arr(1, 2, 2) = 20
Debug.Print arr(1, 2, 2)  ' 输出:20

动态数组在声明时没有指定大小,可以通过ReDim来调整数组的大小。ReDim只能用于动态数组。

vba 复制代码
Dim arr() As Integer
ReDim arr(5)  ' 数组大小为6,索引从0到5
arr(0) = 10
arr(5) = 50

ReDim Preserve arr(10)  ' 扩展数组的大小为11,且保留已有的数据
arr(10) = 100
  • ReDim Preserve :使用Preserve关键字可以在调整数组大小时保留现有的元素数据,但只限于调整最后一个维度的大小。
vba 复制代码
ReDim Preserve arr(10)  ' 调整数组大小并保留数据

删除动态数组:

vba 复制代码
Erase arr  ' 释放动态数组的内存

🟢VBA数组的下标范围可以通过LBound(获取数组的最小索引)和UBound(获取数组的最大索引)来获取。对于多维数组,可以指定维度。

vba 复制代码
Dim arr(1 To 5) As Integer
Debug.Print LBound(arr)  ' 输出:1
Debug.Print UBound(arr)  ' 输出:5

对于多维数组:

vba 复制代码
Dim arr(1 To 3, 1 To 4) As Integer
Debug.Print LBound(arr, 1)  ' 输出:1
Debug.Print UBound(arr, 1)  ' 输出:3
Debug.Print LBound(arr, 2)  ' 输出:1
Debug.Print UBound(arr, 2)  ' 输出:4

VBA数组可以在声明时进行初始化,尤其是对于固定大小的数组。

vba 复制代码
Dim arr(3) As Integer
arr = Array(1, 2, 3, 4)  ' 初始化数组元素

Array函数可用于快速初始化数组,但它不适用于动态数组。

🟣 数组常见操作

  • 复制数组

    通过Copy方法可以复制数组,但需注意数组大小一致,或者使用ReDim Preserve方法来扩展数组。

    vba 复制代码
    Dim arr1(5) As Integer
    Dim arr2() As Integer
    arr1(0) = 10
    arr1(1) = 20
    arr2 = arr1  ' 将arr1的内容复制到arr2
  • 数组排序

    如果需要对数组排序,可以使用VBA中的Sort方法(如在Excel中对数据排序)或手动编写排序算法(如冒泡排序)。


2.2 控制语句

控制语句,用于根据不同的条件或循环执行不同的代码块。常见的控制语句包括 条件语句 (如 If...Then...Else)、选择语句 (如 Select Case)和 循环语句 (如 For, Do...Loop)。以下是这些控制语句的详细介绍。

2.21 条件语句

❄️(1) If...Then...Else:用于根据条件的真假来执行不同的代码块。

vba 复制代码
If 条件 Then
    ' 条件为True时执行的代码
Else
    ' 条件为False时执行的代码
End If

示例:

vba 复制代码
Dim x As Integer
x = 10

If x > 5 Then
    Debug.Print "x大于5"
Else
    Debug.Print "x小于或等于5"
End If

❄️(2) If...Then...ElseIf...Else :如果有多个条件需要判断,可以使用 ElseIf

vba 复制代码
If 条件1 Then
    ' 条件1为True时执行的代码
ElseIf 条件2 Then
    ' 条件2为True时执行的代码
Else
    ' 如果条件1和条件2都不为True时执行的代码
End If

示例:

vba 复制代码
Dim x As Integer
x = 10

If x > 15 Then
    Debug.Print "x大于15"
ElseIf x > 5 Then
    Debug.Print "x大于5但小于或等于15"
Else
    Debug.Print "x小于或等于5"
End If

❄️(3) Select Case : 用于根据一个表达式的值选择多个可能的分支,比多个 If...ElseIf 更简洁。

vba 复制代码
Select Case 表达式
    Case 值1
        ' 执行的代码块
    Case 值2
        ' 执行的代码块
    Case Else
        ' 所有值不匹配时执行的代码
End Select

示例:

vba 复制代码
Dim x As Integer
x = 3

Select Case x
    Case 1
        Debug.Print "x等于1"
    Case 2
        Debug.Print "x等于2"
    Case 3
        Debug.Print "x等于3"
    Case Else
        Debug.Print "x不是1、2或3"
End Select

2.22 循环语句

❄️(1)For...Next:用于重复执行某段代码,直到满足指定的条件。

vba 复制代码
For i = 初始值 To 终止值 [Step 步长]
    ' 每次循环执行的代码
Next i

示例:

vba 复制代码
For i = 1 To 5
    Debug.Print "当前值是:" & i
Next i

❄️(2) For Each...Next:用于遍历集合或数组中的每个元素。

vba 复制代码
For Each 元素 In 集合或数组
    ' 每次循环执行的代码
Next 元素

示例:

vba 复制代码
Dim arr(3) As Integer
arr(0) = 10
arr(1) = 20
arr(2) = 30

For Each value In arr
    Debug.Print value
Next value

❄️(3)Do...Loop:用于在满足条件时重复执行某段代码。可以根据不同条件控制循环的开始、结束或退出方式。

vba 复制代码
Do While 条件
    ' 条件为True时执行的代码
Loop

或者:

vba 复制代码
Do Until 条件
    ' 条件为False时执行的代码
Loop

示例:

vba 复制代码
Dim i As Integer
i = 1

Do While i <= 5
    Debug.Print "当前值是:" & i
    i = i + 1
Loop

❄️(4) Do...Loop While/Until

Do...Loop WhileDo...Loop Until 循环在循环体内先执行代码,再检查循环条件。

vba 复制代码
Do
    ' 执行的代码
Loop While 条件  ' 条件为True时继续循环

或者:

vba 复制代码
Do
    ' 执行的代码
Loop Until 条件  ' 条件为True时退出循环

示例:

vba 复制代码
Dim i As Integer
i = 1

Do
    Debug.Print "当前值是:" & i
    i = i + 1
Loop Until i > 5

❄️🗺️(5) Exit For/Exit Do

Exit ForExit Do 用于提前退出循环,不再继续执行。

示例:

vba 复制代码
For i = 1 To 10
    If i = 5 Then
        Exit For  ' 当i等于5时退出循环
    End If
    Debug.Print i
Next i

🧪跳出本次循环:

  • Exit For 用于跳出 For 或 For Each 循环。
  • Exit Do 用于跳出 Do...Loop 循环。

举例:

bash 复制代码
For i = 1 To 10
    If i = 5 Then
        Exit For  ' 当 i 等于 5 时,跳出整个 For 循环
    End If
    Debug.Print "当前值是:" & i
Next i

2.23 错误处理:On Error

On Error 用于指定错误处理的方式。当运行时错误发生时,VBA 会根据 On Error 语句的指示进行相应的处理。

  • On Error GoTo 错误标签:当发生错误时跳转到指定的标签。
  • On Error Resume Next:发生错误时跳过错误的代码行,继续执行下一行代码。
  • On Error GoTo 0:禁用错误处理,恢复默认行为(显示错误消息)。

示例:

vba 复制代码
Sub ErrorHandlingExample()
    On Error GoTo ErrorHandler
    Dim x As Integer
    x = 1 / 0  ' 除以零,会导致错误
    
    Exit Sub
    
ErrorHandler:
    Debug.Print "发生错误:除以零"
    Resume Next  ' 错误处理后继续执行下一行代码
End Sub

2.24 逻辑运算

在控制语句中,可以使用逻辑运算符来组合多个条件。

运算符 说明
And 如果两个条件都为True,则为True
Or 如果两个条件中至少有一个为True,则为True
Not 对条件取反
Like 用于模式匹配
Is 比较对象或数据类型

示例:

vba 复制代码
Dim x As Integer
Dim y As Integer

x = 10
y = 20

If x > 5 And y < 25 Then
    Debug.Print "x大于5,且y小于25"
End If

2.3 其它语句

2.31 注释

(英文)单引号:

bash 复制代码
' 这是一个单行注释
Dim x As Integer  ' 这是对代码行的注释
x = 10  ' 给变量x赋值为10

REM:

bash 复制代码
REM 这是一个单行注释
Dim x As Integer  REM 这是对代码行的注释
x = 10  REM 给变量 x 赋值为 10

2.32 with语句

With...End With 语句用于简化对对象的多次引用,避免每次都写出对象名。可以在 With 块内直接引用对象的属性和方法。

bash 复制代码
Sub TestWith()
    Dim obj As Object
    Set obj = CreateObject("Scripting.FileSystemObject")
    
    With obj
        Debug.Print .GetFile("C:\test.txt").Name
        Debug.Print .GetFile("C:\test.txt").Size
    End With
End Sub

2.4 表达式

表达式 是由运算符、常量、变量、函数调用等组成的,表示一个值的计算过程。表达式的结果可以是一个数值、字符串、布尔值或对象等。

2.41 常见表达式类型

VBA 中的表达式可以分为以下几种常见类型:

❄️(1)算术表达式:算术表达式用于执行数学运算,例如加法、减法、乘法、除法等。

运算符:

  • + 加法
  • - 减法
  • * 乘法
  • / 除法
  • ^ 幂运算
vba 复制代码
Dim x As Integer
x = 5 + 3 * 2  ' 结果是11

❄️(2)字符串表达式:字符串表达式用于连接字符串或操作字符串。

运算符:

  • & 字符串连接
vba 复制代码
Dim str As String
str = "Hello, " & "World!"  ' 结果是 "Hello, World!"

❄️(3)关系表达式:关系表达式用于比较两个值,并返回布尔值 (TrueFalse)。

运算符:

  • = 等于
  • <> 不等于
  • < 小于
  • > 大于
  • <= 小于等于
  • >= 大于等于
vba 复制代码
Dim x As Integer
x = 5
If x > 3 Then
    MsgBox "x 大于 3"  ' 会弹出消息框
End If

❄️(4)逻辑表达式:逻辑表达式用于进行布尔值运算,通常用于控制结构中的条件判断。

运算符:

  • And 逻辑与
  • Or 逻辑或
  • Not 逻辑非
vba 复制代码
Dim x As Boolean
Dim y As Boolean
x = True
y = False

If x And Not y Then  ' 结果是 True
    MsgBox "x 为真且 y 为假"
End If

❄️(5)位运算表达式:位运算用于对整数的二进制位进行操作。

运算符:

  • And 位与
  • Or 位或
  • Xor 位异或
  • Not 位非
  • << 左移
  • >> 右移
vba 复制代码
Dim x As Integer
Dim y As Integer
x = 5  ' 二进制:0101
y = 3  ' 二进制:0011
Debug.Print x And y  ' 结果是1,二进制:0001

2.42 表达式的优先级

VBA 中的运算符优先级与其他大多数编程语言类似,常见的优先级如下(从高到低):

  1. 括号 ()
  2. ^ 幂运算
  3. */\(除法)、Mod(取模)等算术运算符
  4. +-(加法和减法)
  5. =、<>、<、>、<=、>=(关系运算符)
  6. Not(逻辑非)
  7. AndOr(逻辑运算符)

例如:

vba 复制代码
Dim result As Integer
result = 5 + 3 * 2  ' 结果是11,因为乘法的优先级高于加法

2.5 VBA 的代码结构

VBA的代码一般由以下几个部分组成:

  1. 模块

    VBA代码通常在模块中书写,可以是标准模块、类模块或工作表模块。模块是VBA代码的基本单元。

  2. 子过程(Sub)

    子过程是VBA中最常见的代码块,负责执行一系列操作。子过程没有返回值,通常通过 Sub 关键字定义。例如:

    vba 复制代码
    Sub GreetUser()
        MsgBox "Hello, world!"
    End Sub
  3. 函数(Function)

    函数是用于计算并返回值的代码块。与子过程不同,函数会返回一个值,通常通过 Function 关键字定义。例如:

    vba 复制代码
    Function AddNumbers(x As Integer, y As Integer) As Integer
        AddNumbers = x + y
    End Function
  4. 变量和数据类型

    VBA支持多种数据类型,包括整数(Integer)、长整型(Long)、浮动数(Double)、字符串(String)、布尔型(Boolean)等。在VBA中声明变量时,可以使用 Dim 关键字。例如:

    vba 复制代码
    Dim num As Integer
    num = 10
  5. 控制结构

    与其他编程语言一样,VBA也支持条件判断和循环等控制结构,如 If...Then...ElseFor...NextDo...Loop 等。例如:

    vba 复制代码
    If num > 5 Then
        MsgBox "Greater than 5"
    Else
        MsgBox "Less than or equal to 5"
    End If

三、VBA开发环境

VBA的开发环境是Microsoft Office应用程序内的VBA编辑器(VBE,Visual Basic Editor)。VBE可以通过按下 Alt + F11 打开,它提供了编写和调试VBA代码所需的所有功能。开发者可以在VBE中进行以下操作:

  • 编写、调试和运行VBA代码。
  • 通过对象浏览器(F2)查看Office应用程序的对象模型。
  • 使用即时窗口(Ctrl + G)测试表达式和变量。

四、VBA的内存管理

VBA的内存管理相对简化,主要依赖于 VBA 运行时(VBE)和 Windows 操作系统的自动管理机制。

尽管 VBA 不提供像一些低级语言(如 C 或 C++)那样的显式内存管理工具(例如 mallocfree),但它还是通过一系列内建的机制来管理内存使用。

🧪(1) 内存自动管理

VBA 的内存管理由 垃圾回收 (Garbage Collection)机制和 自动内存分配与释放 控制。这意味着,开发者不需要显式地为变量分配和释放内存。内存的管理是自动进行的,运行时会处理变量的生命周期。

  • 局部变量: 当局部变量的作用域结束时,它们所占用的内存会自动释放。这些局部变量通常是存储在栈内存中(stack memory)。
  • 全局变量: 全局变量(模块级变量、静态变量)会在程序运行期间保持有效,直到程序结束时才会被释放。它们一般是存储在堆内存中(heap memory)。

🧪(2)对象的内存管理

VBA 使用 引用计数 来管理对象的内存(如 Excel 的 Range 对象、Workbook 对象等)。对象的内存分配和释放通常是由 VBA 的垃圾回收机制自动管理的。

  • 引用计数: 当一个对象被创建时,VBA 会为它分配内存,并增加该对象的引用计数。每当一个变量或对象引用该对象时,引用计数就增加;当引用计数降为零时,该对象的内存会被自动释放。

    例如:

    vba 复制代码
    Dim obj As Object
    Set obj = CreateObject("Excel.Application") ' 创建对象
    Set obj = Nothing  ' 解除引用,引用计数变为零,自动释放内存

尽管 VBA 自动管理内存,但在某些情况下,开发者需要明确地释放对象的引用,以确保内存尽早释放,尤其是当应用程序中有大量对象时。如果不手动设置对象为 Nothing,对象可能会在程序运行期间占用不必要的内存。

例如,当你不再需要某个对象时,应该显式地将其设置为 Nothing,这样可以清理内存:

vba 复制代码
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
' 做一些操作
Set ws = Nothing  ' 释放内存

🟠在 VBA 中,内存泄漏通常发生在以下几种情况:

  • 对象引用未被正确释放(即没有将对象设置为 Nothing)。
  • 长时间运行的宏中创建了大量的对象,但未及时释放。
  • 通过动态数组或 CreateObject 等方式创建的对象未释放。

为了避免内存泄漏,应当确保在不再使用对象时及时释放它们。

为了优化 VBA 程序的内存使用,可以采取以下措施:

  • 尽量减少全局变量的使用,尤其是大型对象,这些变量会在整个程序的生命周期内保持有效。
  • 在完成操作后及时释放对象引用 ,例如使用 Set obj = Nothing 来解除对象引用。
  • 避免在循环中创建对象,如果在循环内每次都创建新对象,可能会导致内存压力增大。
  • 避免过度使用动态数组,特别是在数组的大小不断变化的情况下。

五、常用内置函数

类别 函数名称 描述
数学函数 Abs 返回绝对值
Sqr 返回一个数的平方根
Exp 返回一个数的指数值
Log 返回一个数的自然对数
Rnd 返回一个介于 0 到 1 之间的随机数
Int 返回小于或等于给定数值的最大整数
Fix 返回小于或等于给定数值的整数部分
Round 四舍五入到指定的小数位数
Cos 返回一个角度的余弦值
Sin 返回一个角度的正弦值
Tan 返回一个角度的正切值
字符串函数 Len 返回字符串的字符数
Mid 从指定位置提取字符串的子串
Left 返回字符串的左边若干个字符
Right 返回字符串的右边若干个字符
Trim 去除字符串两端的空格
LTrim 去除字符串左侧的空格
RTrim 去除字符串右侧的空格
InStr 返回子串在字符串中首次出现的位置
Replace 替换字符串中的子串
UCase 将字符串转换为大写
LCase 将字符串转换为小写
StrComp 比较两个字符串并返回比较结果
日期和时间函数 Now 返回当前的日期和时间
Date 返回当前的日期
Time 返回当前的时间
Year 返回指定日期的年份
Month 返回指定日期的月份
Day 返回指定日期的天数
Hour 返回指定时间的小时数
Minute 返回指定时间的分钟数
Second 返回指定时间的秒数
DateAdd 在指定日期基础上添加时间间隔
DateDiff 返回两个日期之间的差异
类型转换函数 CInt 将值转换为整数
CLng 将值转换为长整数
CDbl 将值转换为双精度浮动点数
CStr 将值转换为字符串
CDate 将值转换为日期值
CBool 将值转换为布尔值
数组函数 UBound 返回数组的最大下标
LBound 返回数组的最小下标
输入输出函数 InputBox 显示一个输入框,允许用户输入数据
MsgBox 显示一个消息框,用于显示信息
文件和路径函数 Dir 返回文件或文件夹的名称
FileLen 返回文件的长度
MkDir 创建一个新的文件夹
RmDir 删除一个文件夹
错误处理函数 Err 返回当前的错误号
Err.Description 返回当前错误的描述
集合和对象函数 IsObject 判断是否为对象
数学常量和常用常量 Pi 数学常量 π
vbTrue 布尔值 True
vbFalse 布尔值 False

示例:

  1. Len 用法:

    vba 复制代码
    Dim str As String
    str = "Hello, World!"
    MsgBox Len(str)  ' 结果是 13
  2. DateAdd 用法:

    vba 复制代码
    Dim newDate As Date
    newDate = DateAdd("d", 5, Now)  ' 当前日期加上5天
    MsgBox newDate
  3. Round 用法:

    vba 复制代码
    Dim roundedValue As Double
    roundedValue = Round(3.14159, 2)  ' 四舍五入到小数点后2位,结果是 3.14
    MsgBox roundedValue
  4. UCase 用法:

    vba 复制代码
    Dim upperCaseStr As String
    upperCaseStr = UCase("hello")  ' 转换为大写,结果是 "HELLO"
    MsgBox upperCaseStr

六、VBA和宏

宏和 VBA 并不是完全一样的概念,虽然它们在很多情况下紧密相关。

  1. 宏(Macro)

    宏是一个可以自动化任务的程序,通常是由一系列的命令和操作组成。宏的主要目的是通过记录和执行用户的操作来自动化重复性任务。宏在很多应用程序中都有使用,尤其是在 Microsoft Office 软件(如 Excel、Word)中。

    • 定义:宏通常指的是在 Office 应用中自动执行一组预先定义的操作(如格式化表格、输入数据等)。
    • 录制宏 :在 Excel 等应用中,可以使用 宏录制器来录制用户在界面上的操作,然后将这些操作保存为宏。录制的宏本质上是 VBA 代码。
    • 功能:宏常用于自动化用户的鼠标操作、菜单选择等,例如,在 Excel 中创建一个宏,记录填充一列数据的过程,后续可以通过运行该宏来自动完成。
  2. VBA(Visual Basic for Applications)

    VBA 是微软为 Office 应用提供的嵌入式编程语言。VBA 是一个完整的编程语言,支持面向过程的编程,可以编写复杂的逻辑、函数、类和对象等。

    • 定义:VBA 是一种嵌入在 Microsoft Office 应用程序中的编程语言,它允许用户编写脚本来自动化任务、创建用户定义的函数、进行更复杂的数据处理等。
    • 编程:通过 VBA 编辑器(VBE)编写代码来实现自动化。VBA 代码可以比宏录制器生成的代码更灵活,可以进行更复杂的控制和操作。
    • 功能:VBA 能够实现复杂的任务,超越简单的宏功能,例如与其他 Office 应用(如 Outlook、Access)进行交互、创建用户界面、处理数据库等。
  3. 宏与 VBA 的关系

    • 宏录制和 VBA 代码:当你在 Excel 等 Office 应用中录制宏时,实际上是通过 VBA 编写了一段代码。录制的宏可以在 VBA 编辑器中查看和编辑,它会生成对应的 VBA 代码。例如,Excel 中录制的宏可能会生成如下代码:
    • 简单和复杂功能:宏录制通常适用于简单、重复性的任务,而 VBA 则可以用来编写复杂的逻辑、控制流程、实现更高级的功能。
vba 复制代码
Sub Macro1()
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "Hello"
End Sub

这段代码就是 VBA 编写的宏,可以进一步修改和扩展。

对比:

特性 VBA
定义 自动化一组简单的操作 嵌入式编程语言,用于更复杂的自动化和定制任务
录制方式 可以通过录制器录制用户的操作 手动编写代码
灵活性 通常用于简单的任务 支持复杂的编程逻辑和控制结构
功能 适合重复性、常规的自动化任务 可以实现更高层次的自动化和应用功能
代码复杂性 代码简单,通常无法修改复杂逻辑 支持面向过程的编程,代码可以灵活扩展
操作平台 主要用于 Office 应用 嵌入在 Microsoft Office 中,支持多种任务

=====================

VBA是VB的子集,宏是VBA的一种应用形式。

相关推荐
青涩小鱼2 小时前
Excel中身份证号码都变成E+乱码显示如何处理?
excel
肖申克的陪伴5 小时前
excel实现下拉单选
excel
hmywillstronger5 小时前
【VBA】【EXCEL】整理指定sheet里单元格大于1/500的行列编号到新的sheet中
windows·microsoft·excel
TomcatLikeYou19 小时前
从excel提取和过滤数据到echarts中绘制图
前端·echarts·excel
青涩小鱼19 小时前
Excel如何分区设置密码,一个区域一个密码,数据收集时使用太方便了
excel
王子良.1 天前
使用 Python 实现自动化办公(邮件、Excel)
python·自动化·excel
东京老树根1 天前
Excel 技巧05 - 如何快速插入批注以及查看所有批注 (★),如何在批注里面插入图片
笔记·学习·excel
woshiyouxiuren2 天前
c#集成npoi根据excel模板导出excel
excel