去年我遇到了这个问题,感觉在SO上记录一下是一个不错的选择 :)
问题:在Delphi中自动化Excel(/Word/...)时,如何检查Excel函数是否返回了变量Nothing
(在VBA中称为)?
去年我遇到了这个问题,感觉在SO上记录一下是一个不错的选择 :)
问题:在Delphi中自动化Excel(/Word/...)时,如何检查Excel函数是否返回了变量Nothing
(在VBA中称为)?
VarIsClear
函数包括类型为varDispatch
且值为nil
的情况。它还包括空值和“未知”值以及自定义变量类型。我在我的Delphi 2005源代码中看到了它;我不知道它在多早之前就被包含进去了。
有趣的是,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(请参见评论),在D5中函数VarIsEmpty
可以胜任。然而,在D2007中,这似乎不再是这种情况,因此您可能需要再次使用上述函数。
另外,请注意,VBA的Nothing
可能是一个非常特殊的情况;我认为在自动化过程中很少遇到它。
Result := FindVarData(V)^.VType = varEmpty;
,绝对是其他意思……是吗? - onnodbEmpty
与Nothing
是完全不同的东西 - 后者似乎在Delphi中没有任何等价物。 (我可能是错的,但我很确定我检查过了)。不过还是谢谢! - onnodb