gpt4 book ai didi

excel - 基本 VBA 问题(整数)

转载 作者:行者123 更新时间:2023-12-04 21:30:35 25 4
gpt4 key购买 nike

Sub CommandButton1_Click()
Dim x As Integer
x = 6
Range("A1").Value = x
End Sub

这意味着您分配 X作为整数,你说 x 等于 6。
然后将值 x(=6) 放入单元格“A1”中。
Sub CommandButton1_Click()
Dim x As Double
x = 6
Range("A1").Value = x
End Sub

但为什么第二个也有效?

最佳答案

TL;DR: 类型转换。
Range.ValueVariant ,这是一种特殊的数据类型,它存储指向值的指针以及数据类型的描述:这就是单元格如何容纳 Double , 一个 String , 一个 Boolean ,或 Error值(value)。

任何比这更深的东西都与手头的问题无关。
Integer是一个 16 位有符号整数类型,可以轻松放入 Double , 远大于 16 位。如果您关注 .Value分配这个:

Debug.Print TypeName(Range("A1").Value)

你会得到 Double在调试输出中。
Range.Value 的执行中的某处属性,对提供的值进行验证,如果该值是可接受的,它会在内部以适当的数据类型存储。如果该值不是可接受的数据类型,则会引发错误 1004。 Integer作为一个很好的数值,一切都很好。

在第二个片段中发生了完全相同的事情: Double作为一个很好的数值,一切都很好。由于从单元格中获取的任何数值都是 Variant/Double ,我们可以合理地推断出 Range 内部的某处, 数值存储为 Double - 不过,这很可能只是 Range.Value 的 getter 的实现细节。属性被执行。

VBA 旨在处理一组特定的数据类型,并且 VBA 主机应用程序(例如 Excel)的类型库旨在接受这些数据类型。因此,您必须非常努力地提供 Range.Value使用 VBA 代码无法处理的值。

但在值甚至达到 Range.Value 之前属性,在第二个片段中已经发生了隐式类型转换。
Dim x As Integer
x = 6

这里 6是一个整数文字。当 VBA 执行 x = 6指令, 6已经有一个数据类型 - 并且该数据类型是 Integer .
Dim x As Double
x = 6

这里 6也是一个整数文字,但它被分配给 Double ,这不是同一类型:发生隐式类型转换,并且 x高兴地接过 Integer值(value) - 因为转换正在扩大。

现在考虑:
Dim x As Double
x = 6#

这里 6#使用类型提示。 Debug.Print TypeName(6#)打印 Double : 那 6#Double文字 - 这里不发生类型转换。但它很丑。
Dim x As Double
x = CDbl(6)

现在扩大类型转换是明确的。

当隐式转换正在缩小,并且值不适合所需的数据类型时......
Dim x As Integer
x = 32768 '<~ that's a Long integer literal: doesn't fit the 16 bits of an Integer

...然后引发运行时错误 6(“溢出”)。由于每个 VBA 数字数据类型都可以安全地转换为 Double ,可以由 VBA 代码提供的每个数值都可以分配给 Range.Value .

关于excel - 基本 VBA 问题(整数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53487065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com