检查Variant值“Nothing”

时间:2009-02-23 15:02:03

标签: delphi excel automation ms-office

这是我去年遇到的事情,而且似乎是一个记录它的好地方:)

问:从Delphi自动化Excel(/ Word / ...)时,如何检查Excel函数是否返回变量Nothing(在VBA中调用)?

3 个答案:

答案 0 :(得分:9)

VarIsClear功能包括类型为varDispatch且值为nil的情况。它还包括空和“未知”值以及自定义变体类型。我在Delphi 2005源代码中看到了它;我不知道早些时候包括多少。

答案 1 :(得分:4)

奇怪的是,VBA的Nothing UnassignedNullEmpty相同,因此您无法使用,例如:

// 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不同)不能做你想要的吗?