2009-02-23 144 views
5

這是我碰到了,去年和SO似乎是一個好地方,記錄它:)檢查的變量值「無」

問:從當自動化Excel(/字/ ...) Delphi,如何檢查Excel函數是否返回了變量Nothing(因爲它在VBA中調用)?

回答

8

VarIsClear函數包括您的情況,其中類型爲varDispatch,值爲nil。它還包含空值和「未知」值以及自定義變體類型。我在Delphi 2005的源代碼中看到它;我不知道它被包括在內多少。

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 

更新

顯然,德爾福5和2007之間的RTL單元Variants.pas的來源已經發生了變化。根據@mghie(參見注釋),函數VarIsEmpty將在D5中完成這項工作。然而,在D2007中,這似乎不再是這種情況了,所以你可能會再次需要上述功能。

此外,請注意,VBA的Nothing可能是一個相當特殊的情況;我不認爲用自動化經常遇到它。

+0

@onnodb:如果用「VarIsNull(MyRange)」或「VarIsEmpty(MyRange)」代替「(MyRange = Null)」,我會禮貌地建議接受Craig的答案。無需爲已存在於庫中並記錄的內容編寫自定義函數。 – mghie 2009-02-23 15:39:34

+0

@mghie:我很肯定那些做*不*與那討厭的`沒有`價值:) – onnodb 2009-02-23 16:27:33

+0

@onnodb:看看VarIsEmpty()的源代碼 - 它是你的代碼的超集,至少在我現在看到的德爾福5版本中...... – mghie 2009-02-23 16:49:13

2

VarIsEmpty(與VarIsNull不同)不是做你想做的?