excel - 如何实例化一个动态的空数组并添加它的第一个元素?
问题描述
我一直在尝试实例化一个空数组,我将在其中添加元素。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 在空数组上抛出错误是否正常?如果是这样,如何将第一个元素添加到空数组中?
解决方案
Dim site_dates
这个变量是隐式的Variant
。虽然 aVariant
可以很好地保存一个数组,但它初始化为Variant/Empty
,这不是一个数组 - 这就是UBound(site_dates)
引发错误的原因:您正在尝试获取 a 的上限Variant/Empty
,而 VBA 不知道如何处理它.
这声明了一个动态的Variant
项目数组:
Dim site_dates()
也就是说,一般来说,您应该避免调整数组的大小(一个循环ReDim Preserve theArray(UBound(theArray) + 1)
在每次迭代时复制整个数组只是为了添加一个项目 - 更多项目的惩罚会更加明显):如果您不知道您有多少元素需要时,使用 aCollection
和Add
items 通常是一个更好的主意。如果您确实知道需要多少元素,则在声明站点上相应地显式调整数组大小:
Dim site_dates(1 To 10)
请注意,Dim
语句不可执行,因此您不能使用变量。使用该ReDim
语句执行此操作:
ReDim site_dates(1 To datesCount)
ReDim
充当声明性语句,因此您不需要先验Dim
,即使已Option Explicit
指定。
在这种情况下,您可以Application.WorksheetFunction.CountIf
在开始迭代值之前获取与条件匹配的日期数和数组大小。
推荐阅读
- json - Jsonschema 验证
- ios - 为什么 iOS WebRTC 在某些运营商的 LTE/4G 中不断断开和重新连接
- oracle - 标识符“SYS.DBMS_SQL”必须声明为错误
- javascript - 渲染期间嵌套 ul 列表中的简单 Vue.Draggable 中断
- python - 滚动查找嵌套在里面的元素 - Senium with Python(使用 SeleniumLibrary)
- java - Android 库的单例依赖注入
- docker - 如何在没有 docker -p 选项但从 dockerfile 或 dockercompose 的情况下在端口 8080 上运行 docker?
- ios - 在 SWIFT 中更改字典数组中特定键的值
- java - 请求用户输入以使用递归启动斐波那契数列
- android - Uno 平台:Android 构建失败并出现 ShellTask 错误