如何实例化动态的空数组并添加其第一个元素?

时间:2019-04-30 17:10:21

标签: excel vba

我一直试图实例化一个空数组,在其中添加元素。由于某种原因,我的脚本在仅对空数组调用Ubound时抛出错误。我不知道如何实例化一个空数组...这就是我得到的:

Dim data_dates 
data_dates = Array("6/24/2019", "7/1/2019", "7/8/2019", "7/15/2019", "7/22/2019", "7/29/2019", "8/5/2019", "8/12/2019", "8/19/2019", "8/26/2019", "9/2/2019")
Dim site_dates

For date_iter = 1 To UBound(data_dates)
    If start_date <= data_dates(date_iter) And last_date <= data_dates(date_iter) Then
        MsgBox UBound(site_dates) '- LBound(site_dates) + 1
        site_dates(UBound(site_dates) + 1) = data_dates(date_iter)
    End If
Next date_iter

因此MsgBox行抛出错误。 Ubound在空数组上引发错误是否正常?如果是这样,如何将第一个元素添加到空数组中?

3 个答案:

答案 0 :(得分:3)

Dim site_dates

此变量是隐式Variant。尽管Variant可以很好地容纳一个数组,但它初始化为Variant/Empty,而不是数组-这就是UBound(site_dates)抛出错误的原因:您正在尝试获取上面的Variant/Empty的边界,而VBA不知道该怎么办。

这声明了Variant个项目的动态数组:

Dim site_dates()

也就是说,通常应该避免调整数组的大小(使用ReDim Preserve theArray(UBound(theArray) + 1)的循环会在每次迭代时复制整个数组,只是为了添加单个项目-如果有更多的项目,惩罚会变得更加明显):如果不这样做不知道您将需要多少个元素,通常最好在使用时使用CollectionAdd项目。如果您确实知道需要多少个元素,则在声明站点上相应地显式调整数组大小:

Dim site_dates(1 To 10)

请注意,Dim语句不可执行,因此不能使用变量。使用ReDim语句执行此操作:

ReDim site_dates(1 To datesCount)

ReDim用作声明性语句,因此即使指定了Dim,也不需要在先的Option Explicit

在这种情况下,可以使用Application.WorksheetFunction.CountIf获取与条件匹配的日期数,并在开始迭代值之前对数组进行大小调整。

答案 1 :(得分:1)

开始增长过程的一种方式:

Sub InTheBeginning()
    Dim site_dates() As Date, msg As String
    ReDim site_dates(1)

    For i = 1 To 10
        ReDim site_dates(1 To UBound(site_dates) + 1)
    Next i


    msg = LBound(site_dates) & vbCrLf & UBound(site_dates)
    MsgBox msg
End Sub

enter image description here

答案 2 :(得分:0)

首先要检查您是否正在使用Option base 1,因为要从1开始循环?

如果您具有从data_dates知道最大可能site_dates的设置,则可以在开始时(循环之前)重新定义site_dates的范围,使其与data-dates的范围相同。

跟踪“ If逻辑”循环中计数器中写入的合格项目数。 然后,最后,您可以将Redim Preserve保留为生成的数量:

362945AD4A5F87F27D3DB3B4ADBACAEE0EBC3F778EE2FE76EF4FB09933148372

或者,不用担心性能,可以考虑对我来说最简单:

引用mscorlib并使用ArrayList

ReDim Preserve site_dates(1 to qualifyingCounter)

编辑: 要进行引用,请转到工具->引用,然后按字母顺序查找mscorlib.dll。然后检查一下。

enter image description here