VBA基本问题(整数)

时间:2018-11-26 18:32:42

标签: excel vba excel-vba

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

但是第二个为什么也起作用?

2 个答案:

答案 0 :(得分:4)

TL; DR:类型转换。


Range.ValueVariant,这是一种特殊的数据类型,它存储指向值的指针以及对该数据类型的描述:这是单元格可以容纳{{1}的方式},DoubleStringBoolean值。

任何比这更深的内容都与眼前的问题无关。

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中的所有工作表编号都存储为双精度”

Excel VBA internal data format and memory storage