我一直试图实例化一个空数组,在其中添加元素。由于某种原因,我的脚本在仅对空数组调用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在空数组上引发错误是否正常?如果是这样,如何将第一个元素添加到空数组中?
答案 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)
的循环会在每次迭代时复制整个数组,只是为了添加单个项目-如果有更多的项目,惩罚会变得更加明显):如果不这样做不知道您将需要多少个元素,通常最好在使用时使用Collection
和Add
项目。如果您确实知道需要多少个元素,则在声明站点上相应地显式调整数组大小:
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
答案 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。然后检查一下。