您能否说一下 - 如何将 Excel Range("G2:AA1000") 分配给 2D 数组?如果可能,如何在对该二维数组执行某些操作后将该二维数组返回到相同的范围?在将范围分配给二维数组后,如何从该二维矩阵中识别每一行?
谢谢,
有一种简单的方法可以使用数组对区域进行更改,并将其写入同一个地方或其他地方。
此示例代码将使用数组将数据从一个区域复制到另一个区域:
Sub example()
Dim testdata()
testdata = Range("A1:B13")
Range("D1:E13") = testdata ' simple copy
Range("G1") = testdata ' copy only 1 cell
Range("I1:K22") = testdata 'try to copy too much
End Sub
该testdata
数组从1开始,并将扩展到该范围中指定的列数和行数。在这种情况下,testdata(1,1)
指的是从A1中得到的数据,testdata(1,2)
指的是B1,最后是testdata(13,1)
指A13,testdata(13,2)
指的是B13。
将范围设置为等于下一行中的数组将数组复制到指定位置。
Range("D1")=testdata
只会在工作表上放置一个单元格。Range("A1:A3")=testdata
将使用数组中的数据填充 A1 和 A2,但 A3 将具有#N/A示例程序结果:
注:A1:B13 为原始数据,后续复制range(??)=testdata
这是一个从工作表中读取一系列数据,对数组进行操作,然后将其写回同一个工作表的示例。
Sub RangeArray()
Dim Rng As Range
Dim Arr()
Dim ArrItem
Dim i As Long, j As Long
Dim rUB as Long, cUB as Long
Set Rng = Worksheets("Sheet1").Range("A1:G19")
rUB = Rng.Rows.Count 'Row upper bound
cUB = Rng.Columns.Count ' Column upper bound
ReDim Arr(1 To rUB, 1 To cUB)
'Read worksheet range into array
For i = 1 To rUB
For j = 1 to cUB
Arr(i, j) = Rng.Cells(i, j).Value
Next
Next
'Do something to array
For i = 1 To rUB
For j = 1 To cUB
If i <> j Then
Arr(i, j) = Arr(i, j) / (i * j)
End If
Next
Next
'Write array back to worksheet
Set Rng = Worksheets("Sheet1").Range("I1")
For i = 1 To rUB
For j = 1 To cUB
Rng.Offset(i - 1, j - 1).Value = Arr(i, j)
Next
Next
End Sub
是的,可以在一次分配中将 Excel 范围分配给二维数组。在 C++/CLI 中,它看起来像这样:
cli::array<Object^, 2>^ arrData = safe_cast<cli::array<Object^, 2>^>(rg->Value[Excel::XlRangeValueDataType::xlRangeValueDefault]); 在 c# 或 Visual Basic 中,它看起来要简单得多(例如参见https://www.automateexcel.com/vba/assign-range-to-array/,顺便说一句,在 dotnet 中,对象现在扮演了变体数据的角色类型)。请注意,它必须是二维数组,并且返回的数组具有从一开始的索引,而不是从零开始的索引。
对于大型数据集,此方法比循环快得多。循环生成大量 COM 对象。我将这两种方法与 33000 行 Excel 范围进行了比较,数据导入数组几乎是瞬时的,而循环需要很长时间并且会加热 CPU。
循环范围的一种方法是使用带有 Cells 属性的 For...Next 循环。使用 Cells 属性,您可以将循环计数器(或其他变量或表达式)替换为单元格索引号。在下面的示例中,变量 counter 被替换为行索引。该过程循环通过范围 C1:C20,将绝对值小于 0.01 的任何数字设置为 0(零)。
Sub RoundToZero1()
For Counter = 1 To 20
Set curCell = Worksheets("Sheet1").Cells(Counter, 3)
If Abs(curCell.Value) < 0.01 Then curCell.Value = 0
Next Counter
End Sub