Excel工作表数据本身就是一个天然的二维数组。
数据或信息可以存储到变量或数组等数据结构中,在Excel VBA中,数据可以是直接的字面值,也可以是来源于单元格区域的值。
如果希望处理单元格区域中所有的数据值,赋值给一个VBA数组并处理该数组将比处理该Range对象本身更有效率。之后将数组值再赋回给单元格区域。
将单元格区域里的值赋给一个数组是很容易的,如:
arr = Range("A2:D200").value
以上将单元格区域的值赋给一个变量时,如arr,该变量必须是Variant数据类型。
注意这与创建一个引用单元格区域的对象变量完全不同:
Set rngData = Range("A2:D200")
被赋值后的arr总是一个二维数组(即使区域只有一行或一列,也是二维的),这样可以在数组中继承工作表固有的行和列结构。可以用下标访问其元素:
a = arr(1,2)
如有以下的工作表:
想要汇总来自顾客Kee的所有收入,如果不使用数组,则可以用遍历单元格区域的传统方式去计算:
使用数组来计算,当数据量较大时,效果更高:
同样可以将数组的值直接赋给单元格区域,如假设上表中来自顾客Kee的折扣是10%,可以在收入一列的后面显示折扣值:
处理后的数据为:
上面Discount列的数据是用一个二维数组zk来映射的,也可以将zk定义为一个一维数组,使用工作表函数Transpose()转置来赋给一列的数据。
只要改变两行代码:
ReDim zk(1 To UBound(arr, 1))
Range("F2").Resize(UBound(arr, 1), 1).Value = WorksheetFunction.Transpose(zk)
附代码:
Sub KeeTotal()
Dim dTotal As Double
Dim lRow As Long
'Specify data range
With Range("A2:E22")
'Loop through rows
For lRow = 1 To .Rows.Count
'Sum rows for Kee
If .Cells(lRow, 1) = "Kee" Then dTotal = _
dTotal + .Cells(lRow, 5)
Next lRow
End With
'Display result
Debug.Print ("Kee Total = " & Format(dTotal, "$#,##0"))
End Sub
Sub KeeTotal2()
Dim vSalesData As Variant
Dim dTotal As Double
Dim lRow As Long
'Assign range values to variant
vSalesData = Range("A2:E22").Value
'Sum elements of the array
For lRow = 1 To UBound(vSalesData, 1)
If vSalesData(lRow, 1) = "Kee" Then dTotal = _
dTotal + vSalesData(lRow, 5)
Next lRow
'Display result
Debug.Print ("Kee Total = " & Format(dTotal, "$#,##0"))
End Sub
Sub Discount()
Dim arr As Variant
Dim zk() As Variant
Dim i As Long
'Assign range values to variant
arr = Range("A2:F22").Value
'Match output array row count to input row count
ReDim zk(1 To UBound(arr, 1), 1 To 1)
'Process data in variant
For i = 1 To UBound(arr, 1)
If arr(i, 1) = "Kee" Then
zk(i, 1) = arr(i, 5) * 0.1
End If
Next i
'Write array values to worksheet
Range("F2").Resize(UBound(arr, 1), 1).Value = zk
End Sub
Sub Discount2()
Dim arr As Variant
Dim zk() As Variant
Dim i As Long
'Assign range values to variant
arr = Range("A2:F22").Value
'Match output array row count to input row count
ReDim zk(1 To UBound(arr, 1))
'Process data in variant
For i = 1 To UBound(arr, 1)
If arr(i, 1) = "Kee" Then
zk(i) = arr(i, 5) * 0.1
End If
Next i
'Write array values to worksheet
Range("F2").Resize(UBound(arr, 1), 1).Value = _
WorksheetFunction.Transpose(zk)
End Sub
-End-





