Fórum O Método Add da classe Workbooks falhou #467018
15/01/2014
0
Estou tentando exportar a minha tabela já pronta para o pdf porém ele está acontecendo o seguinte erro quando eu clico no botão para exportar O Método "Add" da classe "Workbooks falhou". A tabela já está funcionando listando todos os campos. O código que eu desenvolvi para o excel está abaixo caso ajude. Desde já muito Agradecido!
procedure TF_Modelo.ExportaDBGrid(ParaExcel: Boolean);
var
bm : TBookMark;
col, lin: Integer;
sLinha: String;
Memo: TMemo;
ExcelApp: Variant;
begin
Screen.Cursor := crHourGlass;
DBGrid1.DataSource.DataSet.DisableControls;
bm := DBGrid1.DataSource.DataSet.GetBookmark;
DBGrid1.DataSource.DataSet.First;
//Criar o objeto Excel
if ParaExcel then
begin
ExcelApp := CreateOleObject(''Excel.application'');
ExcelApp.WorkBooks.add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheet[1].name:= ''Minha Planilha'';
end;
//Enviar primeiramente para o memo
Memo := TMemo.Create(nil);
memo.Visible:= false;
memo.Parent := F_Modelo;
memo.Clear;
sLinha:= '' '';
//Pega o nome da Coluna
for col := 0 to DBGrid1.FieldCount -1 do
sLinha:= sLinha + DBGrid1.Fields[col].DisplayLabel + #9;
memo.Lines.Add(sLinha);
//Pega as Linhas
for lin := 0 to DBGrid1.DataSource.DataSet.RecordCount -1 do
begin
sLinha:= '' '';
for col := 0 to DBGrid1.FieldCount -1 do
sLinha:= sLinha + DBGrid1.Fields[col].AsString + #9;
memo.Lines.Add(sLinha);
DBGrid1.DataSource.DataSet.Next;
end;
//Selecionar o memo e copio para Área de Trababalho
memo.SelectAll;
memo.CopyToClipboard;
if ParaExcel then
begin
ExcelApp.WordBooks[1].WorkSheets[''Minha Planilha''].paste;
ExcelApp.visible:= true;
end;
FreeAndNil(memo);
DBGrid1.DataSource.DataSet.GotoBookmark(bm);
DBGrid1.DataSource.DataSet.FreeBookmark(bm);
DBGrid1.DataSource.DataSet.EnableControls;
Screen.Cursor:= crDefault;
end;Edson Vilhalba
Curtir tópico
+ 0Posts
15/01/2014
Edson Vilhalba
Gostei + 0
07/04/2014
Eduardo Flaeschen
Gostei + 0
09/09/2014
Dqr Ti
Experimente fazer as seguintes alterações.
no trecho tirado do seu código abaixo:
//Criar o objeto Excel
if ParaExcel then
begin
ExcelApp := CreateOleObject(''Excel.application'');
ExcelApp.WorkBooks.add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheet[1].name:= ''Minha Planilha'';
end;
//Enviar primeiramente para o memo
Solução:
Na Linha: ExcelApp := CreateOleObject(''Excel.application'');
Mude Para: ExcelApp := CreateOleObject('Excel.application');
Detalhe: Use aspas simples.
Na Linha: ExcelApp.WorkBooks.add(xlWBatWorkSheet);
Mude Para: ExcelApp.WorkBooks.add;
Detalhe: retire (xlWBatWorkSheet)
Na Linha: ExcelApp.WorkBooks[1].WorkSheet[1].name:= ''Minha Planilha'';
Mude Para: ExcelApp.WorkBooks[1].WorkSheets[1].name:= 'Minha Planilha';
Detalhe: acrescente a letra "s" WorkSheets[1] e coloque aspas simples ''Minha Planilha'' = ERRADO - 'Minha Planilha' = CORRETO.
Trecho corrigido:
//Criar o objeto Excel
if ParaExcel then
begin
ExcelApp := CreateOleObject('Excel.application');
ExcelApp.WorkBooks.add;
ExcelApp.WorkBooks[1].WorkSheets[1].name:= 'Minha Planilha';
end;
//Enviar primeiramente para o memo
Observação:
Quando rodar a aplicação, certifique-se que em seu DBGrid esteja mostrando seus registros, se estiver vazio, vai gerar erro.
Espero ter ajudado.
Boa sorte!
Gostei + 0
09/09/2014
Dqr Ti
Experimente fazer as seguintes alterações.
no trecho tirado do seu código abaixo:
//Criar o objeto Excel
if ParaExcel then
begin
ExcelApp := CreateOleObject(''Excel.application'');
ExcelApp.WorkBooks.add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheet[1].name:= ''Minha Planilha'';
end;
//Enviar primeiramente para o memo
Solução:
Na Linha: ExcelApp := CreateOleObject(''Excel.application'');
Mude Para: ExcelApp := CreateOleObject('Excel.application');
Detalhe: Use aspas simples.
Na Linha: ExcelApp.WorkBooks.add(xlWBatWorkSheet);
Mude Para: ExcelApp.WorkBooks.add;
Detalhe: retire (xlWBatWorkSheet)
Na Linha: ExcelApp.WorkBooks[1].WorkSheet[1].name:= ''Minha Planilha'';
Mude Para: ExcelApp.WorkBooks[1].WorkSheets[1].name:= 'Minha Planilha';
Detalhe: acrescente a letra "s" WorkSheets[1] e coloque aspas simples ''Minha Planilha'' = ERRADO - 'Minha Planilha' = CORRETO.
Trecho corrigido:
//Criar o objeto Excel
if ParaExcel then
begin
ExcelApp := CreateOleObject('Excel.application');
ExcelApp.WorkBooks.add;
ExcelApp.WorkBooks[1].WorkSheets[1].name:= 'Minha Planilha';
end;
//Enviar primeiramente para o memo
Observação:
Quando rodar a aplicação, certifique-se que em seu DBGrid esteja mostrando seus registros, se estiver vazio, vai gerar erro.
Não sei porque, mas quando posto a resposta, automaticamente coloca aspas a mais. Em todos os lugares que tem aspas, favor colocar aspas simples.
Espero ter ajudado.
Boa sorte!
Gostei + 0
10/10/2015
Edvaldo Melo
Sim, ajudou bastante, mas ainda consta um erro após a execução de chamada da planilha.
diz o seguinte:
Access violation at address 00408662 in modulo 'Estoque.exe'
Read of address 00000009
Se puder ajudar mais uma vez agradeço
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)