如何将一个一维数组复制到另一个一维数组和二维数组中?

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

但是它们都没有起作用。如何正确地将一个一维数组复制到另一个一维数组和二维数组中?


第一段代码中的 mn 是什么? ;) - Siddharth Rout
此外,如果您在谷歌上搜索,会有很多关于这个问题的答案 :) - Siddharth Rout
4个回答

3

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

1D数组示例

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

2D数组示例

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开始,它们会根据您设定的边界而运行从任意位置到任意位置。 - Tom
@Tom,我在这个问题上缺乏清晰度。我指的是当您没有将其设置为其他值时,索引从0开始的情况。 - Rémi

1
这里有两个需要记住的事情。
首先,你需要通过使用 ReDim 来为 Arr2 分配一个维度,例如:

其次,你需要在使用 Arr2 之前初始化它。你可以使用以下代码:

ReDim Arr2(ubound(Arr1))

For循环之前,由于没有预先确定维度,Dim Arr2()声明了一个数组,您需要在之后更改其维度。
其次,在VBA中,由于数组从0开始,您会遇到从0到3范围的Arr1和从1到4范围的Arr3(来自声明ReDim Arr3(1 To m, 1 To n))的问题。 一个好的实践方法是要么使用所有从0开始的数组,要么使用所有从1开始的数组,而不是同时使用两种。
您可以通过使用Option Base 1命令(在这里查看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,了解数组的下限和上限。

你们两个的代码都不起作用。出现了与原帖作者相同的错误。 - Anastasiya-Romanova 秀
谢谢,我为了让这个例子能够运行,给 mn 添加了值。 - Pierre Chevallier

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)

为了最佳的编程实践,你应该始终明确指定数组的下限和上限,无论是在Dim语句还是ReDim语句中。所以你的第一个代码应该是:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接