gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:18:12 25 4
gpt4 key购买 nike

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

Dim matrix As Variant
matrix = Range("A1:C5").value

输入矩阵:
+----+----+----+
| A1 | B1 | C1 |
+----+----+----+
| A2 | B2 | C2 |
+----+----+----+
| A3 | B3 | C3 |
+----+----+----+
| A4 | B4 | C4 |
+----+----+----+
| A5 | B5 | C5 |
+----+----+----+

我想在 VBA 矩阵的第一列中获得带有计数器值的新矩阵。

以下是期望的结果:
+----+----+----+----+
| 1 | A1 | B1 | C1 |
+----+----+----+----+
| 2 | A2 | B2 | C2 |
+----+----+----+----+
| 3 | A3 | B3 | C3 |
+----+----+----+----+
| 4 | A4 | B4 | C4 |
+----+----+----+----+
| 5 | A5 | B5 | C5 |
+----+----+----+----+

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

最佳答案

如果您主要关心的是性能,请使用 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

关于arrays - 如何在 VBA 中向现有矩阵添加计数器列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46712110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com