VBA(Excel)无循环初始化整个数组

我对VBA相当陌生,所以这可能是一个简单的问题,但是这里有。

我想在VBA中初始化整数数组myArray ,比如整数。 我知道我可以通过一个简单的初始化来做到这一点:

 Dim myArray myArray = Array(1, 2, 4, 8) 

但是,如果数组很大,这是很麻烦的,我想初始化所有元素到相同的值。 理想情况下,这将是这样的:

 myArray(:) = 0 

我试过,但编译器抱怨。 然后我尝试myArray() = 0 ,它也抱怨。

任何人都可以解释如何做到这一点, 没有循环 ? 如果可能,我想在一个声明中这样做。

澄清

我想初始化数组中的每个元素到一些初始值。 所以,如果我有一个数组Dim myArray(300) As Integer 300整数的整数,例如,所有300个元素将保持相同的初始值(比如13)。

更澄清

我发现这个答案 ,说你可以这样做一个variables:

 Dim x As Double: x = 0 

也许有一种方法稍微更新语法,使其适用于数组?

这很简单,至less如果你想要一个基于1,1D或2D的变体数组:

 Sub StuffVArr() Dim v() As Variant Dim q() As Variant v = Evaluate("=IF(ISERROR(A1:K1), 13, 13)") q = Evaluate("=IF(ISERROR(A1:G48), 13, 13)") End Sub 

字节数组也不算太糟糕:

 Private Declare Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" _ (dest As Any, ByVal size As Long, ByVal fill As Byte) Sub StuffBArr() Dim i(0 To 39) As Byte Dim j(1 To 2, 5 To 29, 2 To 6) As Byte FillMemory i(0), 40, 13 FillMemory j(1, 5, 2), 2 * 25 * 5, 13 End Sub 

您可以使用相同的方法来填充其他数字数据types的数组,但是您仅限于可以用单个重复字节表示的值:

 Sub StuffNArrs() Dim i(0 To 4) As Long Dim j(0 To 4) As Integer Dim u(0 To 4) As Currency Dim f(0 To 4) As Single Dim g(0 To 4) As Double FillMemory i(0), 5 * LenB(i(0)), &HFF 'gives -1 FillMemory i(0), 5 * LenB(i(0)), &H80 'gives -2139062144 FillMemory i(0), 5 * LenB(i(0)), &H7F 'gives 2139062143 FillMemory j(0), 5 * LenB(j(0)), &HFF 'gives -1 FillMemory u(0), 5 * LenB(u(0)), &HFF 'gives -0.0001 FillMemory f(0), 5 * LenB(f(0)), &HFF 'gives -1.#QNAN FillMemory f(0), 5 * LenB(f(0)), &H80 'gives -1.18e-38 FillMemory f(0), 5 * LenB(f(0)), &H7F 'gives 3.40e+38 FillMemory g(0), 5 * LenB(g(0)), &HFF 'gives -1.#QNAN End Sub 

如果你想避免在其他情况下的循环,它会变得更加有趣。 除非你的数组是50K条目或更大,否则不值得。 只要将每个值设置在一个循环中,就可以达到足够快的速度正如我在前面的回答中所谈到的那样 。

您可以通过指定尺寸来初始化数组。 例如

 Dim myArray(10) As Integer Dim myArray(1 to 10) As Integer 

如果你正在使用arrays,如果这是你第一次,那么我会build议访问芯片皮尔逊的网站 。

这是什么初始化? 例如,如果我想将整个数组初始化为13呢?

当你想初始化13个元素的数组,那么你可以用两种方法来完成

 Dim myArray(12) As Integer Dim myArray(1 to 13) As Integer 

在第一个数组的下界将从0开始,所以你可以在数组中存储13个元素。 例如

 myArray(0) = 1 myArray(1) = 2 ' ' ' myArray(12) = 13 

在第二个示例中,您将下限指定为1所以您的数组以1开头,可以再次存储13个值

 myArray(1) = 1 myArray(2) = 2 ' ' ' myArray(13) = 13 

