检查变量值是否为“Nothing”

6

去年我遇到了这个问题,感觉在SO上记录一下是一个不错的选择 :)

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

3个回答

10

VarIsClear函数包括类型为varDispatch且值为nil的情况。它还包括空值和“未知”值以及自定义变量类型。我在我的Delphi 2005源代码中看到了它;我不知道它在多早之前就被包含进去了。


你说得对!我完全忽略了那个问题!我已经接受了你的答案,并将更改我的源代码;-) 非常感谢! - onnodb

4

有趣的是,VBA中的NothingUnassignedNullEmpty不同,因此您不能使用以下代码:

// 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可能是一个非常特殊的情况;我认为在自动化过程中很少遇到它。


@onnodb:如果将“(MyRange = Null)”替换为“VarIsNull(MyRange)或VarIsEmpty(MyRange)”,那么我建议您礼貌地接受Craig的答案。没有必要为已经在库中并且有文档记录的东西编写自定义函数。 - mghie
@mghie:我非常确定它们不能与那个讨厌的“Nothing”值一起使用 :) - onnodb
@onnodb:好的,请看一下VarIsEmpty()的源代码——至少在我现在查看的Delphi 5版本中,它是你代码的超集... - mghie
@mghie:好奇……我的D2007源代码上写着 Result := FindVarData(V)^.VType = varEmpty;,绝对是其他意思……是吗? - onnodb
@onnodb: 的确。Delphi 5 执行了您的函数,但还会检查 varEmpty 和 varUnknown。不过,我怀疑如果这样做会导致行为变化,这种更改是否会被接受。或许这只是我过于理想化了? - mghie
@mghie:是的,这很奇怪,但却是真的。在我的D2007 Variants.pas源代码中,上一个评论中的那一行是“VarIsEmpty”函数中唯一的一行。 - onnodb

2
VarIsEmpty(不同于VarIsNull)是否不能满足您的需求?

可能存在问题的是,VarIsEmpty无法处理Excel返回的varErrors。 - Lieven Keersmaekers
不,我非常确定EmptyNothing是完全不同的东西 - 后者似乎在Delphi中没有任何等价物。 (我可能是错的,但我很确定我检查过了)。不过还是谢谢! - onnodb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接