6 Stimmen

Prüfen auf den Variantenwert "Nichts"

Das ist etwas, das ich letztes Jahr erlebt habe, und SO scheint ein guter Ort zu sein, um es zu dokumentieren :)

F: Wenn ich Excel (/Word/...) von Delphi aus automatisiere, wie kann ich überprüfen, ob eine Excel-Funktion die Variante Nothing (wie es in VBA genannt wird)?

10voto

Rob Kennedy Punkte 158781

En VarIsClear Funktion umfasst Ihre Situation, in der der Typ varDispatch und der Wert ist nil . Dazu gehören auch leere und "unbekannte" Werte sowie benutzerdefinierte Variantentypen. Ich sehe es in meinem Delphi 2005-Quellcode; ich weiß nicht, wie viel früher es enthalten war.

4voto

onnodb Punkte 5223

Seltsamerweise ist VBAs Nothing es no dasselbe wie Unassigned , Null o Empty Sie können also z.B. nicht verwenden:

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

Verwenden Sie stattdessen diese Funktion:

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

// ...

if (VarIsNothing(MyRange)) then

Update

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

Beachten Sie auch, dass VBAs Nothing ist wahrscheinlich ein ganz besonderer Fall; ich glaube nicht, dass man ihn bei der Automatisierung allzu oft antrifft.

2voto

Craig Stuntz Punkte 124703

Tut VarIsEmpty (anders als VarIsNull) nicht das, was Sie wollen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X