2009-02-23 14 views
5

To jest coś wpadłem na ostatnim roku, i tak wydaje się to dobre miejsce, aby udokumentować :)Sprawdzanie wartości wariant „nic”

Q: Kiedy automatyzację Excel (/ Word/...) z Delphi, w jaki sposób mogę sprawdzić, czy funkcja Excel zwróciła wariant Nothing (jak to się nazywa w VBA)?

Odpowiedz

8

Funkcja VarIsClear zawiera sytuację, w której typ to varDispatch, a wartość to nil. Obejmuje również puste i "nieznane" wartości oraz niestandardowe typy wariantów. Widzę to w moim źródle Delphi 2005; Nie wiem, ile wcześniej zostało to uwzględnione.

+0

?! Masz rację! Całkowicie przeoczyłem to! Zaakceptowałem twoją odpowiedź i zmienię swój kod źródłowy ;-) Dziękuję! – onnodb

4

ciekawe, VBA na Nothing jest nie taka sama jak Unassigned, Null lub Empty, więc nie można użyć, na przykład:

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

Zamiast korzystać z tej funkcji:

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

// ... 

if (VarIsNothing(MyRange)) then 

Aktualizacja

Wygląda na to, że źródła jednostki RTL Variants.pas zmieniły się między Delphi 5 i 2007. Według @mghie (patrz komentarze), funkcja VarIsEmpty wykonałaby zadanie w D5. Jednak w D2007 nie wydaje się, aby tak było, więc prawdopodobnie będziesz potrzebować ponownie powyższej funkcji.

Należy również zauważyć, że VBA to Nothing jest prawdopodobnie dość szczególnym przypadkiem; Nie wydaje mi się, że zbyt często spotyka się to z automatyzacją.

+0

@onnodb: Jeśli zastąpi "(MyRange = Null)" z "VarIsNull (MyRange) lub VarIsEmpty (MyRange)" działa, grzecznie zasugeruję przyjęcie odpowiedzi Craiga. Nie trzeba pisać niestandardowych funkcji dla rzeczy, które są już w bibliotece i udokumentowane. – mghie

+0

@mghie: Jestem prawie pewny, że ci * nie * pracują z tą nieznośną 'Nic' wartością :) – onnodb

+0

@onnodb: Cóż, spójrz na kod źródłowy VarIsEmpty() - jest to nadzbiór twojego kodu, przynajmniej w wersji Delphi 5 teraz patrzę ... – mghie

2

Czy VarIsEmpty (inny niż VarIsNull) nie robi, co chcesz?

+0

Być może problematyczne jest to, że VarIsEmpty nie obsługuje varErrors zwróconych przez Excel. –

+0

Nie, jestem prawie pewna, że ​​"Pusty" jest czymś zupełnie innym niż "Nic" --- ten ostatni nie ma * żadnego * odpowiednika w Delphi. (Oczywiście mogę się mylić, ale jestem pewien, że to sprawdziłem). W każdym razie dzięki! – onnodb