2009-02-23 7 views
5

Esto es algo que me encontré con el año pasado, y así parece un buen lugar para documentarla :)Comprobación para el valor "nada" Variante

Q: Al automatizar Excel (/ Palabra/...) a partir de Delphi, ¿cómo puedo verificar si una función de Excel devolvió la variante Nothing (como se llama en VBA)?

Respuesta

8

La función VarIsClear incluye su situación donde el tipo es varDispatch y el valor es nil. También incluye valores vacíos y "desconocidos" y tipos de variantes personalizados. Lo veo en mi fuente Delphi 2005; No sé cuánto antes estaba incluido.

+0

?! ¡Tienes razón! ¡Lo pasé completamente por alto! He aceptado tu respuesta y cambiaré mi código fuente ;-) ¡Muchas gracias! – onnodb

4

Curiosamente, VBA de Nothing es no lo mismo que Unassigned, Null o Empty, por lo que no se puede utilizar, por ejemplo:

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

su lugar, utilice esta función:

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

// ... 

if (VarIsNothing(MyRange)) then 

Actualización

Al parecer, las fuentes de la unidad RTL Variants.pas han cambiado entre Delphi 5 y 2007. De acuerdo con @mghie (ver comentarios), la función VarIsEmpty hubieran hecho el trabajo en D5. Sin embargo, en D2007, este ya no parece ser el caso, por lo que probablemente necesitará la función anterior nuevamente.

Además, tenga en cuenta que Nothing de VBA es probablemente un caso bastante especial; No creo que uno lo encuentre con demasiada frecuencia con la automatización.

+0

@onnodb: Si reemplaza "(MyRange = Null)" con "VarIsNull (MyRange) o VarIsEmpty (MyRange)" funciona, sugeriría cortésmente aceptar la respuesta de Craig. No es necesario escribir funciones personalizadas para cosas que ya están en la biblioteca y documentadas. – mghie

+0

@mghie: Estoy bastante seguro de que esos * no * funcionan con ese molesto valor 'Nothing' :) – onnodb

+0

@onnodb: Bueno, eche un vistazo al código fuente de VarIsEmpty() - es un superconjunto de su código, al menos en la versión de Delphi 5 que estoy viendo en este momento ... – mghie

2

¿VarIsEmpty (diferente de VarIsNull) no hace lo que usted quiere?

+0

Quizás sea problemático que VarIsEmpty no maneje varErrors devuelto por Excel. –

+0

No, estoy bastante seguro de que "Empty" es algo bastante diferente de "Nothing" --- este último no parece tener * ningún * equivalente en Delphi. (Podría estar equivocado, por supuesto, pero estoy bastante seguro de que lo he comprobado). ¡Gracias, sin embargo! – onnodb

Cuestiones relacionadas