2017-05-04 49 views
2

我在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) 
+0

如果你检查'Typename(var_readdates(1,1))'',你会得到什么?如果你的范围有日期,那么它应该已经是'日期'了...... –

+0

@TimWilliams,那么它应该是'Variant/Date',而不是原生VBA'Date'。 OP想与本地变量:) –

回答

2

不幸的是,不。从Excel中取值为Variant s。时,取单细胞,则可以直接将其转换为适当的类型,即

Dim x as Long 
x = myCell.Value 

在上面的代码中,第一个myCell.Value被取出作为Variant,然后通过VBA转换为长(执行分配)如果转换是可能的,否则运行时错误。

对于多单元格范围,它更棘手。 range.value返回变体阵列。不幸的是,VBA不提供将Variant数组自动转换为类型数组。因此,下列不会工作:

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. 
+2

谢谢A.S.H.通过元素循环遍历变体元素并使用cDate按元素创建Date数组元素似乎是唯一的方法。我当然希望避免从Excel中读取元素,因此它将以VBA作为正确的类型。质量读取和逐元素转换感觉可能会更快。 – farmerandy

+0

@farmerandy:你是对的。将变体数组REDIM到正确的大小,然后从Range的** Value2 **属性中分配给它。我发现这比单元处理速度快许多倍,写入范围时速度提高了30倍。 –

+0

@farmerandy我同意,我没有看到另一种方式,而不是一个循环转换为一个类型数组。无论是否有益取决于随后的代码 - 肯定是的,如果大量的计算与类型变量将遵循。不要忘记在转换完成后摆脱变量数组以节省空间。像'Redim theVariantArray(0)'。 –