2009-02-23 8 views
5

Das ist etwas, was ich in den letzten Jahr lief, und scheint so wie ein guter Ort, um es zu dokumentieren :)Überprüfung für den Variant-Wert „Nothing“

Q: Wenn Excel zu automatisieren (/ Word/...) aus Delphi, wie kann ich überprüfen, ob eine Excel-Funktion die Variante Nothing (wie in VBA genannt) zurückgibt?

Antwort

8

Die VarIsClear-Funktion umfasst Ihre Situation, in der der Typ varDispatch ist und der Wert ist. Es enthält auch leere und "unbekannte" Werte sowie benutzerdefinierte Variantentypen. Ich sehe es in meiner Quelle Delphi 2005; Ich weiß nicht, wie viel früher es enthalten war.

+0

?! Du hast recht! Das habe ich komplett übersehen! Ich habe deine Antwort akzeptiert und werde meinen Quellcode ändern ;-) Vielen Dank! – onnodb

4

Merkwürdiger, VBA Nothing ist nicht die gleiche wie Unassigned, Null oder Empty, so dass Sie nicht, zum Beispiel verwenden können:

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

Stattdessen verwenden diese Funktion:

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

// ... 

if (VarIsNothing(MyRange)) then 

Aktualisieren

Anscheinend haben sich die Quellen der RTL-Einheit Variants.pas zwischen Delphi 5 und 2007 geändert. Laut @mghie (siehe Kommentare) hätte die Funktion VarIsEmpty die Aufgabe in D5 erledigt. In D2007 scheint dies jedoch nicht mehr der Fall zu sein, so dass Sie die obige Funktion wahrscheinlich erneut benötigen.

Beachten Sie auch, dass VBA Nothing ist wahrscheinlich ein ganz besonderer Fall; Ich denke nicht, dass man es zu oft mit Automatisierung konfrontiert.

+0

@onnodb: Wenn das Ersetzen von "(MyRange = Null)" mit "VarIsNull (MyRange) oder VarIsEmpty (MyRange)" funktioniert, würde ich höflich vorschlagen, Craigs Antwort zu akzeptieren. Keine Notwendigkeit, benutzerdefinierte Funktionen für Dinge zu schreiben, die bereits in der Bibliothek vorhanden und dokumentiert sind. – mghie

+0

@mghie: Ich bin ziemlich sicher, dass diese * nicht * mit diesem lästigen 'Nothing'-Wert arbeiten :) – onnodb

+0

@onnodb: Nun, schau dir den Quellcode von VarIsEmpty() an - es ist eine Obermenge deines Codes, zumindest in der Delphi-5-Version ich suche jetzt bei ... – mghie

2

Does VarIsEmpty (anders als VarIsNull) nicht tun, was Sie wollen?

+0

Möglicherweise problematisch ist, dass VarIsEmpty varErrors nicht behandelt, die von Excel zurückgegeben werden. –

+0

Nein, ich bin ziemlich sicher, dass 'Empty' etwas ganz anderes ist als' Nothing' - das letztere scheint in Delphi kein * Äquivalent * zu haben. (Ich könnte natürlich falsch liegen, aber ich bin mir ziemlich sicher, dass ich das überprüft habe). Trotzdem danke! – onnodb

Verwandte Themen