这是我去年遇到的事情,而且似乎是一个记录它的好地方:)
问:从Delphi自动化Excel(/ Word / ...)时,如何检查Excel函数是否返回变量Nothing
(在VBA中调用)?
答案 0 :(得分:9)
VarIsClear
功能包括类型为varDispatch
且值为nil
的情况。它还包括空和“未知”值以及自定义变体类型。我在Delphi 2005源代码中看到了它;我不知道早些时候包括多少。
答案 1 :(得分:4)
奇怪的是,VBA的Nothing
不与Unassigned
,Null
或Empty
相同,因此您无法使用,例如:
// Worksheet is a TExcelWorksheet or OleVariant coupled to an open worksheet
MyRange := Worksheet.Range['MyRangeInTheWorksheet', EmptyParam]
if (MyRange = Null) then // won't work!
MsgBox('The range doesn''t exist!');
相反,请使用此功能:
function VarIsNothing(V: OleVariant): Boolean;
begin
Result :=
(TVarData(V).VType = varDispatch)
and
(TVarData(V).VDispatch = nil);
end;
// ...
if (VarIsNothing(MyRange)) then
<强>更新强>
显然,在Delphi 5和2007之间,RTL单元Variants.pas
的来源发生了变化。根据@mghie(见注释),函数VarIsEmpty
将完成D5中的工作。但是,在D2007中,情况似乎不再如此,所以您可能需要再次使用上述功能。
另外,请注意VBA的Nothing
可能是一个特例;我不认为人们经常会遇到自动化。
答案 2 :(得分:2)
VarIsEmpty(与VarIsNull不同)不能做你想要的吗?