none
VB.NET - Usuário fecha Excel mas processo continua aberto RRS feed

  • Pergunta

  • Pessoal,

    Bom dia!

    Estou com o seguinte problema:

    Estou usando VB.NET para gerar um relatório em Excel para o usuário. Este arquivo não é salvo no HD, só aberto na tela.

        Sub GeraExcel()

            Try
                ' Usando uma instância já aberta do Excel
                Excelobj = GetObject(, "Excel.Application")
            Catch ex As Exception
                'Criando uma nova instância do Excel
                Excelobj = CreateObject("Excel.Application")
            Finally
                Excelobj.Workbooks.Add()
            End Try

        End Sub

    Tanto faz se uso uma instância aberta do Excel ou abro uma nova, quando o usuário fecha o Excel o processo continua rodando.

    Alguém tem alguma idéia que possa ajudar?

    Desde já grato.

    segunda-feira, 8 de junho de 2015 14:45

Respostas

  • Tente isto:

    Finally
                    For Each process1 As Process In Process.GetProcessesByName("Excel")
                        process1.Kill()
                    Next
                End Try

    No meu aqui vem dando certo, mas lembre-se se houver alguma instância do Excel aberta ele irá fechar todas.

    E há nesse caso ele fechará a tela, este é um tipo de código que você usa realmente para não mostrar o Excel, após a conclusão de alguma ação.


    • Editado A_Nunes sexta-feira, 25 de setembro de 2015 17:46 Adição
    • Marcado como Resposta Marcos SJ quinta-feira, 11 de fevereiro de 2016 13:38
    sexta-feira, 25 de setembro de 2015 17:44

Todas as Respostas

  • porque vc nao coloca um codigo em uma timer para verificar se ele esta aberta e se estiver da kill no processo ?
    segunda-feira, 8 de junho de 2015 17:42
  • Não posso dar um kill porque o Excel deverá ser fechado pelo próprio usuário quando ele terminar de fazer uso do relatório.
    segunda-feira, 8 de junho de 2015 20:02
  • Já tentou fazer o dispose no objeto Excel?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 9 de junho de 2015 12:36
  • entao de kill apos o Excel ser fechado em seu evento 
    terça-feira, 9 de junho de 2015 16:54
  • Mr. GMSOFT,

    Já sim. Também não deu certo.

    Também tentei atribuir Nothing à variável, tentei usar o GC.Collect mas nada funciona.

    terça-feira, 9 de junho de 2015 20:00
  • Não tem como dar kill.

    Primeiro porque o próprio usuário irá fechar o arquivo quando não precisar mais dele.

    Segundo o usuário pode estar com outras planilhas abertas e o kill fecha sem perguntar se você quer salvar.

    terça-feira, 9 de junho de 2015 20:02
  • Onde esta declarada essa variável ExcelObj? Essa variável é global?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    quarta-feira, 10 de junho de 2015 11:58
  • A variável é Global.

    Foi declarada na Classe do Form.

    sexta-feira, 12 de junho de 2015 21:21
  • Já tentou usar as ferramentas do .net do office?

    https://msdn.microsoft.com/pt-br/library/dd264733.aspx

    Deve ter alguma classe ou objeto que esta impedindo a aplicação de fechar totalmente... 
    Pode se que tenha o mesmo problema com os interops, mas só tentando. 


    Desenvolvedor de sistemas VB6, ASP, ASP.NET, C#, VB.NET, SQL Server, Oracle e MySql.

    sexta-feira, 12 de junho de 2015 23:03
  • Coloca por favor o codigo completo vou testar aqui,sendo global tem que fechar esse processo senão ocorre esse problema mesmo.

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    sábado, 13 de junho de 2015 16:38
  • Já tentou usar as ferramentas do .net do office?

    https://msdn.microsoft.com/pt-br/library/dd264733.aspx

    Deve ter alguma classe ou objeto que esta impedindo a aplicação de fechar totalmente... 
    Pode se que tenha o mesmo problema com os interops, mas só tentando. 


    Desenvolvedor de sistemas VB6, ASP, ASP.NET, C#, VB.NET, SQL Server, Oracle e MySql.

    Eric,

    Não posso usar o interop. Aqui tem uma salada de versões do Office. Da versão 2000 até 2007.

    Triste realidade. :(

    terça-feira, 16 de junho de 2015 19:50
  • Coloca a parte da declaração do ExcelObj ja que não esta usando interop

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 16 de junho de 2015 21:48
  • Coloca a parte da declaração do ExcelObj ja que não esta usando interop

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    Segue:

            Dim Excelobj As Object = Nothing

            Try
                Excelobj = GetObject(, "Excel.Application")
            Catch ex As Exception
                Excelobj = CreateObject("Excel.Application")
            Finally           

    Excelobj.Workbooks.Add()
            End Try

    ' Finalizando a variável

            Excelobj = Nothing
            GC.Collect()

    Obrigado.

    terça-feira, 16 de junho de 2015 21:58
  • Tente isto:

    Finally
                    For Each process1 As Process In Process.GetProcessesByName("Excel")
                        process1.Kill()
                    Next
                End Try

    No meu aqui vem dando certo, mas lembre-se se houver alguma instância do Excel aberta ele irá fechar todas.

    E há nesse caso ele fechará a tela, este é um tipo de código que você usa realmente para não mostrar o Excel, após a conclusão de alguma ação.


    • Editado A_Nunes sexta-feira, 25 de setembro de 2015 17:46 Adição
    • Marcado como Resposta Marcos SJ quinta-feira, 11 de fevereiro de 2016 13:38
    sexta-feira, 25 de setembro de 2015 17:44

  • Bom dia,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 11 de fevereiro de 2016 13:38