在使用上述任何方法初始化数组时,数组中每个元素的值都等于0 。 要检查这个代码。

 Sub Sample() Dim myArray(12) As Integer Dim i As Integer For i = LBound(myArray) To UBound(myArray) Debug.Print myArray(i) Next i End Sub 

要么

 Sub Sample() Dim myArray(1 to 13) As Integer Dim i As Integer For i = LBound(myArray) To UBound(myArray) Debug.Print myArray(i) Next i End Sub 

跟随评论

所以,在这个例子中,每个值都是13,所以如果我有一个数组Dim myArray(300)As Integer,那么所有的300个元素将保持值13

就像我刚才提到的那样,AFAIK没有直接的方法来达到你想要的。 话虽如此,使用工作表函数Rept创build一个13的重复string的一种方法。 一旦我们有了这个string,我们就可以用","作为分隔符来使用SPLIT 。 但是请注意,这将创build一个变体数组,但可用于计算。

还要注意,在以下示例中, myArray实际上将保存最后一个为空的301个值 – 您必须在Split操作之前额外初始化此值或从sNum删除最后一个“,”来sNum此问题。

 Sub Sample() Dim sNum As String Dim i As Integer Dim myArray '~~> Create a string with 13 three hundred times separated by comma '~~> 13,13,13,13...13,13 (300 times) sNum = WorksheetFunction.Rept("13,", 300) sNum = Left(sNum, Len(sNum) - 1) myArray = Split(sNum, ",") For i = LBound(myArray) To UBound(myArray) Debug.Print myArray(i) Next i End Sub 

在计算中使用变体数组

 Sub Sample() Dim sNum As String Dim i As Integer Dim myArray '~~> Create a string with 13 three hundred times separated by comma sNum = WorksheetFunction.Rept("13,", 300) sNum = Left(sNum, Len(sNum) - 1) myArray = Split(sNum, ",") For i = LBound(myArray) To UBound(myArray) Debug.Print Val(myArray(i)) + Val(myArray(i)) Next i End Sub 

我想初始化数组中的每个元素到一些初始值。 所以,如果我有一个数组Dim myArray(300)作为300整数的整数,例如,所有300个元素将保持相同的初始值(比如13)。

任何人都可以解释如何做到这一点, 没有循环? 如果可能,我想在一个声明中这样做。

我赢了什么?

 Sub SuperTest() Dim myArray myArray = Application.Transpose([index(Row(1:300),)-index(Row(1:300),)+13]) End Sub 

这个函数与大小和初始值的variables一起工作,它结合了tbur和Filipe响应。

 Function ArrayIniValue(iSize As Integer, iValue As Integer) Dim sIndex As String sIndex = "INDEX(Row(1:" & iSize & "),)" ArrayIniValue = Evaluate("=Transpose(" & sIndex & "-" & sIndex & "+" & iValue & ")") End Function 

这样调用:

 myArray = ArrayIniValue(350, 13) 

对于VBA,您需要分两行进行初始化。

 Sub TestArray() Dim myArray myArray = Array(1, 2, 4, 8) End Sub 

花哨的方式把@rdhs答案在一个函数中:

 Function arrayZero(size As Integer) arrayZero = Evaluate("=IF(ISERROR(Transpose(A1:A" & size & ")), 0, 0)") End Function 

像这样使用:

 myArray = arrayZero(15) 

一种可用于将值分配给数组的整个元素的方法是将数据放在未使用的工作表上,然后将工作表中的值读回到数组中。 例如,我想给123的一个5×5数组的整个元素赋值。 这是执行这样的任务的单行代码:

 ReDim MyArray(1 To 5, 1 To 5): Range("A1:E5") = 123: MyArray = Range("A1:E5") 

虽然它有点慢,但它工作正常。 您也可以删除数组声明。

 Range("A1:E5") = 123: MyArray = Range("A1:E5") 

事实上,你可以很容易地改变一些元素的值。 例如,假设您想要将元素MyArray(1,1),MyArray(1,5),MyArray(3,3),MyArray(5,1)和MyArray(5,5)的值更改为789 ,那么代码将是这样的

 Range("A1:E5") = 123: Range("A1,E1,C3,A5,E5") = 789: MyArray = Range("A1:E5")