Fórum O Método Add da classe Workbooks falhou #467018

15/01/2014

0

Olá pessoal,

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

Edson Vilhalba

Responder

Posts

15/01/2014

Edson Vilhalba

Pessoal me desculpem é para o EXCEL sem querer coloquei pdf
Responder

Gostei + 0

07/04/2014

Eduardo Flaeschen

Olá Edson, você conseguiu resolver esse problema ? estou com o mesmo erro !
Responder

Gostei + 0

09/09/2014

Dqr Ti

Prezado.

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!
Responder

Gostei + 0

09/09/2014

Dqr Ti

Prezado.

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!
Responder

Gostei + 0

10/10/2015

Edvaldo Melo

Para: dQR

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar