根据此answer,在将单元格中的值分配给代码中的变量时,应始终使用Variant
。它是否正确?我似乎记得在其他地方读过,不加区分地使用Variant
不是一个好习惯。
答案 0 :(得分:9)
您可以将单元格值读取为您想要的任何类型,VBA将(尝试)将其隐式转换为该类型。
本网站上有许多问题涉及从读取单元格值到特定数据类型而产生的运行时错误 - 也许您之前看到过此错误消息?
类型不匹配
当您尝试将包含错误值(例如varExcelHoja.HPageBreaks.Add(varExcelHoja.Range["A42"]);
)的单元格读入除<{1}}以外的任何时,您会收到错误。< / p>
因此,如果您将单元格值读入#REF!
,只要您正在阅读VBA可以强制转换为该数据类型的内容,一切都将正常运行 。问题是,数据永远不会100%干净,工作表做分解,用户删除列和破坏公式,查找失败,编写公式的人没有打包它与Variant
等
这就是将单元格值读入Double
的原因。
这并不代表你工作 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)
。由于您喜欢明确的类型转换,因此您可以使用VBA的转换函数来明确转换 - 此处为Variant
。
现在,在实际代码中,您可能不会费心将其读入String
- 您可以使用CStr
来测试单元格值:
Variant
这里的另一面是您要两次访问该单元格。将它读成IsError
是否更好,由你来决定;在性能方面,通常最好避免尽可能多地访问范围。
答案 1 :(得分:5)
根据documentation,您从某个单元格(Range
)获得的值为Variant
:
Range.Value属性(Excel)
返回或设置 Variant 值,该值表示指定范围的值。
由于Variant
可以表示不同的数据类型,因此如果要将单元格的值分配给 - 例如 - String
类型的变量,则可以松散信息。
Variant
中存在数据类型信息这一事实已经意味着您丢失了这类信息。例如,如果原始类型是数字并且您将其存储在String
变量中,则无法从该字符串值知道原始数据类型是什么。您也可能会丢失精度(例如,Date
毫秒)。
此外,Variant
类型值不能始终转换为变量的数据类型,因此您可以获得Type mismatch error。实际上,这通常发生在Error
子数据类型中。
只有当您事先知道某个单元格的数据类型是什么时,最好在该数据类型中定义您的接收变量。
答案 2 :(得分:2)
没有严格回答你的问题,但我认为无论如何我都会添加这个以供参考。
使用本机Excel函数,您通常可以直接向函数提供范围对象或值。例如,您可以撰写=AVERAGE(A1,A2,A3)
或=AVERAGE(10,20,30)
。如果要对任何用户定义的函数执行类似的操作,则需要检查传递给函数的对象类型:
Function test(input As Variant)
Dim var As Variant
If TypeName(input) = "Range" Then
var = input.Value
Else
var = input
End If
如果您的函数可以接受它们,您可能还想检查其他对象,但这样做会使您的函数更像用户期望的行为。