我在Excel中有一个名为StartDates的命名范围。命名范围仅包含日期。示例代码如下:
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<div class="chart">
<table class="table">
<tr>
<td>1</td>
<td>3</td>
<td>5</td>
<td>7</td>
<td>9</td>
<td>11</td>
<td>13</td>
<td>15</td>
<td>17</td>
<td>19</td>
<td>21</td>
<td>23</td>
<td>25</td>
<td>27</td>
<td>29</td>
</tr>
<tr>
<td>2</td>
<td>4</td>
<td>6</td>
<td>8</td>
<td>10</td>
<td>12</td>
<td>14</td>
<td>16</td>
<td>18</td>
<td>20</td>
<td>22</td>
<td>24</td>
<td>26</td>
<td>28</td>
<td>30</td>
<img class="img" src="images/triangle.png" alt="triangle" />
</tr>
</table>
</div>
这总是导致众所周知的运行时错误&#39; 13&#39;:类型不匹配。
一个简单的改变,它工作正常。
Sub test2()
Dim dat_readdates() As Date
dat_readdates = Range("StartDates").Value
End Sub
是否存在必须以变体数据类型读入数据的已知规则?显然,对于速度,我想使用最适合于正在读取的数据的数据类型。 我是否需要将其作为变体读取,然后使用cDate转换为日期类型的另一个变量?我可以进行大规模转换,例如:
Sub test2()
Dim var_readdates() As Variant
var_readdates = Range("StartDates").Value
End Sub
答案 0 :(得分:2)
不,不幸的是。值以Variant
的形式从Excel中提取。获取单个单元格时,可以直接将其转换为适当的类型,即
Dim x as Long
x = myCell.Value
在上面的代码中,第一个myCell.Value
被提取为Variant
,然后由VBA转换为long(以执行赋值),如果转换是可能的,否则运行时错误。
对于多细胞范围,它更棘手。 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.