为了存储多列数据,我们需要不同维度的数组。例子:
将数据保存在二维数组中:
'宣言 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 秒)。
但是如果您需要创建一个具有“固定”内容的数组。
一种解决方案是用磁带记录这些值:
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
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
该函数将数组的值收集到字符串中。
MsgBox Join(Array(1, 2, 3, 4, 5), "") '=>返回:12345