正如您正确指出的那样,人们可以ReDim Preserve
仅数组的最后一个维度(重新调暗声明 http://msdn.microsoft.com/en-us/library/aa266231.aspx在 MSDN 上):
如果使用 Preserve 关键字,则只能调整最后一个数组的大小
维度,并且您根本无法更改维度数。为了
例如,如果您的数组只有一维,您可以调整其大小
维度,因为它是最后也是唯一的维度。但是,如果您的
数组有两个或多个维度,您只能更改其中的大小
最后一个维度并仍然保留数组的内容
因此,要决定的第一个问题是二维数组是否是最适合该工作的数据结构。也许,一维数组更适合您需要做的事情ReDim Preserve
?
另一种方法是使用锯齿状数组彼得·吉尔肯斯的建议 https://stackoverflow.com/a/16369934/262403。 VB6 中不直接支持锯齿状数组。在 VB6 中编写“数组的数组”的一种方法是声明一个数组Variant
并使每个元素成为所需类型的数组(String
在你的情况下)。演示代码如下。
另一种选择是实施Preserve
部分由你自己承担。为此,您需要创建要保留的数据副本,然后用它填充重新调整尺寸的数组。
Option Explicit
Public Sub TestMatrixResize()
Const MAX_D1 As Long = 2
Const MAX_D2 As Long = 3
Dim arr() As Variant
InitMatrix arr, MAX_D1, MAX_D2
PrintMatrix "Original array:", arr
ResizeMatrix arr, MAX_D1 + 1, MAX_D2 + 1
PrintMatrix "Resized array:", arr
End Sub
Private Sub InitMatrix(a() As Variant, n As Long, m As Long)
Dim i As Long, j As Long
Dim StringArray() As String
ReDim a(n)
For i = 0 To n
ReDim StringArray(m)
For j = 0 To m
StringArray(j) = i * (m + 1) + j
Next j
a(i) = StringArray
Next i
End Sub
Private Sub PrintMatrix(heading As String, a() As Variant)
Dim i As Long, j As Long
Dim s As String
Debug.Print heading
For i = 0 To UBound(a)
s = ""
For j = 0 To UBound(a(i))
s = s & a(i)(j) & "; "
Next j
Debug.Print s
Next i
End Sub
Private Sub ResizeMatrix(a() As Variant, n As Long, m As Long)
Dim i As Long
Dim StringArray() As String
ReDim Preserve a(n)
For i = 0 To n - 1
StringArray = a(i)
ReDim Preserve StringArray(m)
a(i) = StringArray
Next i
ReDim StringArray(m)
a(n) = StringArray
End Sub