none
Excel 2007, VBA, ODBC - Trava de forma aleatória e reinicia o Excel RRS feed

  • Pergunta

  • Vamos lá,

    Tenho uma planilha que executa uma conexão via ODBC com o driver "AR System ODBC Driver" executo um select e coloco os resultados na planilha, só que, quando faço isso numa maq (i5 com 16GB RAM) ele trava o excel e reinicia o aplicativo falando que a aplicação travou e não dá mais nenhuma mensagem.

    Já criei conexão no SYSWOW, já vi no system32 nda adiantou

    Se eu executo o código step by step (F8) e ele executa, outras macros parecidas são executadas automaticamente o que torna o erro meio que aleatório mas sempre acontece na extração dos dados da conexão outras macros para tratar os dados da planilha funcionam corretamente.

    já executei em modo de compatibilidade e não deu certo.

    Fato 1: essa mesma rotina funciona perfeitamente em outros equipamentos inferiores e com windows XP e 8.1

    Fato 2: ocorre o mesmo problema com outras maquinas iguais com mesma formatação

    Fato 3: já solicitei e o pacote office foi reinstalado 2x

    Não sou admin da maq mais estou solicitando acesso para testar mais coisas então dependo de uma equipe de suporte interna para algumas alterações

    Sugestões qq coisa, já não sei mais o que posso fazer.

    terça-feira, 25 de agosto de 2015 19:33

Respostas

  • Enfim depois de uma formatação e reinstalação do Office finalmente uma solução.

    Vamos a historia:

    Abri um chamado para o suporte da Empresa e pedi uma formatação com outra ISO para evitar o que achava ser um problema da instalação, feito isso, o pc voltou funcionando perfeitamente fiz os testes e tudo ok, reiniciei para configurar outro monitor e zerda voltou a dar problema, olha aki e ali finalmente vi que o AD esta configurado para aplicar atualizações automáticas e pelo horário do log só pode ter sido isso conclusão após retirar todas as atualizações não críticas ele voltou a funcionar, refinei em outras maquinas que davam o mesmo problema e o pessoal do suporte interno chegou em duas atualizações:

    KB3000850 
    KB3014442

    Agora fizemos o teste em 4 estações que estavam com o mesmo problema e retirando as duas atualizações o problema foi resolvido.

    • Marcado como Resposta Felipe b terça-feira, 29 de setembro de 2015 19:24
    terça-feira, 29 de setembro de 2015 19:24

