4

您能否说一下 - 如何将 Excel Range("G2:AA1000") 分配给 2D 数组?如果可能,如何在对该二维数组执行某些操作后将该二维数组返回到相同的范围?在将范围分配给二维数组后,如何从该二维矩阵中识别每一行?

谢谢,

4

4 回答 4

4

有一种简单的方法可以使用数组对区域进行更改,并将其写入同一个地方或其他地方。

此示例代码将使用数组将数据从一个区域复制到另一个区域:

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)A13testdata(13,2)指的是B13

将范围设置为等于下一行中的数组将数组复制到指定位置。

  • 如果该区域小于原始数组,它将仅复制足够的数组以填充该空间,因此Range("D1")=testdata只会在工作表上放置一个单元格。
  • 如果指定更大的区域,则#N/A将填充不在数组元素覆盖的空间中的区域,因此Range("A1:A3")=testdata将使用数组中的数据填充 A1 和 A2,但 A3 将具有#N/A

示例程序结果:
注:A1:B13 为原始数据,后续复制range(??)=testdata 上述代码的结果

于 2012-12-27T20:13:31.953 回答
1

这是一个从工作表中读取一系列数据,对数组进行操作,然后将其写回同一个工作表的示例。

    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
于 2012-12-26T05:21:13.757 回答
1

是的,可以在一次分配中将 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。

于 2021-02-08T19:45:13.640 回答
0

循环范围的一种方法是使用带有 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
于 2012-12-26T03:48:14.923 回答