如何在VBA中向现有矩阵添加计数器列?

Prz*_*min 3 arrays excel vba matrix

如何在 VBA 中使用第一个“列”中的计数器值获取新矩阵。假设我们有一个 VBA 矩阵,其中包含我们从单元格中获取的值。A1单元格的值只是“A1”。

Dim matrix As Variant
matrix = Range("A1:C5").value
Run Code Online (Sandbox Code Playgroud)

输入矩阵:

+----+----+----+
| A1 | B1 | C1 |
+----+----+----+
| A2 | B2 | C2 |
+----+----+----+
| A3 | B3 | C3 |
+----+----+----+
| A4 | B4 | C4 |
+----+----+----+
| A5 | B5 | C5 |
+----+----+----+
Run Code Online (Sandbox Code Playgroud)

我想在 VBA 矩阵的第一列中使用计数器值获取新矩阵。

以下是想要的结果:

+----+----+----+----+
|  1 | A1 | B1 | C1 |
+----+----+----+----+
|  2 | A2 | B2 | C2 |
+----+----+----+----+
|  3 | A3 | B3 | C3 |
+----+----+----+----+
|  4 | A4 | B4 | C4 |
+----+----+----+----+
|  5 | A5 | B5 | C5 |
+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)

一种方法是循环。有没有其他更优雅的方式来做到这一点?我们在这里处理大型数据集,所以请注意性能。

Flo*_* B. 6

如果您主要关心的是性能,那么使用Redim Preserve在末尾添加一个新列并使用 OS API 直接在内存中移动每一列:

Private Declare PtrSafe Sub MemCpy Lib "kernel32" Alias "RtlMoveMemory" ( _
  ByRef dst As Any, ByRef src As Any, ByVal size As LongPtr)

Private Declare PtrSafe Sub MemClr Lib "kernel32" Alias "RtlZeroMemory" ( _
  ByRef src As Any, ByVal size As LongPtr)


Sub AddIndexColumn()
  Dim arr(), r&, c&
  arr = [A1:F1000000].Value

  ' add a column at the end
  ReDim Preserve arr(LBound(arr) To UBound(arr), LBound(arr, 2) To UBound(arr, 2) + 1)

  ' shift the columns by 1 to the right
  For c = UBound(arr, 2) - 1 To LBound(arr, 2) Step -1
    MemCpy arr(LBound(arr), c + 1), arr(LBound(arr), c), (UBound(arr) - LBound(arr) + 1) * 16
  Next
  MemClr arr(LBound(arr), LBound(arr, 2)), (UBound(arr) - LBound(arr) + 1) * 16

  ' add an index in the first column
  For r = LBound(arr) To UBound(arr)
    arr(r, LBound(arr, 2)) = r
  Next

End Sub
Run Code Online (Sandbox Code Playgroud)

  • @TM,需要注意的是它使用在 Mac OS 上不同的本机 API。关于 `CopyMemory` 和 `MoveMemory` 之间的区别,请看这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ff561808(v=vs.85).aspx (2认同)