Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 指定给范围会忽略指定的数据类型-变通方法?_Vba_Excel - Fatal编程技术网

Vba 指定给范围会忽略指定的数据类型-变通方法?

Vba 指定给范围会忽略指定的数据类型-变通方法?,vba,excel,Vba,Excel,如果我有一个变量数组(即,元素可以是各种类型),并将数组分配给Range.Value(或constants to Range.Formula)属性,那么Excel将根据目标单元格的NumberFormat自动将传递的值转换为“最佳猜测”类型 例如,在下面的示例中,如果将所有“存储为字符串的数字”(有意)分配给具有“常规”数字格式的单元格,则它们将转换为数字类型 Sub foo() Selection.Value = Array( _ 100, _ "10

如果我有一个变量数组(即,元素可以是各种类型),并将数组分配给Range.Value(或constants to Range.Formula)属性,那么Excel将根据目标单元格的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控制其解释

有什么好的解决办法来防止或处理这种情况吗

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


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

您可以通过在任何文本值前面加一个撇号来解决这个问题:

Sub foo()

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

End Sub

谢谢-这是一个解决方法,尽管这也是我的第一个想法(“我唯一能想到的是遍历数组,测试它是否是字符串,如果是,在前面添加一个撇号”)。也许这是唯一的解决办法。