如何将1D阵列复制到另一个1D阵列和2D阵列?

时间:2016-07-29 08:56:40

标签: arrays excel vba excel-vba

假设我有一个数组(1,2,3,4),那么我想将它复制到另一个1D数组和2D数组。我使用这个子程序:

Sub CopyArray()
    Dim Arr1(), Arr2()
    ReDim Arr3(1 To m, 1 To n)

    Arr1 = Array(1, 2, 3, 4)

    For i = 1 To 4
        Arr2(i) = Arr1(i)
        Arr3(1, i) = Arr1(i)
    Next i

End Sub

它不断出现错误"下标超出范围"。我也试过

Sub CopyArray()
    Dim Arr1(), Arr2()

    Arr1 = Array(1, 2, 3, 4)

    For i = 1 To 4
        Arr2(i) = Arr1(i)
    Next i

End Sub

Sub CopyArray()
    Dim Arr1()
    ReDim Arr3(1 To m, 1 To n)

    Arr1 = Array(1, 2, 3, 4)

    For i = 1 To 4
        Arr3(1, i) = Arr1(i)
    Next i

End Sub

但它们都没有奏效。如何将1D阵列正确复制到另一个1D阵列和2D阵列?

4 个答案:

答案 0 :(得分:3)

在您的情况下将一个数组复制到另一个数组的最简单方法是将数组声明为 Dialog d = b.show(); // here you got the dialog object when u showing you dialog first if (d!=null &&d.isShowing()){ d.dismiss(); } 。这样您就不必循环

1D阵列的示例

Variant

2D数组示例

Sub CopyArray()
    Dim x As Variant
    Dim y As Variant

    x = Array(1, 2, 3)

    y = x '<~~ Directly clone the array

    For i = LBound(y) To UBound(y)
        Debug.Print y(i)
    Next i
End Sub

答案 1 :(得分:1)

首先,i必须从0开始,因为它是数组开始的位置。例如代码中的Arr1(1) = 2而不是1。其次,你必须Redim你的第二个数组,所以它与你的第一个数组大小相同。这是一段代码可以帮助您:

Dim Arr1(), Arr2()

Arr1 = Array(1, 2, 3, 4)
ReDim Arr2(0 To 3)

For i = 0 To 3
    Arr2(i) = Arr1(i)
Next i

答案 2 :(得分:1)

这里有两件事要记住。

首先,您必须通过Arr2ReDim提供维度,例如您可以

ReDim Arr2(ubound(Arr1))

For循环之前,因为它事先没有维度:Dim Arr2()声明一个数组,你必须在之后更改维度。

其次,因为数组从VBA中的0开始,因此填充来自Arr1的数据的问题范围为0到3和Arr3范围从1到4(来自声明ReDim Arr3(1 To m, 1 To n))。 一个好的做法是必须使用从0或1开始的所有数组,但不能同时使用两者。

您可以使用Option Base 1命令(here look at the documention from MSDN)强制执行数组维度,然后所有数组都将从1开始。

因此,您可以通过两种方式获得它:

1-使用Base 1

Option Base 1

Sub CopyArray()

    Dim Arr1(), Arr2(), Arr3()

    Arr1 = Array(1, 2, 3, 4)

    'Since I assume you already have values for m and n, I give values for the code to work in our example
    m = 1
    n = 4

    ReDim Arr3(m, n)
    ReDim Arr2(ubound(Arr1))

    For i = LBound(Arr1) To UBound(Arr1)
        Arr2(i) = Arr1(i)
        Arr3(1, i) = Arr1(i)
    Next i

End Sub

2-保持0下限

Sub CopyArray()

    Dim Arr1(), Arr2(), Arr3()

    Arr1 = Array(1, 2, 3, 4)

    'Same as above
    m = 1
    n = 4

    ReDim Arr3(m, n)
    ReDim Arr2(ubound(Arr1))

    For i = LBound(Arr1) To UBound(Arr1)
        Arr2(i) = Arr1(i)
        Arr3(1, i) = Arr1(i)
    Next i

End Sub

请注意,两个代码之间几乎没有差别,但是其中一个代码的所有数组都从1开始而不是0。

我建议您同时阅读LboundUbound以了解数组的下限和上限。

答案 3 :(得分:1)

以下代码可以正常使用:

Sub CopyArray()
    Dim Arr1(), Arr2(3)

    Arr1 = Array(1, 2, 3, 4)

    For i = 0 To 3
        Arr2(i) = Arr1(i)
    Next i

End Sub

请注意,声明指定数组中的元素数。相反,它指定数组的上限。如果您的模块不包含Option Base语句,则假定下限为零。因此,上面的声明Dim Arr2(3)

相同
Dim Arr2(0 To 3) As Variant

您可以检查Arr1(1)是否等于2,而不是您认为的1。尝试在Next i下方添加以下行,以检查Arr1的每个元素:

Debug.Print Arr1(0), Arr1(1), Arr1(2), Arr1(3)

对于最佳编程实践,您应该始终DimReDim语句中明确指定数组的下限和上限。所以你的第一个代码应该是

Sub CopyArray()
Dim Arr1(), Arr2(), Arr3()

Arr1 = Array(1, 2, 3, 4)

ReDim Arr2(UBound(Arr1))
ReDim Arr3(1 To 1, 0 To 3)

For i = LBound(Arr1) To UBound(Arr1)
    Arr2(i) = Arr1(i)
    Arr3(1, i) = Arr1(i)
Next i
    Debug.Print Join(Arr2, ",")
    Debug.Print Arr3(1, 0), Arr3(1, 1), Arr3(1, 2), Arr3(1, 3)
End Sub

注意:函数Debug.Print将值写入立即窗口以查看代码的输出。要查看此窗口,请从菜单中选择查看立即窗口,或使用键盘快捷键 Ctrl G

相关问题