Todas as Respostas

  • Felipe, me parece que você está tendo problemas de vazamento de memória. Certifique-se que você feche as conexões e recordsets ao término das rotinas, e atribua eles também à Nothing.

    Poderia mostrar o código que está usando?


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 26 de agosto de 2015 14:38
    Moderador
  • Sub subImporte()
    Dim P As Worksheet
    Dim rs As ADODB.Recordset
    Set P = Plan2
    Set rs = New ADODB.Recordset
    
    L = P.[A1048576].End(xlUp).Row + 1
    P.Rows("2:" & L).Delete
    
    
    
        data_ini = Plan1.Cells(8, 3)
        data_fim = DateAdd("m", 1, Plan1.Cells(8, 3))
        data_ini = Format(data_ini, "yyyy-mm-dd")
        data_fim = Format(data_fim, "yyyy-mm-dd")
    
    
    rs.Open strSQL, cnn, adOpenStatic, adLockReadOnly
    
        For x = 1 To rs.Fields.Count
            P.Cells(1, x) = rs.Fields(x - 1).Name
        Next
    
    
    Do While rs.EOF = False
        L = P.[A1048576].End(xlUp).Row + 1
        For x = 1 To rs.Fields.Count
            P.Cells(L, x) = rs.Fields(x - 1)
        Next
        rs.MoveNext
    Loop
    
    End Sub


    Só que quando ele não trava a planilha e reinicia o excel com erro  msdasql.dll no eventview ele fica dando erro de o campo estar vazio e não consegue carregar na planilha e fica dando erro de compilação método _Default' do objeto 'Range' falhou.

    Só que esse erro também é aleatório de eu vou executando com F8 ele roda sem problemas mais se dou F5 ele começa a dar esses erros

       
    • Editado Felipe b sexta-feira, 28 de agosto de 2015 11:56 Correção do post
    quinta-feira, 27 de agosto de 2015 19:30
  • Ao inserir um código no fórum, utilize blocos de código. Para utilizar essa ferramenta, clique no botão cuja legenda é “Inserir bloco de código” na barra do editor de mensagens do fórum. Uma janela aparecerá onde você deverá colar seu código cru na caixa de texto à esquerda. Então, selecione a opção Vb.Net na caixa de combinação que você verá em cima à esquerda e depois clique no botão Inserir.

    ---

    Tente qualificar o objeto Range completamente e feche/limpe variáveis que representam um recordset e conexão. Declare suas variáveis também:

    Option Explicit
    
    Sub subImporte()
        Dim data_ini As Date
        Dim data_fim As Date
        Dim L As Long
        Dim P As Worksheet
        Dim strSQL As String
        Dim rs As ADODB.Recordset
        Dim x As Long
        
        Set P = Plan2
        Set rs = New ADODB.Recordset
        
        L = P.[A1048576].End(xlUp).Row + 1
        P.Rows("2:" & L).Delete
        
        
        
        data_ini = Plan1.Cells(8, 3).Value
        data_fim = DateAdd("m", 1, Plan1.Cells(8, 3)).Value
        data_ini = Format(data_ini, "yyyy-mm-dd")
        data_fim = Format(data_fim, "yyyy-mm-dd")
        
        
        rs.Open strSQL, cnn, adOpenStatic, adLockReadOnly
        
        For x = 1 To rs.Fields.Count
            P.Cells(1, x).Value = rs.Fields(x - 1).Name
        Next x
        
        
        Do While rs.EOF = False
            L = P.[A1048576].End(xlUp).Row + 1
            For x = 1 To rs.Fields.Count
                P.Cells(L, x).Value = rs.Fields(x - 1)
            Next x
            rs.MoveNext
        Loop
        
        On Error Resume Next
        rs.Close
        Set rs = Nothing
        cnn.Close
        Set cnn = Nothing
    End Sub
    


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quinta-feira, 27 de agosto de 2015 19:39
    Moderador
  • Fiz o que vc orientou e no começo funcionou perfeitamente, só que de uma hora para outra ele começa a dar erro novamente.

    Tenho outras macros que rodam com consulta de dados e alguns funcionam e outros não dependendo do campo que ele tenta colocar na célula ele trava.

    Option Explicit
    Public cnn As ADODB.Connection
    
    Sub subImporte()
    Dim P As Worksheet, l As Long, data_ini As String, data_fim As String, x As Long, strsql As String, teste As Variant
    
    Dim rs As ADODB.Recordset
    
    Set P = Plan2
    Set rs = New ADODB.Recordset
    
    l = P.[A1048576].End(xlUp).Row + 1
    P.Rows("2:" & l).Delete
    
    
    subConectarITSM
        data_ini = Plan1.Cells(8, 3).Value
        data_fim = DateAdd("m", 1, Plan1.Cells(8, 3))
        data_ini = Format(data_ini, "yyyy-mm-dd")
        data_fim = Format(data_fim, "yyyy-mm-dd")
        
        
        strsql = "SELECT Incident-Number, "
    strsql = strsql & "SRID, "
    strsql = strsql & "Submit-Date, "
    strsql = strsql & "Closed-Date, "
    strsql = strsql & "First-Name, "
    strsql = strsql & "Last-Name, "
    strsql = strsql & "Direct-Contact-Company, "
    strsql = strsql & "Categorization-Tier-1, "
    strsql = strsql & "Categorization-Tier-2, "
    strsql = strsql & "Product-Categorization-Tier-1, "
    strsql = strsql & "Product-Categorization-Tier-2, "
    strsql = strsql & "Company, "
    strsql = strsql & "Organization, "
    strsql = strsql & "Department, "
    strsql = strsql & "Resolution, "
    strsql = strsql & "Description, "
    strsql = strsql & "Assigned-Group, "
    strsql = strsql & "Status, "
    strsql = strsql & "Assignee, "
    strsql = strsql & "Detailed-Decription"
    strsql = strsql & " FROM ""HPD:Help Desk"" "
    strsql = strsql & " WHERE (Status<>'Cancelled')"
    strsql = strsql & " AND (Submit-Date>={ts '" & data_ini & " 00:00:00'} And Submit-Date<{ts '" & data_fim & " 00:00:00'})"
    
    rs.Open strsql, cnn, adOpenStatic, adLockReadOnly
    
        For x = 1 To rs.Fields.Count
            P.Cells(1, x).Value = rs.Fields(x - 1).Name
        Next
       
    
    Do While rs.EOF = False
        l = P.[A1048576].End(xlUp).Row + 1
        For x = 1 To rs.Fields.Count
            teste = rs.Fields(x - 1).Value
            P.Cells(l, x).Value = teste 'rs.Fields(x - 1).Value
        Next
        rs.MoveNext
    Loop
    
      On Error Resume Next
        rs.Close
        Set rs = Nothing
        cnn.Close
        Set cnn = Nothing
    
    End Sub
    
    Public Sub subConectarITSM()
        Dim strConn As String
        Dim strsql As String
        Set cnn = New ADODB.Connection
           cnnip = Plan1.Cells(1, 2).value
    
            strConn = "DRIVER={AR System ODBC Driver};"
            strConn = strConn & "UID=UserTeste;"
            strConn = strConn & "PWD=UserTeste;"
            strConn = strConn & "SERVER=NotTheServer;"
            strConn = strConn & "ARAuthentication=;"
            strConn = strConn & "ARNameReplace=1;"
            strConn = strConn & "ARUseUnderscores=1;"
            strConn = strConn & "ARServer=" & cnnip & ";"
            strConn = strConn & "ARServerPort=9000;"
    
            cnn.Open strConn
            
    End Sub


    • Editado Felipe b sexta-feira, 28 de agosto de 2015 18:22 cnnITSM.Close > cnn.Close
    sexta-feira, 28 de agosto de 2015 14:37
  • Uma dúvida:

    cnnITSM.Close

    Não deveria ser apenas cnn.Close? Ou você tem mais de uma conexão? Caso tenha mais de uma conexão, feche-a também.

    A não ser que esteja utilizando padrões mais sofisticados de programação, lembre-se:

    "Ao término da rotina principal, sempre feche todos os recordsets e conexões e depois atribua-os para Nothing"


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    sexta-feira, 28 de agosto de 2015 15:03
    Moderador
  • Que o nome da conexao que utilizo é esse tinha tirado para não dar confusão mais esqueci daquele.

    Mas o erro acontece quando ele esta preenchendo a planilha quando ele pega um campo que tem uma string muito grande ele trava e fecha o excel.

    Do While rs.EOF = False
        l = P.[A1048576].End(xlUp).Row + 1
        For x = 1 To rs.Fields.Count
            teste = rs.Fields(x - 1).Value
            P.Cells(l, x).Value = teste 'rs.Fields(x - 1).Value
        Next
        rs.MoveNext
    Loop

    Quando rodo com outros campos com strings menores ele não da esse erro.

    sexta-feira, 28 de agosto de 2015 18:21
  • String muito grande? O que é grande (quantos caracteres tem, em média)?

    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 31 de agosto de 2015 01:00
    Moderador
  • A média está entre 250 a 350 com pico de 700 e min de 20.

    O total esta em 700 linhas por 20 colunas.

    mas somente em duas colunas eu tenho esses campos com varias linhas, estou fazendo vários testes e estou achando q o problema não esta nem no tamanho mas outra coisa.


    segunda-feira, 31 de agosto de 2015 13:03
  • Sim, porque pra mim, não há problemas mais no seu código.

    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 1 de setembro de 2015 12:30
    Moderador
  • Enfim depois de uma formatação e reinstalação do Office finalmente uma solução.

    Vamos a historia:

    Abri um chamado para o suporte da Empresa e pedi uma formatação com outra ISO para evitar o que achava ser um problema da instalação, feito isso, o pc voltou funcionando perfeitamente fiz os testes e tudo ok, reiniciei para configurar outro monitor e zerda voltou a dar problema, olha aki e ali finalmente vi que o AD esta configurado para aplicar atualizações automáticas e pelo horário do log só pode ter sido isso conclusão após retirar todas as atualizações não críticas ele voltou a funcionar, refinei em outras maquinas que davam o mesmo problema e o pessoal do suporte interno chegou em duas atualizações:

    KB3000850 
    KB3014442

    Agora fizemos o teste em 4 estações que estavam com o mesmo problema e retirando as duas atualizações o problema foi resolvido.

    • Marcado como Resposta Felipe b terça-feira, 29 de setembro de 2015 19:24
    terça-feira, 29 de setembro de 2015 19:24
  • Obrigado pelo feedback, Felipe.

    E cá pra nós, esse tipo de erro desanima qualquer desenvolvedor.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 29 de setembro de 2015 19:47
    Moderador