2016-07-29 137 views
3

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

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 

,但没有一次成功。如何正确地将一维数组复制到另一个一维数组和二维数组?

+0

什么是'M',什么是'N'在第一段代码中? ;) –

+0

另外,如果你搜索谷歌有很多答案:) –

回答

3

在你的情况下将一个数组复制到另一个数组的最简单方法是将数组声明为Variant。这样,您就不必环一维数组的

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 

二维数组的例子

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

    x = Array(1, 2, 3) 

    y = Application.Transpose(x) '<~~ Transpose it 

    For i = LBound(y) To UBound(y) 
     Debug.Print y(i, 1) 
    Next i 
End Sub 
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 
+0

数组不必从0开始。它们根据你设置的边界从任何东西运行到任何东西。 – Tom

+0

@Tom我对这个问题缺乏清晰度。我指的是当你没有将它设置为不同的值时,从0开始的索引。 –

1

在这里你有两件事要记住。

首先,你必须通过ReDim给予Arr2的尺寸,例如,你可以做

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使用底座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阵列的阵列。

+0

你的两个代码都不起作用。发生与OP相同的错误。 –

+0

谢谢,我为这个例子的工作增加了'm'和'n'的价值。 –

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写入值到立即窗口看到你的代码的输出。要查看此窗口,请选择查看立即窗口从菜单或使用键盘快捷键CtrlG

相关问题