假设我有一个数组(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阵列?
答案 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)
这里有两件事要记住。
首先,您必须通过Arr2
为ReDim
提供维度,例如您可以
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。
答案 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)
对于最佳编程实践,您应该始终在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
将值写入立即窗口以查看代码的输出。要查看此窗口,请从菜单中选择查看►立即窗口,或使用键盘快捷键 Ctrl G 。