Sub CommandButton1_Click()
Dim x As Integer
x = 6
Range("A1").Value = x
End Sub
这意味着您将X
分配为Integer,并且说x等于6。
然后将值x(= 6)放在单元格“ A1”中。
Sub CommandButton1_Click()
Dim x As Double
x = 6
Range("A1").Value = x
End Sub
但是第二个为什么也起作用?
答案 0 :(得分:4)
TL; DR:类型转换。
Range.Value
是Variant
,这是一种特殊的数据类型,它存储指向值的指针以及对该数据类型的描述:这是单元格可以容纳{{1}的方式},Double
,String
或Boolean
值。
任何比这更深的内容都与眼前的问题无关。
Error
是一种16位带符号整数类型,可以很容易地放入Integer
中,该{> 1远远大于16位。如果您在Double
作业中执行以下操作:
.Value
您将在调试输出中得到Debug.Print TypeName(Range("A1").Value)
。
在Double
属性的实现中,对提供的值进行验证,如果该值可接受,则将其内部存储在适当的数据类型中。如果该值不是可接受的数据类型,则会引发错误1004。 Range.Value
是一个很好的数值,一切都很好。
第二个片段中发生了完全相同的事情:Integer
是一个很好的数值,一切都很好。而且,由于从单元格获取的任何数值都是Double
,因此我们可以合理地推断出,在Variant/Double
的内部胆量中,数值存储为Range
-尽管,只需详细说明Double
属性的 getter 的实现方式即可。
VBA被设计为可以处理一组特定的数据类型,而VBA主机应用程序的类型库(例如Excel)被设计为可以接受这些数据类型。因此,您将不得不非常努力地使用VBA代码为Range.Value
赋予它无法处理的值。
但是在该值甚至没有达到Range.Value
属性之前,第二个代码段中就发生了隐式类型转换。
Range.Value
此处Dim x As Integer
x = 6
是一个整数文字。当VBA执行6
指令时,该x = 6
已经具有数据类型-并且该数据类型为6
。
Integer
这里Dim x As Double
x = 6
也是一个整数文字,但它被分配给一个不相同类型的6
:发生隐式类型转换,而Double
高兴地接受{ {1}}值-因为转化是扩大。
现在考虑:
x
此处Integer
使用类型提示。 Dim x As Double
x = 6#
打印6#
:Debug.Print TypeName(6#)
是Double
文字-这里没有类型转换。但这很丑。
6#
现在加宽类型转换是显式的。
当隐式转换是缩小时,并且该值不能适合所需的数据类型...
Double
...然后引发运行时错误6(“溢出”)。由于可以将每种VBA数字数据类型安全地转换为Dim x As Double
x = CDbl(6)
,因此可以将VBA代码可以提供的每个数字值分配给Dim x As Integer
x = 32768 '<~ that's a Long integer literal: doesn't fit the 16 bits of an Integer
。
答案 1 :(得分:0)
内部,Excel不使用整数。单元格是四种类型之一:
请注意,这意味着所有数字都是双精度数字。
请参阅以下参考文献:
Data types used by Excel-“ Excel中的所有工作表编号都存储为双精度”