Vba 命名范围的数据类型

Vba 命名范围的数据类型,vba,excel,date,variant,Vba,Excel,Date,Variant,例如,我在Excel中有一个名为StartDates的命名范围。命名范围仅包含日期。示例代码如下: Sub test2() Dim dat_readdates() As Date dat_readdates = Range("StartDates").Value End Sub 这总是导致众所周知的运行时错误“13”:类型不匹配 一个简单的改变,它的工作很好 Sub test2() Dim var_readdates() As Variant var_readdates = Range(

例如,我在Excel中有一个名为StartDates的命名范围。命名范围仅包含日期。示例代码如下:

Sub test2()
Dim dat_readdates() As Date

dat_readdates = Range("StartDates").Value

End Sub
这总是导致众所周知的运行时错误“13”:类型不匹配

一个简单的改变,它的工作很好

Sub test2()
Dim var_readdates() As Variant

var_readdates = Range("StartDates").Value

End Sub
是否有一个已知的规则,即数据必须作为变量数据类型读入?显然,为了提高速度,我想使用最适合读取数据的数据类型。 我是否需要将其作为变量读取,然后使用cDate转换为另一个日期类型的变量?我是否可以进行质量转换,例如:

dat_readdates = cDate(var_readdates)

不,很遗憾。值作为变量从Excel中获取。获取单个单元格时,可以直接将其转换为适当的类型,即

Dim x as Long
x = myCell.Value
在上面的代码中,首先将
myCell.Value
提取为
变量
,然后由VBA将其转换为long(以执行赋值),如果可以进行转换,则会出现运行时错误

如果有多个单元格范围,则更为棘手。
range.value
返回一个变量数组。不幸的是,VBA不提供将变量数组自动转换为类型化数组的功能。因此,以下方法行不通:

Dim x() as Long
x = myRange.Value
VBA不允许像使用简单变量那样转换数组;即使程序员确信数组中的所有变量都是所需类型(即上例中的
Long

要强调,忘记excel;以下内容在VBA中不起作用:

Dim varArray() ' a variant array
varArray = Array(1, 2, 3, 4, 5)
Dim longArray() as Long
longArray = varArray ' <-- type mismatch. No conversion from variant array to typed array.
Dim varArray()'变量数组
varArray=Array(1,2,3,4,5)
Dim longArray()的长度为

longArray=varArray'如果您选中
Typename(var\u readdates(1,1))
,您会得到什么?如果您的范围有日期,那么它应该已经是
日期
。@TimWilliams,然后它应该是
变体/日期
,而不是本机VBA
日期
。OP希望使用本机变量:)感谢A.S.H.一个元素一个元素地循环变量,使用cDate一个元素一个元素地创建日期数组似乎是唯一的方法。我当然希望避免从excel中逐个读取元素,以便它作为正确的类型进入VBA。大量读取然后逐元素转换感觉可能会更快。@farmerandy:你说得对。将变量数组重新划分为正确的大小,然后从范围的Value2属性为其赋值。我发现这比逐元素处理快很多倍,写入范围时快30倍。@farmerandy我同意,我没有看到比循环转换为类型化数组更好的方法。它是否有益取决于后续的代码——若随后将进行大规模的类型化变量计算,那个么肯定是的。转换完成后,不要忘记去掉变体数组以节省空间。类似于
Redim theVariantArray(0)
@PieterGeerkens我试图调和A.S.H和Peiter的评论。Pieter您似乎在说要进行大量阅读,但要使用Value2属性与Value?A.S.H你似乎同意我作为变量数据类型大量读取后的逐元素转换?@farmerandy这两个注释之间没有矛盾。我的想法是,在从Excel获取变量数组后,您打算(据我所知)将变量数组转换为类型化数组。另一条评论是关于如何首先获取变量数组。