命名范围的数据类型

时间:2017-05-04 01:06:57

标签: vba excel-vba date variant excel

我在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

1 个答案:

答案 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.