Oue*_*ine 15 arrays vb6 multidimensional-array dynamic-arrays
我正在使用VB6,我需要为多维数组做一个ReDim Preserve:
Dim n, m As Integer
n = 1
m = 0
Dim arrCity() As String
ReDim arrCity(n, m)
n = n + 1
m = m + 1
ReDim Preserve arrCity(n, m)
Run Code Online (Sandbox Code Playgroud)
每当我写它时,我都会收到以下错误:
运行时错误9:下标超出范围
因为我只能更改最后一个数组维度,所以在我的任务中我必须更改整个数组(在我的示例中为2维)!
有没有解决方法或其他解决方案?
正如您正确指出的那样,ReDim Preserve
只能是数组的最后一个维度(MSDN上的ReDim语句):
如果使用"保留"关键字,则只能调整最后一个数组维度的大小,并且根本无法更改维度数.例如,如果您的数组只有一个维度,则可以调整该维度的大小,因为它是最后一个维度.但是,如果阵列具有两个或更多维度,则可以仅更改最后一个维度的大小,并仍保留阵列的内容
因此,要确定的第一个问题是二维数组是否是作业的最佳数据结构.也许,1维阵列更适合您需要做的事情ReDim Preserve
?
另一种方法是根据Pieter Geerkens的建议使用锯齿状阵列.在VB6中没有直接支持锯齿状数组.在VB6中编写"数组数组"的一种方法是声明一个数组,Variant
并使每个元素成为所需类型的数组(String
在您的情况下).演示代码如下.
另一种选择是自己实现Preserve
部分.为此,您需要创建要保留的数据副本,然后使用它填充redimensioned数组.
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
Run Code Online (Sandbox Code Playgroud)
由于 VB6 与 VBA 非常相似,我想我可能有一个解决方案,它不需要这么多代码到ReDim
二维数组 -Transpose
如果您在 Excel 中工作,请使用 。
解决方案(Excel VBA):
Dim n, m As Integer
n = 2
m = 1
Dim arrCity() As Variant
ReDim arrCity(1 To n, 1 To m)
m = m + 1
ReDim Preserve arrCity(1 To n, 1 To m)
arrCity = Application.Transpose(arrCity)
n = n + 1
ReDim Preserve arrCity(1 To m, 1 To n)
arrCity = Application.Transpose(arrCity)
Run Code Online (Sandbox Code Playgroud)
与 OP 的问题有什么不同:arrCity
数组的下限不是 0,而是 1。这是为了让它Application.Transpose
完成它的工作。
请注意,这Transpose
是 ExcelApplication
对象的一种方法(实际上是 的快捷方式Application.WorksheetFunction.Transpose
)。而在 VBA 中,使用时必须小心,Transpose
因为它有两个明显的限制:如果数组有超过 65536 个元素,它将失败。如果任何元素的长度超过 256 个字符,它将失败。如果这些都不是问题,那么 Transpose 可以很好地将数组的秩从 1D 转换为 2D,反之亦然。
不幸的是,VB6 中没有像“转置”这样的东西。
对此:
“在我的任务中,我必须更改整个数组(二维”
只需使用“锯齿状”数组(即值数组的数组)。然后您可以根据需要更改尺寸。您可以拥有变体的一维数组,并且变体可以包含数组。
也许还需要做一些工作,但这是一个解决方案。