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空的(未初始化)
vbNull1无效的(无可用数据)
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数据,可以参考下面的文章。

VBA 编码模式:范围循环读取

VBA 编码模式:范围循环写入

这是使用 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 创建一个实例并使用它。

Dictionary class 사용을 위한 "Microsoft Scripting Runtime" 참조 추가
添加了使用 Dictionary 类的“Microsoft Scripting Runtime”参考

字典对象声明、实例创建、项添加等各个任务的代码见下表。

任务示例代码
声明(提前约束)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 代码时需要了解的操作方法。


<<相关文章一览>>

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CN简体中文