TOP

VBA-第 13.2 课。使用数组 (Arrays)(续)

YouLibreCalc for Excel logo

为了存储多列数据,我们需要不同维度的数组。例子:

将数据保存在二维数组中:

 '宣言
 Dim array_example(10, 2) '11 x 3“定义”数组

 '将数据保存在数组中
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

以下是使用这些值的一些示例:

MsgBox array_example(0, 0)  '=>返回:03.11.2026
MsgBox array_example(0, 1)  '=> 返回:24
MsgBox array_example(9, 2)  '=> 返回:NO
MsgBox array_example(10, 2) '=> 返回:YES

动态数组

让我们想象一下,我们需要定期更新数组中的数据,因此我们不能在声明时分配固定值......

要找出最后一个非空单元格的行号,或者换句话说,数据库的最后一行,我们将使用以下公式:

last_row = Range("A1").End(xlDown).Row

Excel 不接受声明中的变量。

相反,声明一个动态数组(使用空括号),然后使用 Redim 定义其大小:

Dim array_example()
ReDim array_example(last_row - 2, 2)

使用以下过程,您可以将数据集(表)的所有行存储在我们的数组中:

Dim array_example()
ReDim array_example(last_row - 2, 2)

上行

在前面的示例中,数组中的最后一个数字是last_row - 2:

For i = 0 To last_row - 2

确定数组中最后一个数字的另一种方法是使用 Ubound

For i = 0 To UBound(array_example)

此函数返回数组中所选维度的最大数字(第一个维度是默认值)。

以下是一些示例,可以使这一点更加清楚:

Sub example()
     Dim array_example(10, 2)
     
     MsgBox UBound(array_example)    '=> 返回:10
     MsgBox UBound(array_example, 1) '=> 返回:10
     MsgBox UBound(array_example, 2) '=>返回:2
End Sub

将数据保存在一系列数组元素中

甚至无需使用循环,就可以使用工作表上一系列单元格中的值填充数组:

 '宣言
 Dim array_example(10, 2) '11 x 3“定义”数组

 '将数据保存在数组中
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

前面的代码可以有效地替换为:

 '宣言
 Dim array_example()

 '将数据保存在数组中
 array_example = Range("A2:C12").Value

尽管第二种方法似乎比第一种方法更有吸引力,但请注意,在大多数情况下,它可能会比第一种方法花费更多的时间来实现。

如果以这种方式将数据存储在数组中,第一个数字将是 1 而不是 0,这可能会导致混乱......

稍后在增加代码的过程中,如果您决定仅存储与数组中某些搜索条件匹配的数据(或执行完全不同的操作),则必须使用不同的循环函数完全重写代码......

但如果您需要保存大型数据集的全部内容,第二种方法非常有用,因为它比循环更快(每 15,000 条记录节省约 0.2 秒)。

数组 (Array)

但是如果您需要创建一个具有“固定”内容的数组。

一种解决方案是用磁带记录这些值:

Dim en(5)

en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "ISNUMBER"
en(5) = "MID"

幸运的是,您可以使用数组来简化此代码 (Array):

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")

下面是使用函数 Replace 的演示(这将帮助您理解以下示例):

Sub replace_example()
     Dim var_translate As String

     '此示例的文本功能区
     var_translate = "Hello World !"
     
     '将文本功能区中的“世界”替换为“您”
     var_translate = Replace(var_translate, "World", "you")

     '更换后的胶带
     MsgBox var_translate '=> 返回“你好!”
End Sub

现在,如果我们想用另一组数据替换一系列值,使用数组和 Array 函数将非常有用:

Sub translate() '将公式从英语翻译成法语的简化示例
     Dim var_translate As String

     '此示例的文本功能区
     var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))"
     
     '两组值
     en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
     fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
     
     '将“SI”替换为“IF”,将“RECHERVEV”替换为“VLOOKUP”等。
     For i = 0 To UBound(en)
         var_translate = Replace(var_translate, en(i), fr(i))
     Next

     '更换后的胶带
     MsgBox var_translate '=> 返回“Formula 进行翻译:SOMME(SI(ESTNUM(A1:E1),A1:E1,0))”
End Sub

将文本转换为数组 (VBA Spli)

Split 函数允许我们将字符串拆分成多个部分并将结果值写入数组中。

要将功能区转换为数组,请执行以下操作:

variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"

使用 VBA 函数 Split 并指定分隔符:

en = Split(variable, "/")

“en”数组将返回以下值:

MsgBox en(0) '=> 返回:IF
MsgBox en(1) '=> 返回:VLOOKUP
MsgBox en(2) '=> 返回:SUM
MsgBox en(3) '=> 返回:COUNT
MsgBox en(4) '=> 返回:ISNUMBER
MsgBox en(5) '=> 返回:MID

以下 3 个数组也将返回相同的值:

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")

以下示例返回字符串中的第三个值:

MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> 返回:SUM

Split 的逆函数是 VBA 函数 Join

该函数将数组的值收集到字符串中。

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=>返回:12345