Excel complemento - Delphi equivilente a VB
-
27-10-2019 - |
Pregunta
Estoy portando un complemento de Excel de Visual VB a Delphi 2006. La mayor parte está funcionando pero estoy atrapado en estas dos líneas VB:
oXL.Selection.QueryTable
oXL.Selection <> ""
Donde OXL se define como Excel.Aplicación.
En Delphi Excelapplication.Selection requiere un índice pero en VB no lo hace. No pude encontrar nada similar en C# tampoco. He probado Excelapplication.Activecell, que funciona mientras haya una consulta existente, de lo contrario, Excel se bloquea.
¿Alguien sabe en qué se traduce esto para Delphi o C#?
Además, si oxl.selection es una interfaz, ¿cómo puede realizar oxl.selection <> ""?
Gracias.
Solución 2
No se preocupe, había olvidado que solo puede lanzar la interfaz IDISPATCH de la aplicación a un Olevariant y luego llamar al método.
Pero lo que he hecho en su lugar es solo lo siguiente
try
ExcelApplication.ActiveCell.QueryTable.Refresh(False);
except
end;
Esta parece ser la única forma de hacer que funcione sin estrellar Excel.
Otros consejos
Al automatizar Excel de Delphi usando interfaces, muchos métodos toman un LCID. Puedes usar LOCALE_USER_DEFAULT
para eso.
var
oxlSelection: ExcelRange;
ExcelApplication.ActiveCell.QueryTable;
if Supports(fExcelApplication.Selection[LOCALE_USER_DEFAULT], ExcelRange, oxlSelection)
and (VarToStr(oxlSelection.Text) <> '') then
begin
//do something
end;
Me he encontrado con este problema muchas veces, la solución es muy simple.
Siempre usa 0
para el lugareid y todo funcionará como excepto.
Esto hará que Excel complete su localidad predeterminada.
ExcelApplication.ActiveCell.QueryTable;
if OleVariant(ExcelApplication.Selection[0]).Value <> '' then .....
Puede usar variantes y luego no sufre este requisito, pero en ese caso:
- Su código se ejecutará más lento (toda esa variante magia lleva tiempo)
- No tendrá ayuda de contexto en sus métodos y propiedades de Excelapplication.
Tenga en cuenta que selection
, me gusta cells
Devuelve un idsispatch, que tienes que lanzar a un olevariante, para trabajar con él.
Lo mismo ocurre en VBA, excepto que el elenco está implícito.