arrays - vba数组长度 - vba编程




VBA(Excel)初始化整个数组而不循环 (5)

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

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

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

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

myArray(:) = 0

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

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

澄清

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

更多澄清

我发现这个答案表明你可以用这样的变量做到这一点:

Dim x As Double: x = 0

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


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

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

我赢了什么?

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

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

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")

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

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

如果您正在使用数组,如果这是您的第一次,那么我建议您访问Chip Pearson的WEBSITE

这初始化是什么? 例如,如果我想将整个数组初始化为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来创建13的重复字符串的方法。 一旦我们有了这个字符串,我们可以使用","作为分隔符使用SPLIT 。 但请注意,这会创建一个变量数组,但可以用于计算。

另请注意,在以下示例中, 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

把@rdhs答案放在函数中的奇特方法:

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

并使用这样的:

myArray = arrayZero(15)

这很容易,至少如果你想要一个基于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

您可以使用相同的方法来填充其他数字数据类型的数组,但是您只能使用可以用单个重复字节表示的值:

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或更大的条目,否则不值得。 只需在循环中设置每个值,你就会足够正如我在之前的回答中所说的那样 。





initialization