您可以将单元格值读入所需的任何类型,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是否更好是由你决定的; 在性能方面,通常最好尽可能避免访问范围.
您从单元格(即a Range)获得的值是Variant根据文档:
Range.Value属性(Excel)
返回或设置Variant值,该值表示指定范围的值.
由于a Variant表示不同的数据类型,如果要将单元格的值分配给 - 例如 - 类型的变量,则可能会丢失信息String.
仅仅存在数据类型信息的事实Variant意味着您丢失了这种类型的信息.例如,如果原始类型是数字并且您将其存储在String变量中,则无法从该字符串值知道原始数据类型是什么.您也可能会丢失精度(Date例如,以毫秒为单位).
此外,Variant类型值不能始终转换为变量的数据类型,因此您可能会遇到类型不匹配错误.实际上,这通常发生在Error子数据类型中.
只有当您事先知道某个单元格的数据类型是什么时,才能在该数据类型中定义接收变量.