PDA

Ver la Versión Completa : cerrar objeto de excel


mak8888
10-02-2006, 18:41:55
He consultado varias páginas en las que usan una misma misma instrucción xa cerrar excel (xlapp.quit), pero en tiempo de ejecución me dice "Project raised... class EOleError with message 'Method 'Quit' not supported in automation object'...". He probado varias cosas pero no consigo cerrar Excel y no sé pq no puedo obtener ayuda al respecto en el help de delphi.
Este es el código sencillo que uso:

var
XLApp: Variant;
...

código de un botón:
XLApp:= CreateOleObject('Excel.Application');
XLApp.Visible := false;
XLApp.Workbooks.Add(xlWBatWorkSheet);
XLApp.Workbooks[1].WorkSheets[1].Name := 'Delphi Data';

XLApp := XLApp.Workbooks[1].WorkSheets['Delphi Data'];
for i := 1 to 10 do
XLApp.Cells[i, 1] := i;

XLApp.SaveAs('c:\temp2.xls');

código formdestroy:
if not VarIsEmpty(XLApp) then
begin
XLApp.Quit;
XLAPP := Unassigned;
end;

y en ese XLApp.Quit es donde siempre da error :-S
Alguna idea?

Entre otras muchas webs he visto esta de borland: http://community.borland.com/article/0,1410,10126,00.html pero veo que hace lo mismo que yo :(
Incluso he leido aqui: http://community.borland.com/article/0,1410,10127,00.html Un apunte referente a que a CreateOleObject hay que pasarle la cadena exacta, en caso contrario dará error. He seguido los pasos, he mirado como dice en el registro y he cambiado el CreateOleObject por "XLApp:= CreateOleObject('Excel.Application.11');" que es lo que indica mi registro, pero seguimos con error en tiempo de ejecución en el .quit.

Gracias a todos de antemano.
Saludos

OSKR
10-02-2006, 23:19:39
Creo recordar haber respondido esto antes pero eso fue hace mucho antes, yo uso algo asi y nada de excepciones:

//Para abrir excel
Variant xlApp;
xlApp = CreateOleObject("Excel.Application");
//hacer visible EXCEL
xlApp.Exec(PropertySet("Visible") << true);
//Acceso a un objeto libro
Variant xlBooks = xlApp.Exec(PropertyGet("Workbooks"));
//crea un nuevo archivo
xlBooks.Exec(Procedure("Add"));
//elige el primer libro de la aplicación
Variant xlBook = xlBooks.Exec(PropertyGet("Item") << 1);
//crea un acceso a un objeto hoja
Variant xlSheets = xlBook.Exec(PropertyGet("Worksheets"));
//Elige una hoja
Variant xlSheet = xlSheets.Exec(PropertyGet("Item") << 1);
//En esta parte es en donde agregas los datos
Variant VRange;
VRange = xlSheet.Exec(PropertyGet("Range") << "A4");
VRange.Exec(PropertySet("Value") << "RUT");
VRange = xlSheet.Exec(PropertyGet("Range") << "B4");
VRange.Exec(PropertySet("Value") << "NOMBRE");
int fila=5;
VRange = xlSheet.Exec(PropertyGet("Range") << "A"+IntToStr(fila));
VRange.Exec(PropertySet("Value") << Edit1->Text);
VRange = xlSheet.Exec(PropertyGet("Range") << "B"+IntToStr(fila));
VRange.Exec(PropertySet("Value") << Edit2->Text);
fila++;
//Guarda el archivo
xlBook.Exec(Procedure("SaveAs") << "\\archivo.xls");
//-------- Cierra excel
//xlApp.Exec(PropertySet("Visible") << false);
xlApp.Exec(Procedure("Quit"));
xlApp.Clear();

mak8888
10-02-2006, 23:37:48
Hola. Gracias por contestar. Probaré a traducirlo de Borland C a Delphi. Solo una pregunta, ¿que significa el "<<"?
Saludos y gracias de antemano

OSKR
11-02-2006, 00:05:35
Oooops!!! peqeño detalle :D, es un operador sobrecargado q indica la inclusión de un valor a un objeto, pero concentrate en el " xlApp.Exec(Procedure("Quit"));" , o sea... trata de ejecutarlo dentro del Procedure, si necesitas como sea de un operador así a como de lugar ....entonces,.....este..............bueno.....habra q explorar las propiedades del variant en delphi...deberian ser las mismas......................sino...........pues invoca a un Delphiniano.......q mas te podria decir?:o

mak8888
11-02-2006, 00:11:04
Gracias. Mañana después de haber dormido y estando a buenas con el compilador volveré a probar jejeje.
Ya os contaré.
Saludos y gracias