ReDim保留在Visual Basic 6中的多维数组

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维)!

有没有解决方法或其他解决方案?

Ily*_*sov 6

正如您正确指出的那样,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)


Zyg*_*ygD 5

由于 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 中没有像“转置”这样的东西。

  • 不是。Transpose 是Excel Application 对象的一种方法(实际上是Application.WorksheetFunction.Transpose 的快捷方式)。在 VB6 中没有类似的东西。在 VBA 中,使用 Transpose 时必须小心,因为它有两个明显的限制。如果数组有超过 65536 个元素,它将失败。在任何元素的长度超过 256 个字符时,它都会失败。如果这些都不是问题,那么 Transpose 可以很好地将数组的秩从 1D 转换为 2D,反之亦然。 (2认同)

Pie*_*ens 3

对此:

“在我的任务中,我必须更改整个数组(二维”

只需使用“锯齿状”数组(即值数组的数组)。然后您可以根据需要更改尺寸。您可以拥有变体的一维数组,并且变体可以包含数组。

也许还需要做一些工作,但这是一个解决方案。