2009-02-23 17 views
5

Questo è qualcosa che ho incontrato l'anno scorso, e sembra così come un buon posto per documentarlo :)Controllo per la variante valore di "Nothing"

D: Quando si automatizza Excel (/ Word/...) da Delphi, come posso verificare se una funzione di Excel ha restituito la variante Nothing (come viene chiamata in VBA)?

risposta

8

La funzione VarIsClear include la situazione in cui il tipo è varDispatch e il valore è nil. Include anche valori vuoti e "sconosciuti" e tipi di varianti personalizzati. Lo vedo nella mia fonte Delphi 2005; Non so quanto tempo prima fosse incluso.

+0

?! Hai ragione! Ho completamente trascurato quello! Ho accettato la tua risposta e cambierò il mio codice sorgente ;-) Grazie mille! – onnodb

4

Curiosamente, VBA di Nothing è non la stessa Unassigned, Null o Empty, quindi non è possibile utilizzare, ad esempio:

// 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!'); 

Invece, utilizzare questa funzione:

function VarIsNothing(V: OleVariant): Boolean; 
begin 
    Result := 
    (TVarData(V).VType = varDispatch) 
    and 
    (TVarData(V).VDispatch = nil); 
end; 

// ... 

if (VarIsNothing(MyRange)) then 

Aggiornamento

Apparentemente, le origini dell'unità RTL Variants.pas sono cambiate tra Delphi 5 e 2007. Secondo @mghie (vedi commenti), la funzione VarIsEmpty avrebbe svolto il lavoro in D5. Tuttavia, in D2007, questo non sembra essere più il caso, quindi probabilmente avrai di nuovo bisogno della funzione precedente.

Inoltre, si noti che il numero Nothing di VBA è probabilmente un caso particolare; Non penso che lo si incontri troppo spesso con l'automazione.

+0

@onnodb: Se si sostituisce "(MyRange = Null)" con "VarIsNull (MyRange) o VarIsEmpty (MyRange)", suggerirei cortesemente di accettare la risposta di Craig. Non è necessario scrivere funzioni personalizzate per elementi già presenti nella libreria e documentati. – mghie

+0

@mghie: sono abbastanza sicuro che quelli * non * lavorano con quel fastidioso valore 'Nothing' :) – onnodb

+0

@onnodb: Bene, dai un'occhiata al codice sorgente di VarIsEmpty() - è un superset del tuo codice, almeno nella versione Delphi 5 che sto guardando in questo momento ... – mghie

2

VarIsEmpty (diverso da VarIsNull) non fa ciò che vuoi?

+0

Forse problematico è che VarIsEmpty non gestisce varErrors restituiti da Excel. –

+0

No, sono abbastanza sicuro che 'Empty' è qualcosa di diverso da' Nothing' --- quest'ultimo non sembra avere * alcun * equivalente in Delphi. (Potrei sbagliarmi, ovviamente, ma sono abbastanza sicuro di averlo controllato). Grazie comunque! – onnodb