首页 > 解决方案 > 如何实例化一个动态的空数组并添加它的第一个元素?

问题描述

我一直在尝试实例化一个空数组,我将在其中添加元素。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 在空数组上抛出错误是否正常?如果是这样,如何将第一个元素添加到空数组中?

标签: excelvba

解决方案


Dim site_dates

这个变量是隐式的Variant。虽然 aVariant可以很好地保存一个数组,但它初始化为Variant/Empty,这不是一个数组 - 这就是UBound(site_dates)引发错误的原因:您正在尝试获取 a 的上限Variant/Empty,而 VBA 不知道如何处理它.

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

Dim site_dates()

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

Dim site_dates(1 To 10)

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

ReDim site_dates(1 To datesCount)

ReDim充当声明性语句,因此您不需要先验Dim,即使已Option Explicit指定。

在这种情况下,您可以Application.WorksheetFunction.CountIf在开始迭代值之前获取与条件匹配的日期数和数组大小。


推荐阅读