Excel VBA教程(八):Excel VBA语言基础——数据类型、数据结构
在本文中,我们将了解 Excel VBA 语言基础知识中的数据类型和提供的数据结构。
这是上一篇文章的延续。
Excel VBA教程(七):Excel VBA语言基础——语法
3.3.数据类型
3.3.1.基本数据类型
下表总结了 VB(或 VBA)支持的数据类型。下面源码的表内容中,Collection和Dictionary在“数据结构”中分别解释。
基本数据类型列表
资源: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary
数据格式 | 存储容量 | 范围 |
布尔值 | 2个字节 | 真的 或者 错误的 |
字节 | 1字节 | 0 ~ 255 |
收藏 | 未知 | 未知 |
货币 (缩放整数) | 8字节 | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
日期 | 8字节 | 100年1月1日至9999年12月31日 (100-01-01 ~ 9999-12-31) |
十进制 | 14字节 | +/-79,228,162,514,264,337,593,543,950,335 没有小数点 +/-7.9228162514264337593543950335 小数点右边 28 位 最小的非零数是+/-0.0000000000000000000000000001 |
字典 | 未知 | 未知 |
双倍的 (双精度浮点数) | 8字节 | -1.79769313486231E308 到 -4.94065645841247E-324 为负值 4.94065645841247E-324 到 1.79769313486232E308 为正值 |
整数 | 2个字节 | -32,768 至 32,767 |
长 (长整型) | 4字节 | -2,147,483,648 至 2,147,483,647 |
龙龙 (LongLong 整数) | 8字节 | -9,223,372,036,854,775,808至9,223,372,036,854,775,807 仅在 64 位平台上有效。 |
长指针 (32 位系统上为长整数,64 位系统上为 LongLong 整数) | 在 32 位系统上为 4 个字节 64 位系统上为 8 个字节 | -2,147,483,648 到 2,147,483,647 在 32 位系统上 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 在 64 位系统上 |
目的 | 4字节 | 任何 目的 参考 |
单身的 (单精度浮点数) | 4字节 | -3.402823E38 到 -1.401298E-45 为负值 1.401298E-45 到 3.402823E38 对于正值 |
细绳 (可变长度) | 10 个字节 + 字符串长度 | 0 到大约 20 亿 |
细绳 (固定长度) | 字符串长度 | 1 至大约 65,400 |
变体 (带数字) | 16字节 | 范围内的任何数值 双倍的 |
变体 (带字符) | 22 字节 + 字符串长度(64 位系统上为 24 字节) | 与可变长度相同的范围 细绳 |
用户自定义 (使用 类型) | 元素所需的数量 | 每个元素的范围与其数据类型的范围相同。 |
其中,使用频率最高的数据类型有Int、Long、String、Boolean。
变体和用户定义的数据类型将在下面进一步解释。
变体数据类型
变体数据类型是一种特殊的数据类型,可以存储和处理多种数据类型。如果在声明变量时省略数据类型,则将其指定为 Variant 数据类型。有关 Variant 数据格式的更多信息,请参阅以下 URL。
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/variant-data-type
要检查 Variant 变量在执行期间存储的数据类型,请使用 VarType 函数。
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function
建造
变量类型(变量名)
基本的 变量名 参数是包含变量的 Variant,不包括用户定义类型的变量。
返回形式
一个常数 | 价值 | 解释 |
vb空 | 0 | 空的(未初始化) |
vbNull | 1 | 无效的(无可用数据) |
vb整数 | 2 | 本质 |
vb长 | 3 | 长整数 |
vb单身 | 4 | 单精度浮点数 |
vb双精度 | 5 | 双精度浮点数 |
vb货币 | 6 | 货币价值 |
日期 | 7 | 日期值 |
vb字符串 | 8 | 细绳 |
vb对象 | 9 | 个人 |
vb错误 | 10 | 错误值 |
vb布尔值 | 11 | 布尔值 |
vb变体 | 12 | 变体(变体 安排仅使用) |
vb数据对象 | 13 | 数据访问对象 |
vb小数 | 14 | 十进制值 |
vb字节 | 17 | 字节值 |
vb数组 | 8192 | 安排 |
Variant数据格式我个人用的不是很好,主要是一次性读写sheet数据的时候使用。关于如何使用变体数组读写大量sheet数据,可以参考下面的文章。
这是使用 Variant 数据类型的示例代码。它表明它可以处理整数、字符串、实数和日期数据类型。
Sub VariantTest() Dim a As Variant '데이터 형식을 생략하면 Variant 형식임 a = 1: Debug.Print a a = "1": Debug.Print a a = 1.1: Debug.Print a a = CDate("2021-07-31"): Debug.Print a End Sub
用户自定义数据类型
您可以声明和使用用户定义的数据类型。使用类似于 C 语言中的 'struct' 的 'Type' 关键字声明用户定义的数据类型。用户定义的数据类型不是对象,所以在声明时,会创建一个实例,分配内存,并可以输入值。
有关用户定义数据格式的更多信息,请参阅以下 URL。
https://docs.microsoft.com/en-us/office/vba/language/how-to/user-defined-data-type
用户自定义数据类型的示例代码如下。
Type EmployeeRecord ' 사용자 정의 형식을 만듭니다. ID As Integer ' 데이터 형식의 요소를 정의합니다. Name As String Address As String Phone As Long HireDate As Date End Type Sub CreateRecord() Dim MyRecord As EmployeeRecord ' 변수를 선언합니다. MyRecord.ID = 12003 ' 요소에 값을 할당합니다. MyRecord.Name = "Andy" MyRecord.HireDate = CDate("2021-07-31") End Sub
3.3.2.数据结构
常用的数据结构包括 Array、Collection 和 Dictionary。让我们逐一看看。
大批
它有固定数量的项目。由于它不是对象,因此声明它会创建一个实例。声明时可以指定维数和每个维的下限和上限,也可以在执行过程中动态改变数组的维数和范围。如果只指定项目数而不指定每个维度的下限和上限,则下限默认为 0。如果使用 Option Base 1,则默认下限为 1。
声明示例代码
Dim DayArray(50) Dim Matrix(3, 4) As Integer Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double
声明每个维度的下限/上限,检查:使用LBound、UBound
Dim A(1 To 100, 0 To 3, -3 To 4) LBound(A, 1) -> 1, UBound(A, 1) -> 100 ' 1차원 하한/상한 LBound(A, 2) -> 0, UBound(A, 2) -> 3 ' 2차원 하한/상한 LBound(A, 3) -> -3, UBound(A, 3) -> 4 ' 3차원 하한/상한
维度大小更改:使用 Redim 语句更改动态数组的维度大小。
Dim MyArray() As Integer ' 동적 배열을 선언합니다. Redim MyArray(5) ' 5개의 요소를 할당합니다. Redim Preserve MyArray(15) ' 15개의 요소로 크기를 변경합니다.
项目循环(下一个)
'Split & Trim 처리 Public Function SplitTrim(aExpression As String, aDelimeter As String) As String() Dim saOut() As String, i As Integer saOut = Split(aExpression, aDelimeter) For i = LBound(saOut) To UBound(saOut) saOut(i) = Trim(saOut(i)) Next i SplitTrim = saOut End Function
初始化:用Erase语句初始化数组变量。
' 배열 변수를 선언합니다. Dim NumArray(10) As Integer ' 정수 배열입니다. Dim StrVarArray(10) As String ' 변수 문자열 배열입니다. Dim StrFixArray(10) As String * 10 ' 고정 문자열 배열입니다. Dim VarArray(10) As Variant ' Variant 배열입니다. Dim DynamicArray() As Integer ' 동적 배열입니다. ReDim DynamicArray(10) ' 저장 공간을 할당합니다. Erase NumArray ' 0으로 지정된 각 요소입니다. Erase StrVarArray ' 길이가 0인 문자열 ("")로 지정된 각 요소입니다. Erase StrFixArray ' 0으로 지정된 각 요소입니다. Erase VarArray ' Empty로 지정된 각 요소입니다. Erase DynamicArray ' 배열에 의해 사용되는 빈 메모리입니다.
收藏
Collection 类类似于动态数组。可以添加和删除数量可变的独特项目。因为它是一个对象放”和“新建”关键字来创建实例。在 Visual Basic 语言中,当创建对对象的引用或分配新引用时,必须“放必须使用”关键字,为变量赋值时不需要“Set”关键字。您需要区分处理对象和变量以避免语法错误。你可能经常犯错,所以要小心。
集合对象声明、实例创建、项添加等各个任务的代码见下表。
任务 | 示例代码 |
宣言 | Dim o Col As 系列 |
实例创建 | 设置 oCol = 新集合 |
在声明的同时创建实例 | Dim o Col 作为新系列 |
新增项目 | oCol.Add “Apple” |
按索引访问项目 | oCol(1) |
东西的个数 | oCol.Count |
项目循环(对于) | 暗 l 一样长 对于 l = 1 到 oCol.Count 调试打印 oCol(l) 下一个 |
项目循环(每个) | 昏暗的水果作为变体 对于 oCol 中的每个水果 调试.打印水果 下一个 |
删除项目(指定索引) | oCol.Remove(1) |
删除实例 | 设置 oCol = 无 |
使用 Collection 的示例代码如下。作为参考,集合中的项目从 1 开始。
Sub CollectionTest() Dim oCol As Collection Set oCol = New Collection oCol.Add "Apple" oCol.Add "Strawberry" oCol.Add "Lemon" oCol.Add "Banana" Debug.Print oCol(1) Debug.Print oCol.Item(1) Debug.Print "----------" Dim l As Long For l = 1 To oCol.Count Debug.Print oCol(l) Next Debug.Print "----------" oCol.Remove (1) Dim fruit As Variant For Each fruit In oCol Debug.Print fruit Next Set oCol = Nothing End Sub '출력 Apple Apple ---------- Apple Strawberry Lemon Banana ---------- Strawberry Lemon Banana
字典
可以管理 Key-Value 结构的可变唯一项目,并动态添加/删除项目。
它是一种类似于Python语言中的Dictionary、C++中的HashMap、Java中的HashMap的数据结构。按键值访问时,性能为 O(1)。
默认情况下不提供字典类。要在早期绑定方法中使用它,您必须首先参考“Microsoft Scripting Runtime”。要在后期绑定方法中使用,请通过 CreateObject 创建一个实例并使用它。
字典对象声明、实例创建、项添加等各个任务的代码见下表。
任务 | 示例代码 |
声明(提前约束) | Dim oDic 作为字典 |
实例创建(早期绑定) | 设置 oDic = 新词典 |
声明(后期绑定) | 作为对象的二元论 |
实例创建(后期绑定) | 设置 oDic = CreateObject(“Scripting.Dictionary”) |
新增项目 | oDic.Add “苹果”, 50 |
更改值 | oDic(“苹果”) = 60 |
获取价值 | appleCount = oDic(“苹果”) |
检查密钥是否存在 | oDic.Exists(“苹果”) |
删除项目 | oDic.Remove(“苹果”) |
删除所有项目 | oDic.RemoveAll |
东西的个数 | oDic.计数 |
项目循环(每个) | 变暗键作为变体 对于 oDic 中的每个键。键 Debug. 打印密钥,oDic(key) 下一键 |
项目循环(对于,仅限早期绑定) | 暗 l 一样长 对于 l = 0 至 oDic.Count -1 调试.打印 oDic.Keys(l), oDic.Items(l) 下一个 |
使用 Dictionary 的示例代码如下。作为参考,字典中的项目从 0 开始。
Sub DictionaryTest() Dim oDic As Dictionary Set oDic = New Dictionary oDic.Add "A", "Apple" oDic.Add "S", "Strawberry" oDic.Add "L", "Lemon" oDic.Add "B", "Banana" Debug.Print oDic("A") Debug.Print oDic.Items(0) Debug.Print "----------" Dim l As Long For l = 0 To oDic.Count - 1 Debug.Print oDic.Items(l) Next Debug.Print "----------" oDic.Remove ("A") Dim key As Variant, fruit As String For Each key In oDic.Keys fruit = oDic(key) Debug.Print fruit Next Set oDic = Nothing End Sub '출력 Apple Apple ---------- Apple Strawberry Lemon Banana ---------- Strawberry Lemon Banana
For循环语句查找Dictionary对象时,包含键值的变量只能是Variant或Object类型。在上面的示例中,第 23 和 24 行的代码使用了 Variant 格式。
在本文中,我们了解了 VBA 数据类型和数据结构。特别是 Collection 和 Dictionary 很可能被频繁使用,所以请熟悉它们。接下来,我们将看看编写 VBA 代码时需要了解的操作方法。
<<相关文章一览>>
- 开始 Excel VBA 课程。 (讲座预告,壮举。为什么我们推荐 Excel VBA)
- Excel VBA课程(一):Excel VBA概述
- Excel VBA教程(二):Excel VBA基础
- Excel VBA教程(三):Excel对象模型
- Excel VBA教程(四):使用Excel对象模型
- Excel VBA教程(五):Excel文件扩展名、VBE、字体设置
- Excel VBA教程(六):Excel VBA语言基础-变量
- Excel VBA教程(七):Excel VBA语言基础——语法
- Excel VBA教程(八):Excel VBA语言基础——数据类型、数据结构
- Excel VBA教程(九):Excel VBA How-To
- Excel VBA教程(十):与Excel VBA一起开发和使用的工具
- Excel VBA 课程的完整目录