none
Tratamento de Erro (On Error GoTo) RRS feed

  • Pergunta

  • Olá pessoal! Tudo bom?

    Criei um programa que procura alguns valores da célula de uma planilha. Coloquei um tratamento de erro quando o valor da célula apresentar um erro como valor. Quando há só uma célula com erro o código funciona, no entanto, quando há mais de uma célula, o segundo erro não é tratado.

    Alguém pode me ajudar?

    Abs,

    No código abaixo se duas ou mais células tiverem por ex. um erro do tipo #DIV/0!, o código é interrompido.

    Sub Macro1()
     Dim cont As Integer
     On Error GoTo trataerro
     For cont = 1 To 3
      MsgBox Cells(cont, 1)
    trataerro:
     Next
    End Sub

    segunda-feira, 15 de dezembro de 2014 23:10

Respostas

  • Não declare variáveis com o tipo de dados Integer se elas representarem uma linha no Excel. Declare-as como Long. Além de tipos de dados Long operarem com maior velocidade, suporta o limite de um milhão de linhas do Excel.

    ---

    Não sugiro utilizar o tratamento de exceção do tipo On...Error...Goto no seu caso. O Excel possui um tipo de teste especial para tratar erros de células.

    Na verdade, erros do tipo #DIV/0!, #N/D e #NÚM! representam um tipo de dados Variant com um subtipo específico que pode ser testado usando a função IsError:

    Sub pTest1()
      Dim cont As Integer
      Dim rng As Excel.Range
      Dim sError As String
      
      For cont = 1 To 3
        Set rng = Cells(cont, 1)
        If Not IsError(rng.Value) Then
          MsgBox rng.Value
        Else
          MsgBox "Erro."
        End If
      Next cont
    End Sub
    

    No entanto, se quiser saber qual tipo de erro a célula possui, faça algo como mostrado abaixo:

    Sub pTest2()
      Dim cont As Integer
      Dim rng As Excel.Range
      Dim sError As String
      
      For cont = 1 To 3
        Set rng = Cells(cont, 1)
        If Not IsError(rng.Value) Then
          sError = rng.Value
        Else
          Select Case rng.Value
            Case CVErr(XlCVError.xlErrDiv0): sError = "#DIV/0!"
            Case CVErr(XlCVError.xlErrNA): sError = "#N/D"
            Case CVErr(XlCVError.xlErrName): sError = "#NOME?"
            Case CVErr(XlCVError.xlErrNull): sError = "#NULO!"
            Case CVErr(XlCVError.xlErrNum): sError = "#NÚM!"
            Case CVErr(XlCVError.xlErrRef): sError = "#REF!"
            Case CVErr(XlCVError.xlErrValue): sError = "#VALOR!"
          End Select
        End If
        MsgBox sError
      Next cont
    End Sub
     
    


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

    • Marcado como Resposta Erikeng quarta-feira, 17 de dezembro de 2014 20:04
    terça-feira, 16 de dezembro de 2014 20:52
    Moderador

Todas as Respostas

  • Para o caso que vc citou experimente usar:

    On Error Resume Next

    Caso queira resetar:

    On Error GoTo 0

    Abraço.


    Filipe Magno

    terça-feira, 16 de dezembro de 2014 00:52
  • Não declare variáveis com o tipo de dados Integer se elas representarem uma linha no Excel. Declare-as como Long. Além de tipos de dados Long operarem com maior velocidade, suporta o limite de um milhão de linhas do Excel.

    ---

    Não sugiro utilizar o tratamento de exceção do tipo On...Error...Goto no seu caso. O Excel possui um tipo de teste especial para tratar erros de células.

    Na verdade, erros do tipo #DIV/0!, #N/D e #NÚM! representam um tipo de dados Variant com um subtipo específico que pode ser testado usando a função IsError:

    Sub pTest1()
      Dim cont As Integer
      Dim rng As Excel.Range
      Dim sError As String
      
      For cont = 1 To 3
        Set rng = Cells(cont, 1)
        If Not IsError(rng.Value) Then
          MsgBox rng.Value
        Else
          MsgBox "Erro."
        End If
      Next cont
    End Sub
    

    No entanto, se quiser saber qual tipo de erro a célula possui, faça algo como mostrado abaixo:

    Sub pTest2()
      Dim cont As Integer
      Dim rng As Excel.Range
      Dim sError As String
      
      For cont = 1 To 3
        Set rng = Cells(cont, 1)
        If Not IsError(rng.Value) Then
          sError = rng.Value
        Else
          Select Case rng.Value
            Case CVErr(XlCVError.xlErrDiv0): sError = "#DIV/0!"
            Case CVErr(XlCVError.xlErrNA): sError = "#N/D"
            Case CVErr(XlCVError.xlErrName): sError = "#NOME?"
            Case CVErr(XlCVError.xlErrNull): sError = "#NULO!"
            Case CVErr(XlCVError.xlErrNum): sError = "#NÚM!"
            Case CVErr(XlCVError.xlErrRef): sError = "#REF!"
            Case CVErr(XlCVError.xlErrValue): sError = "#VALOR!"
          End Select
        End If
        MsgBox sError
      Next cont
    End Sub
     
    


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

    • Marcado como Resposta Erikeng quarta-feira, 17 de dezembro de 2014 20:04
    terça-feira, 16 de dezembro de 2014 20:52
    Moderador
  • Olá Felipe, obrigado pela resposta.

    Funcionou perfeitamente!

    Abs.

    quarta-feira, 17 de dezembro de 2014 20:07