从Excel中的单元格读取值时要使用的VBA变量类型?

par*_*ime 3 excel vba excel-vba

根据这个答案,Variant在将单元格中的值分配给代码中的变量时,应始终使用.它是否正确?我似乎记得在其他地方读过,Variant不分青红皂白地使用并不是一个好习惯.

Mat*_*don 9

您可以将单元格值读入所需的任何类型,VBA将(尝试)将其隐式转换为该类型.

这个网站上有很多问题涉及从读取单元格值到特定数据类型而引发的运行时错误 - 也许您以前看过这个错误消息?

类型不匹配

当您尝试将包含错误值(例如#REF!)的单元格读入除a以外的任何其他内容时,这是您得到的错误Variant.

因此,如果您将单元格值读入a Double,那么只要您正在阅读VBA可以强制进入该数据类型的内容,一切都会正常工作.问题是,数据永远不会100%干净,工作表破坏,用户删除列并破坏公式,查找失败,编写公式的人也不会打扰它IFERROR等等.

这就是你单元格值入的原因Variant.

这并不意味着你的工作Variant.

Dim cellValue As Variant
cellValue = someRange.Value

If IsError(cellValue) Then Exit Sub 'bail out before we blow up

Dim workingValue As String
workingValue = CStr(cellValue)
Run Code Online (Sandbox Code Playgroud)

通过分配到另一种数据类型,您可以有效地Variant到更具体的类型-这里String.而且因为您喜欢显式类型转换,所以您可以使用VBA的转换函数来显式转换 - 此处CStr.

现在,在实际代码中,您可能甚至不愿意将其读入Variant- 您可以使用它IsError来测试单元格值:

If IsError(someRange.Value) Then Exit Sub 'bail out before we blow up

Dim cellValue As String
cellValue = someRange.Value ' or cellValue = CStr(someRange.Value)
Run Code Online (Sandbox Code Playgroud)

这里的另一面是您正在访问该单元两次.将它读成a Variant是否更好是由你决定的; 在性能方面,通常最好尽可能避免访问范围.


tri*_*cot 5

您从单元格(即a Range)获得的值是Variant根据文档:

Range.Value属性(Excel)

返回或设置Variant值,该值表示指定范围的值.

由于a Variant表示不同的数据类型,如果要将单元格的值分配给 - 例如 - 类型的变量,则可能会丢失信息String.

仅仅存在数据类型信息的事实Variant意味着您丢失了这种类型的信息.例如,如果原始类型是数字并且您将其存储在String变量中,则无法从该字符串值知道原始数据类型是什么.您也可能会丢失精度(Date例如,以毫秒为单位).

此外,Variant类型值不能始终转换为变量的数据类型,因此您可能会遇到类型不匹配错误.实际上,这通常发生在Error子数据类型中.

只有当您事先知道某个单元格的数据类型是什么时,才能在该数据类型中定义接收变量.