1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Duvida No fim da execução do programa fica uma planilha Excel aberta.

Discussão em 'Progress 4GL' iniciado por ds201, Dezembro 11, 2024.

  1. ds201

    ds201 Membro Participativo

    Criei um programa que tem por objetivo abrir um documento Word, localizar um “marcador” e colar uma planilha Excel na posição do marcador.

    O programa esta funcionado, porem resta um problema: Quando termina a execução do programa, fica uma planilha aberta no Excel. É uma planilha vazia.

    Este problema pode ser observado alterando a propriedade “oExcel:visible = false.” para “oExcel:visible = true.”. Também a possível observar usando gerenciador de tarefas.

    Não consegui entender o que causa este problema. É como se o comando para fechar a planilha estivesse falhando por alguma razão.

    Alguém já teve este problema?


    Código:
    routine-level on error undo, throw.
    
    define variable oWord       as com-handle no-undo.
    define variable oWordDoc    as com-handle no-undo.
    define variable oWordRange  as com-handle no-undo.
    define variable cWordFile   as character  no-undo init "C:\tmp\Doc_word.docx".
    define variable cWordMarker as character  no-undo init "#Incluir-plan".
    /**/
    define variable oExcel      as com-handle no-undo.
    define variable oExcelWB    as com-handle no-undo.
    define variable oExcelWS    as com-handle no-undo.
    define variable oExcelRange as com-handle no-undo.
    define variable cExcelFile  as character  no-undo init "C:\tmp\Planilha_add.xlsx".
    /**/
    define variable i-ind       as integer    no-undo.
    
    /*--- AVISO: NÃÆo coloque mensagens antes do "CATCH erro AS Progress.Lang.ProError:" ---*/
    /*--- Elas fazem a planilha Excel ficar aberta. NÃÆo entendi o motivo                ---*/
    
    do on error undo, throw:
       /*--- FALTA: Verificar se o Word est  instalado nesta m quina ---*/
      
       /*--- Verificar se o documento Word existe ---*/
       if search(cWordFile) = ? then do:
          undo, throw new Progress.Lang.AppError("ERRO: Documento Word '" + cWordFile + "' nÆo encontrado.", 1).
       end.
      
       /*--- FALTA: Verificar se o documento Word j  esta em uso ---*/
      
       /*--- Verificar se a planilha Excel existe ---*/
       if search(cExcelFile) = ? then do:
          undo, throw new Progress.Lang.AppError("ERRO: Planiha Excel '" + cExcelFile + "' nÆo encontrada.", 1).
       end.
      
       /*--- FALTA: Verificar se a planilha Word j  esta em uso ---*/
      
       /*--- Create Word COM-HANDLE ---*/
       create "Word.Application" oWord.
       oWord:visible = false.
      
       /* Open the Word document */
       oWordDoc = oWord:Documents:open(cWordFile).
    
       /* Create Excel COM-HANDLE */
       create "Excel.Application" oExcel.
       oExcel:visible = false.
    
       /* Open the Excel workbook */
       oExcelWB = oExcel:Workbooks:open(cExcelFile).
       oExcelWS = oExcelWB:Sheets(1). /* Assuming data is in the first sheet */
    
       /* Determine the used range in Excel */
       oExcelRange = oExcelWS:UsedRange.
    
       /* Find the placeholder in Word */
       oWordRange = oWordDoc:Content.
       oWordRange:find:text = cWordMarker.
       
       if oWordRange:find:execute() then do:
          /* Collapse the range to the end of the found marker */
          oWordRange:Collapse(1). /* wdCollapseEnd */
          /* Copy the Excel range */
          oExcelRange:copy().
          /* Paste into Word */
          oWordRange:paste().
       end.
       else do:
          /* Raise an error if the marker is not found */
          undo, throw new Progress.Lang.AppError("Marcador '" + cWordMarker + "' nÃÆo encontrado no documento Word.", 1).
       end.
    
       /* Save, close and quit the Word document */
       oWordDoc:save().
       oWordDoc:close().
       oWord:quit().
      
       /* Close Excel workbook and quit Excel */
       oExcelWB:close(false). /* Do not save changes */
       oExcel:quit().
    
       /* Executa somente quando ocorre erro Progress */
       catch erro as Progress.Lang.ProError:
          /* Sâ entra nesse bloco se ocorrer erro */
          repeat i-ind = 1 TO erro:NumMessages:
              message "Câdigo do Erro: " + string(erro:GetMessageNum(i-ind)) skip
                      "Mensagem: " + erro:GetMessage(i-ind)
                      view-as alert-box info buttons ok.
          end.
       end catch.
    
       finally:
          /* Release COM-HANDLEs */
          if valid-handle(oExcelRange) then release object oExcelRange.
          if valid-handle(oWordDoc)    then release object oWordDoc.
          if valid-handle(oWord)       then release object oWord.
    
          if valid-handle(oWordRange)  then release object oWordRange.
          if valid-handle(oExcelWS)    then release object oExcelWS.
          if valid-handle(oExcelWB)    then release object oExcelWB.
          if valid-handle(oExcel)      then release object oExcel.
       end finally.
    end.
    /*--- fim ---*/
    
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Parce idiotice, mas eu sempre tive comigo que o ultimo a abrir é o primeiro a fechar, então vc está abrindo word, abrindo excel, dai vc fecha word e fecha excel, tenta inverter isso, vai que algum ponteiro ficou preso, abre word, abre excel, depois vc fecha excel e dai fecha o word.
    é a unica coisa que pude perceber de diferente do que eu costumo fazer.
    rafael.andrade curtiu isso.
  3. ds201

    ds201 Membro Participativo

    Muito obrigado pelo apoio. Vou seguir a sua sugestão.
  4. ds201

    ds201 Membro Participativo

    Boa noite

    Mudei a ordem do fechamento mais não resolveu.
    Descobri que o comando abaixo é que estava causando o não fechamento do Excel.
    /*--- Close Excel workbook and quit Excel ---*/
    h-ExcelWB:close(false). /* Do not save changes */
    h-Excel:quit().

    Mudei para:
    /*--- Close Excel workbook and quit Excel ---*/
    h-ExcelWB:close(). /*=== RETIREI O "FALSE" ===*/
    h-Excel:quit().

    Resolveu.
    Obrigado pelo apoio.
    bootstrapmaster e rafael.andrade curtiram isso.

Compartilhe esta Página