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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top