Artigo: 146864 - Última revisão: sexta-feira, 19 de Janeiro de 2007 - Revisão: 3.4

Erro de véu com o Visual Basic for Applications

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Quando ocorre um erro no tempo de execução num Microsoft Visual Basic para aplicações de macro, uma mensagem de erro é apresentada no ecrã e a macro pára ou apresentar um comportamento imprevisível.

Para impedir que a aplicação de bloquear ou um comportamento modo imprevisível, pode incluir código de macro que intercepta o erro e explica como processar a macro. O processo de interceptar e processar um erro durante a execução é chamado de "intercepção de erros." O conjunto de instruções que indica a aplicação como lidar com o erro é chamado "rotina de tratamento de erro" ou "processador de erros."

Mais Informação

A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador. Durante a execução do código do Visual Basic, poderá encontrar diversos tipos de erros que podem ser aplicados véus. Pode tirar partido de intercepção de erros no Microsoft Excel utilizando as seguintes funções e instruções.

Na declaração de erros

A instrução em erro faz com que Visual Basic for Applications iniciar ou parar intercepção de erros. A instrução de erro também especifica um conjunto de instruções para executar se for detectado um erro.

Para obter informações adicionais, consulte os seguintes artigos na base de dados de conhecimento da Microsoft:
141571  (http://support.microsoft.com/kb/141571/EN-US/ ) Como utilizar "On Error" para processar erros de uma macro

Mensagem de função

A função Err devolve o número do erro encontrado.

Exemplo utilizando a função de erro:
   Msgbox "The most recent error number is " & Err & _
      ". Its message text is: " & Error(Err)
				
a tabela seguinte contém uma lista dos códigos de erro interceptável poderão ocorrer quando utilizar a função Err.
   Error code   Error message
   ----------   -------------
   3            Return without GoSub
   5            Invalid procedure call
   6            Overflow
   7            Out of memory
   9            Subscript out of range
   10           Duplicate definition (versions 5.0 and 7.0)
   10           This array is fixed or temporarily locked (version97)
   11           Division by zero
   13           Type mismatch
   14           Out of string space
   16           String formula too complex (versions 5.0 and 7.0)
   16           Expression too complex (version 97)
   17           Can't perform requested operation
   18           User interrupt occurred
   20           Resume without error
   28           Out of stack space
   35           Sub or function not defined (versions 5.0 and 7.0)
   35           Sub, function, or property not defined (version 97)
   47           Too many DLL application clients (version 97)
   48           Error in loading DLL
   49           Bad DLL calling convention
   51           Internal error
   52           Bad file name or number
   53           File not found
   54           Bad file mode
   55           File already open
   57           Device I/O error
   58           File already exists
   59           Bad record length
   61           Disk full
   62           Input past end of line
   63           Bad record number
   67           Too many files
   68           Device unavailable
   70           Permission denied
   71           Disk not ready
   74           Can't rename with different drive
   75           Path/File access error
   76           Path not found
   91           Object variable not set (versions 5.0 and 7.0)
   91           Object variable or With block variable not set
                (version 97)
   92           For Loop not initialized
   93           Invalid pattern string
   94           Invalid use of Null
   95           User-defined error (versions 5.0 and 7.0 only)
   298          System DLL could not be loaded (version 97)
   320          Can't use character device names in specified file names
                (version 97)
   321          Invalid file format (version 97)
   322          Can't create necessary temporary file (version 97)
   323          Can't load module; invalid format (versions 5.0 and 7.0)
   325          Invalid format in resource file (version 97)
   327          Data value named was not found (version 97)
   328          Illegal parameter; can't write arrays (version 97)
   335          Could not access system registry (version 97)
   336          ActiveX component not correctly registered (version 97)
   337          ActiveX component not found (version 97)
   338          ActiveX component did not correctly run (version 97)
   360          Object already loaded (version 97)
   361          Can't load or unload this object (version 97)
   363          Specified ActiveX control not found (version 97)
   364          Object was unloaded (version 97)
   365          Unable to unload within this context (version 97)
   368          The specified file is out of date. This program requires
                a newer version (version 97)
   371          The specified object can't be used as an owner form for
                Show (version 97)
   380          Invalid property value (version 97)
   381          Invalid property-array index (version 97)
   382          Property Set can't be executed at run time (version 97)
   383          Property Set can't be used with a read-only property
                (version 97)
   385          Need property-array index (version 97)
   387          Property Set not permitted (version 97)
   393          Property Get can't be executed at run time (version 97)
   394          Property Get can't be executed on write-only property
                (version 97)
   400          Form already displayed; can't show modally (version 97)
   402          Code must close topmost modal form first (version 97)
   419          Permission to use object denied (version 97)
   422          Property not found (version 97)
   423          Property or method not found
   424          Object required
   425          Invalid object use (version 97)
   429          ActiveX component can't create object or return
                reference to this object (version 97)
   430          Class doesn't support OLE Automation
   430          Class doesn't support Automation (version 97)
   432          File name or class name not found during Automation
                operation (version 97)

   438          Object doesn't support this property or method
   440          OLE Automation error
   440          Automation error (version 97)
   442          Connection to type library or object library for remote
                process has been lost (version 97)
   443          Automation object doesn't have a default value
                (version 97)
   445          Object doesn't support this action
   446          Object doesn't support named arguments
   447          Object doesn't support current locale settings
   448          Named argument not found
   449          Argument not optional
   449          Argument not optional or invalid property assignment
                (version 97)
   450          Wrong number of arguments
   450          Wrong number of arguments or invalid property assignment
                (version 97)
   451          Object not a collection
   452          Invalid ordinal
   453          Specified DLL function not found
   454          Code resource not found
   455          Code resource lock error
   457          This key is already associated with an element of this
                collection (version 97)
   458          Variable uses a type not supported in Visual Basic
                (version 97)
   459          This component doesn't support events (version 97)
   460          Invalid clipboard format (version 97)
   461          Specified format doesn't match format of data
                (version 97)
   480          Can't create AutoRedraw image (version 97)
   481          Invalid picture (version 97)
   482          Printer error (version 97)
   483          Printer driver does not support specified property
                (version 97)
   484          Problem getting printer information from the system.
                Make sure the printer is set up correctly (version 97)
   485          Invalid picture type (version 97)
   486          Can't print form image to this type of printer
                (version 97)
   735          Can't save file to Temp directory (version 97)
   744          Search text not found (version 97)
   746          Replacements too long (version 97)
   1000         Classname does not have propertyname property
                (versions 5.0 and 7.0)
   1001         Classname does not have methodname method
                (versions 5.0 and 7.0)
   1002         Missing required argument argumentname
                (versions 5.0 and 7.0)
   1003         Invalid number of arguments (versions 5.0 and 7.0)
   1004         Methodname method of classname class failed
                (versions 5.0 and 7.0)
   1005         Unable to set the propertyname property of the classname
                class (versions 5.0 and 7.0)
   1006         Unable to get the propertyname property of the classname

                class (versions 5.0 and 7.0)
   31001        Out of memory (version 97)
   31004        No object (version 97)
   31018        Class is not set (version 97)
   31027        Unable to activate object (version 97)
   31032        Unable to create embedded object (version 97)
   31036        Error saving to file (version 97)
   31037        Error loading from file (version 97)
				
para obter informações adicionais, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
142138  (http://support.microsoft.com/kb/142138/EN-US/ ) OFF: Uma explicação de detectável erros no Visual Basic para aplicações

Função de erro

A função de erro devolve a mensagem de erro que corresponde a um número determinado erro.

Exemplo utilizando a função de erro:
   Msgbox "The message text of the error is: " & Error(Err)
				

Declaração de erro

A instrução erro simula a ocorrência do erro, permitindo-lhe atribuir um número de erro personalizadas a função Err. Estes valores de erro definido pelo utilizador-são valores que pode definir para os procedimentos e que são sempre armazenadas em variáveis do tipo de dados variante. Uma utilização comum deste tipo de valor de erro é nos procedimentos que aceitam vários argumentos e devolvem um valor. Por exemplo, suponha que o valor devolvido é válido apenas se os argumentos incidem dentro de um determinado intervalo. O procedimento pode testar os argumentos que o utilizador forneça e se os argumentos não estiverem num intervalo aceitável, pode ter o retorno do procedimento o valor de erro adequada.

Erro é um subtipo do tipo de dados variante e quando é utilizado o termo "valor de erro", isto normalmente significa que é uma variável do tipo de variante e que contém um valor que o Visual Basic for Applications reconheça como um erro definido pelo utilizador. Valores de erro são utilizados num procedimento para indicar que ocorreram as condições de erro. Ao contrário dos erros durante a execução normais, estes erros não interrompem o código porque forem reconhecidos como variáveis normais e não os erros. Os procedimentos podem testar estes valores de erro e efectuar as acções correctivas adequadas.

Também pode utilizar a instrução de erro para simular erros de tempo de execução. Isto é especialmente útil quando estiver a testar as aplicações ou quando pretende tratar de uma determinada condição como sendo equivalente a um erro de tempo de execução. Qualquer Visual Basic for Applications run-time error pode ser simulado fornecendo o código de erro para o erro uma instrução de erro. Também pode utilizar a instrução de erro para criar os seus próprios erros definidos pelo utilizador, fornecendo um código de erro que não corresponde do Visual Basic for Applications run-time error. A tabela que contém uma lista de erros incorporados aparece neste artigo (na secção "Mensagem de função"). Neste momento, Visual Basic for Applications não utiliza todos os números disponíveis para erros internos. Em futuras versões do Visual Basic for Applications, os números internos aumentará como criado - erros são adicionados mais. Recomenda-se que inicie os números de erro no 50.000 e trabalhar da forma até 65.535 para evitar possíveis conflitos no futuro.

Exemplo utilizando o erro de declaração para Simulate Run-time erros:
   Sub Test()

      On Error Resume Next
      Error 50000          'set the value of Err to 50000

      If Err = 50000 Then
         MsgBox "my own error occurred"
      End If

   End Sub
				
quando testar a macro é executada, será apresentada uma caixa de mensagem que contém "as minhas próprias erro" como a mensagem.

Função ' CVErr '

A função CVErr é utilizada para criar valores de erro. CVErr função tem um argumento que tem de ser um número inteiro ou ser uma variável que contém um número inteiro.
   NoRadius = CVErr(2010)

   NotANumber = 2020
   InvalidArgument = CVErr(NotANumber)
				
exemplo utilizando a função ' CVErr:
   Public NoRadius, NotANumber

   Sub AreaOfCircle()
      Const PI = 3.142
      NoRadius = CVErr(2010)
      NotANumber = CVErr(2020)
      Radius = CheckData(InputBox("Enter the radius: "))
      If IsError(Radius) Then
         Select Case Radius
            Case NoRadius
               MsgBox "Error: No radius given."
            Case NotANumber
               MsgBox "Error: Radius is not a number."
            Case Else
               MsgBox "Unknown Error."
         End Select
      Else
         MsgBox "The area of the circle is " & (PI * Radius ^ 2)
      End If
   End Sub

   Function CheckData(TheRadius)
      If Not IsNumeric(TheRadius) Then
         CheckData = NotANumber
      ElseIf TheRadius = 0 Then
         CheckData = NoRadius
      Else
         CheckData = TheRadius
      End If
   End Function
				

Utilizar valores de erro incorporadas

Existem sete valores de erro incorporadas no Microsoft Excel. A tabela abaixo mostra o número de erro (constante), o valor de erro literal e o valor de erro convertidos.
Error number (Constant)   Literal error value     Converted error value
-----------------------------------------------------------------------

xlErrDiv0                   [#DIV/0!]               CVErr(xlErrDiv0)
xlErrNA                     [#N/A]                  CVErr(xlErrNA)
xlErrName                   [#NAME?]                CVErr(xlErrName)
xlErrNull                   [#NULL!]                CVErr(xlErrNull)
xlErrNum                    [#NUM!]                 CVErr(xlErrNum)
xlErrRef                    [#REF!]                 CVErr(xlErrRef)
xlErrValue                  [#VALUE!]
CVErr(xlErrValue)
				
trabalha com estes valores de erro de folha de cálculo incorporadas da mesma forma que trabalha com os erros definidos pelo utilizador--como números convertida para valores de erro utilizando a função ' CVErr '. A única diferença é que para os erros de folha de cálculo, o Visual Basic for Applications fornece os números de erro como constantes incorporadas e também fornece valores de erro literal. Estes itens não são fornecidos para valores de erro definido pelo utilizador. Os valores de erro literal deverão estar entre parênteses rectos, conforme mostrado na tabela acima.

Valores de exemplo utilizando erro incorporado:
   Function Commission(SharesSold,PricePerShare)
      If Not (IsNumeric(SharesSold) And IsNumeric(PricePerShare)) Then
         Commission = CVErr(xlErrNum)
      Else
         TotalSalePrice = ShareSold * PricePerShare
         If TotalSalePrice <= 15000 Then
            Commission = 25 + 0.03 * SharesSold
         Else
            Commission = 25 + 0.03 * (0.9 * SharesSold)
         End If
      End If
   End Function
				

Centralizar o código de processamento de erros

Quando adiciona o código de tratamento de erros para o Visual Basic para as macros, irá descobrir que os erros mesmos estão a ser processados repetidamente. Pode reduzir o tamanho do código e o esforço necessário para escrever código escrevendo alguns procedimentos que pode chamar o código de tratamento de erros para lidar com situações de erro comuns.

Segue-se um exemplo de um procedimento função que apresenta uma mensagem correspondente ao erro que ocorreu e sempre que possível, permite ao utilizador especificar que acção a tomar seguinte escolhendo um determinado botão. Em seguida, devolve o número de código ao procedimento chamado-lo.
   Public Const RESUME_STATEMENT = 0   'Resume
   Public Const RESUME_NEXT = 1        'Resume Next
   Public Const UNRECOVERABLE = 2      'Unrecoverable error
   Public Const UNRECOGNIZED = 3       'Unrecognized error
   Public Const ERR_DEVICEUNAVAILABLE = 68
   Public Const ERR_BADFILENAMEORNUMBER = 52
   Public Const ERR_PATHDOESNOTEXIST = 76
   Public Const ERR_BADFILEMODE = 54


  Function FileErrors(errVal As Integer) As Integer
   Dim MsgType As Integer, Msg As String, Response As Integer
      MsgType = vbExalamation
      Select Case errVal
         Case ERR_DEVICEUNAVAILABLE     'Error #68
            Msg = "That device is unavailable."
            MsgType = MsgType + vbAbortRetryIgnore
         Case BADFILENAMEORNUMBER      'Errors #64 & 52
            Msg = "That filename is not valid."
            MsgType = MsgType + vbOKCancel
         Case PATHDOESNOTEXIST      'Error #76
            Msg = "That path does not exist."
            MsgType = MsgType + vbOKCancel
         Case BADFILEMODE      'Error #54
            Msg = "Can not open the file for that type of access."
            MsgType = MsgType + vbOKCancel
         Case Else
            FileErrors = UNRECOGNIZED
            Exit Function
      End Select
      Response = MsgBox(Msg, MsgType, "Disk Error")
      Select Case Response
         Case vbOK, vbRetry
            FileErrors = RESUME_STATEMENT
         Case vbIgnore
            FileErrors = RESUME_NEXT
         Case vbCancel, vbAbort
            FileErrors = UNRECOVERABLE
         Case Else
            FileErrors = UNRECOGNIZED
      End Select
   End Function
				

Processar utilizador interrupções

Um utilizador pode interromper um procedimento do Visual Basic for Applications, premindo CTRL+BREAK ou ESC (COMMAND + ponto no Macintosh). É possível desactivar as interrupções para os procedimentos nas suas aplicações terminar. No entanto, se não desactivar as interrupções de utilizador no procedimento terminar, pode certificar-se de que o procedimento é notificado de quando ocorreu uma interrupção para que possa fechar ficheiros, desligar recursos partilhados ou restaurar variáveis modificadas antes de devolver o controlo da aplicação para o utilizador.

Pode aplicar véus interrupções de utilizador em procedimentos de definindo o EnableCancelKey propriedade xlErrorHandler. Quando esta propriedade estiver definida, todas as interrupções irão gerar um tempo de execução erro número 18, aplicados pode ser véus utilizando um erro na instrução. Pode tratar o erro para parar o procedimento e sair do programa. Se for utilizada a instrução de continuar para continuar o procedimento depois de um erro de tempo de execução trapped, a interrupção é ignorada.

Também é possível ignorar interrupções de utilizador completamente definindo a propriedade EnableCancelKey para xlDisabled. Neste estado, o Microsoft Excel ignora todas as tentativas pelo utilizador para interromper o procedimento em execução. Para restaurar a interrupção de predefinição de processamento, altere a definição da propriedade EnableCancelKey para xlInterrupt. Impedir que um procedimento desactivar permanentemente as interrupções do utilizador, o Microsoft Excel sempre repõe a predefinição da propriedade EnableCancelKey xlInterrupt sempre que o procedimento conclui a respectiva execução. Para garantir que as interrupções são processadas correctamente no seu código, tem que explicitamente desactive ou as interrupções de trap sempre que o procedimento é executado. Saliente se esse processador apenas uma interrupção pode ser utilizado para cada procedimento e que é utilizado o mesmo processador para todos os erros de tempo de execução encontrados por esse procedimento.

O exemplo seguinte demonstra um procedimento que requer um grande período de tempo a concluir. Se um utilizador interrompe o procedimento, aplicados véus um erro. A interrupção de utilizador primeiro confirma que o procedimento, na realidade, deve ser interrompido e, em seguida, sai o procedimento de uma forma ordenada.
   Sub ProcessData()
      'Set up a user interrupt trapping as a run-time error
      On Error GoTo UserInterrupt
      Application.EnableCancelKey = xlErrorHandler

      'Start a long duration task
      For x = 1 to 1000000
         For y = 1 to 10
         Next y
      Next x

      Exit Sub
   UserInterrupt:
      If Err = 18 Then
         If MsgBox ("Stop processing records?", vbYesNo) = vbNo Then
            'Continue running at the point procedure was interrupted
            Resume
         Else
            'Handle other errors that occur
            MsgBox Error(Err)
         End If
      End If
   End Sub
				
se executar a macro ProcessData e, em seguida, prima CTRL+BREAK rapidamente, é apresentada uma caixa de mensagem pede-lhe se pretende parar o processamento de registos. Se clicar em ' Sim ', aparece outra caixa de mensagem "Ocorreu de interrupção de utilizador". Se clicar em OK nesta caixa de mensagem, a macro termina. Se clicar em não na primeira caixa de mensagem, a macro continua.

Declaração de currículo

A instrução continuar retoma a execução de código depois de concluir um rotina de tratamento de erro.

Referências

Excel 97

Para mais informações sobre erros de macro do véu, clique no índice de tabulação no Microsoft Excel 97 ajuda do Visual Basic, escreva o seguinte texto
erros do véu
e faça duplo clique sobre o texto seleccionado para ir para o tópico "Erros detectável".

Excel 7.0

Para mais informações sobre erros de macro do véu, clique no índice de tabulação no Microsoft Excel 7.0 ajuda, escreva o seguinte texto
intercepção de erros
e faça duplo clique sobre o texto seleccionado para ir para o tópico "Erro de trap".

Excel 5.0

"Manual de utilizador do Visual Basic," versão 5.0, capítulo 9, "Processamento de erros e erro valores," consulte os seguintes tópicos:
  • "Impedir o código de parar ou agir de modo imprevisível"
  • "Criar valores de erro que não o código de interrupção"
  • "Utilizar os valores de erro incorporada do Microsoft Excel"
  • "Processamento de erros avançadas Techniques"

A informação contida neste artigo aplica-se a:
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
  • Microsoft Excel 5.0 Standard Edition
  • Microsoft Excel 5.0 para Macintosh
  • Microsoft Excel 5.0a para Macintosh
Palavras-chave: 
kbmt kbdtacode kbfaq kbhowto kbprogramming KB146864 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 146864  (http://support.microsoft.com/kb/146864/en-us/ )