use*_*577 36 arrays excel vba initialization excel-vba
我对VBA来说相当新,所以这可能是一个简单的问题但是这里有.
我想myArray在VBA中初始化整个数组,比如整数.我知道我可以通过这样的简单初始化来做到这一点:
Dim myArray
myArray = Array(1, 2, 4, 8)
Run Code Online (Sandbox Code Playgroud)
但是如果数组很大,这很麻烦,我想将所有元素初始化为相同的值.理想情况下它会是这样的:
myArray(:) = 0
Run Code Online (Sandbox Code Playgroud)
我试过了,但编译器抱怨.然后我尝试了myArray() = 0,它也抱怨了.
任何人都可以解释如何做到这一点,没有循环?如果可能的话,我想在一个声明中这样做.
澄清:
我想将数组的每个元素初始化为一些初始值.因此,如果我有一个Dim myArray(300) As Integer300个整数的数组,那么所有300个元素将保持相同的初始值(例如,数字13).
更多澄清
我发现这个答案说明你可以用这样的变量做到这一点:
Dim x As Double: x = 0
Run Code Online (Sandbox Code Playgroud)
也许有一种方法可以稍微更新语法以使其适用于数组?
Che*_*hel 28
这很容易,至少如果你想要一个基于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
Run Code Online (Sandbox Code Playgroud)
字节数组也不错:
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
Run Code Online (Sandbox Code Playgroud)
您可以使用相同的方法来填充其他数值数据类型的数组,但是您只能使用可以用单个重复字节表示的值:
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
Run Code Online (Sandbox Code Playgroud)
如果你想在其他情况下避免循环,它会变得更加毛茸茸.除非您的阵列是50K或更大的条目,否则不值得.只需在循环中设置每个值,你就会足够快,正如我在之前的回答中所说的那样.
Sid*_*out 10
您可以通过指定尺寸来初始化阵列.例如
Dim myArray(10) As Integer
Dim myArray(1 to 10) As Integer
Run Code Online (Sandbox Code Playgroud)
如果您正在使用数组,如果这是您的第一次,那么我建议您访问Chip Pearson的网站.
这个初始化是什么?例如,如果我想将整个数组初始化为13,该怎么办?
当你想要初始化13个元素的数组时,你可以用两种方式完成它
Dim myArray(12) As Integer
Dim myArray(1 to 13) As Integer
Run Code Online (Sandbox Code Playgroud)
在第一个数组的下限开始,0所以你可以在数组中存储13个元素.例如
myArray(0) = 1
myArray(1) = 2
'
'
'
myArray(12) = 13
Run Code Online (Sandbox Code Playgroud)
在第二个示例中,您指定了下限,1因此您的数组以此开头,1并且可以再次存储13个值
myArray(1) = 1
myArray(2) = 2
'
'
'
myArray(13) = 13
Run Code Online (Sandbox Code Playgroud)
如果使用上述任何方法初始化数组,则数组中每个元素的值等于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
Run Code Online (Sandbox Code Playgroud)
要么
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
Run Code Online (Sandbox Code Playgroud)
从评论中了解
所以,在这个例子中,每个值都是13.所以如果我有一个数组Dim myArray(300)As Integer,所有300个元素都将保持值13
就像我提到的,AFAIK,没有直接的方式来实现你想要的.话虽如此,这是一种使用工作表函数Rept创建重复字符串13的方法.一旦我们有了这个字符串,我们就可以使用SPLITusing ","作为分隔符.但请注意,这会创建一个变量数组,但可以用于计算.
另请注意,在以下示例中,myArray实际上将保存301个值,其中最后一个为空 - 您必须通过另外初始化此值或从操作sNum之前删除最后一个","来解释该值Split.
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
Run Code Online (Sandbox Code Playgroud)
在计算中使用变量数组
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
Run Code Online (Sandbox Code Playgroud)