分配给范围会忽略所分配的数据类型 - 解决方法?

时间:2014-06-11 20:33:22

标签: excel vba excel-vba

如果我有一个变量数组(也就是说,元素可以是各种类型)并将数组赋值给Range.Value(或Range.Formula的常量)属性,则Excel会自动将传递的值转换为' “best-guess”类型基于目标单元格的NumberFormat。

例如,在下面所有'存储为字符串的'数字'(有意)将被转换为数字类型,如果它们被分配给具有“常规”数字格式的单元格。

Sub foo()

    Selection.Value = Array( _
        100, _
        "100", _
        "A Cat", _
        "2012-05-02", _
        "36.4")

End Sub

换句话说,Range.Value = Range.Value执行不往返,因为在返回Range.Value的任务中忽略了被分配的数据中的类型信息,只有Range.NumberFormat控制其解释。

有什么好的解决方法可以预防或处理这个问题吗?

我能想到的唯一一个是遍历数组,测试它是否是一个字符串,如果是,则在前面添加一个撇号。这有一个不可取的撇号实际存在于工作簿中的副作用(尽管 Excel 本身为了Range.Value等目的而忽略了它)。 (据我所知)不可能将数字格式分配给基于单元格的单元格(否则可以准备一个具有数据格式的数组,以“预加载”具有正确数字格式的单元格)

我经常使用数组和集合来大大提高数据处理的性能,但我希望在最终抽出数据时保留数据类型。

1 个答案:

答案 0 :(得分:1)

你可以通过在任何文本值前放置一个撇号来解决这个问题:

Sub foo()

    Selection.Value = Array( _
        100, _
        "'100", _
        "A Cat", _
        "'2012-05-02", _
        "'36.4")

End Sub