在 Excel 中为 Mac 的应用程序的 Visual basic 错误补漏白

文章翻译 文章翻译
文章编号: 193247 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

当运行时错误发生在一个 Microsoft Visual Basic 应用程序的宏时,屏幕上显示一条错误消息和宏是暂停或无法预测的行为。

若从崩溃或无法预测的方式运行应用程序中,您可以包括截获错误并说明如何处理它的宏的宏代码。截获并处理运行时错误的过程称为"错误补漏白。通知应用程序如何处理错误的说明的一组称为"错误处理例程"或"错误处理程序。

更多信息

Microsoft 提供的编程示例只,用于说明不附带任何明示或暗示保证。这包括,但不限于对适销性或针对特定用途的适用性的暗示的担保。本文假定您熟悉演示了正在使用的编程语言以及用于创建和调试过程的工具。Microsoft 支持工程师可以帮助解释某个特定过程的功能,但他们不会修改这些示例以提供额外的功能或构建过程来满足您的具体要求。在 Visual Basic 代码运行时,您可能会遇到几种类型的可捕获的错误。您可以利用错误捕获在 Excel 中为 Mac 通过使用以下函数和语句。

错误声明上

On Error 语句使 Visual Basic 应用程序启动或停止错误补漏白。On Error 语句还可以指定一组语句执行如果遇到错误。

错误函数

Err 函数返回时遇到错误数。

使用 Err 函数示例:
   Msgbox "The most recent error number is " & Err & _
      ". Its message text is: " & Error(Err)
				
下表包含使用 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           This array is fixed or temporarily locked
   11           Division by zero
   13           Type mismatch
   14           Out of string space
   16           Expression too complex
   17           Can't perform requested operation
   18           User interrupt occurred
   20           Resume without error
   28           Out of stack space
   35           Sub, function, or property not defined
   47           Too many DLL application clients
   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 or With block variable not set
   92           For Loop not initialized
   93           Invalid pattern string
   94           Invalid use of Null
   298          System DLL could not be loaded
   320          Can't use character device names in specified file names
   321          Invalid file format
   322          Can't create necessary temporary file
   325          Invalid format in resource file
   327          Data value named was not found
   328          Illegal parameter; can't write arrays
   335          Could not access system registry
   336          ActiveX component not correctly registered
   337          ActiveX component not found
   338          ActiveX component did not correctly run
   360          Object already loaded
   361          Can't load or unload this object
   363          Specified ActiveX control not found
   364          Object was unloaded
   365          Unable to unload within this context
   368          The specified file is out of date. This program requires
                a newer version
   371          The specified object can't be used as an owner form for
                Show
   380          Invalid property value
   381          Invalid property-array index
   382          Property Set can't be executed at run time
   383          Property Set can't be used with a read-only property
   385          Need property-array index
   387          Property Set not permitted
   393          Property Get can't be executed at run time
   394          Property Get can't be executed on write-only property
   400          Form already displayed; can't show modally
   402          Code must close topmost modal form first
   419          Permission to use object denied
   422          Property not found
   423          Property or method not found
   424          Object required
   425          Invalid object use
   429          ActiveX component can't create object or return
                reference to this object
   430          Class doesn't support OLE Automation
   430          Class doesn't support Automation
   432          File name or class name not found during Automation
                operation
   438          Object doesn't support this property or method
   440          OLE Automation error
   440          Automation error
   442          Connection to type library or object library for remote
                process has been lost
   443          Automation object doesn't have a default value
   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 or invalid property assignment
   450          Wrong number of arguments or invalid property assignment
   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
   458          Variable uses a type not supported in Visual Basic
   459          This component doesn't support events
   460          Invalid Cipboard format
   461          Specified format doesn't match format of data
   480          Can't create AutoRedraw image
   481          Invalid picture
   482          Printer error
   483          Printer driver does not support specified property
   484          Problem getting printer information from the system.
                Make sure the printer is set up correctly
   485          Invalid picture type
   486          Can't print form image to this type of printer
   735          Can't save file to Temp directory
   744          Search text not found
   746          Replacements too long
   31001        Out of memory
   31004        No object
   31018        Class is not set
   31027        Unable to activate object
   31032        Unable to create embedded object
   31036        Error saving to file
   31037        Error loading from file
				

错误函数

错误 函数返回给定的错误号相对应的错误消息。

使用 错误 功能的示例:
   Msgbox "The message text of the error is: " & Error(Err)
				

错误报告

Error 语句使您可以将一个自定义的错误号分配给 Err 函数,从而模拟错误的发生。这些用户的定义错误值是为您的过程定义,并始终 Variant 数据类型的变量中存储的值。这种类型的错误值的一个常见用途是在接受多个参数并返回一个值的过程中。例如对于假设返回值是位于某一特定范围内的参数的情况下,才有效。您的过程可以测试该参数的用户提供了,参数,如果参数不在可接受的范围中,您可以有过程返回相应的错误值。

错误Variant 数据类型子类型,在使用术语"错误值"时将通常表明变量是 Variant 类型的并且包含一个值,它为应用程序的 Visual Basic 将识别为一个用户定义的错误。错误值在过程中用于指示发生了错误条件。与不同的是正常的运行时错误这些错误并不要中断您的代码,因为它们被识别为普通变量并不是错误。您的过程可以测试这些错误值,并采取适当的纠正措施。

您还可以使用 Error 语句来模拟的运行时错误。当您正在测试您的应用程序时或当您希望将特定的条件视为为相当于运行时错误时,这是非常有用。可以将应用程序运行时错误的任何 Visual Basic 模拟通过提供在使用 Error 语句中错误的错误代码。您还可以使用 Error 语句通过提供一个错误代码,并不对应于为应用程序运行时错误的 Visual Basic,创建您自己用户定义的错误。在"错误活动"部分中) 下本文内上文中将显示包含列表的内置的错误表。这次 Visual Basic 应用程序不使用所有可用号码的内置的错误。在将来的 Visual Basic 应用程序的版本内部号码将提高,因为多内置-添加在错误。建议您启动您的错误号码 50,000,您最多为 65,535 以在将来避免发生冲突的方式工作。

示例使用 错误 语句,以模拟运行时错误:
   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
				
运行时,测试宏时,您会收到一个消息框,其中包含"我自己错误出现"以该邮件。

CVErr 函数

若要创建错误值使用 CVErr 函数。CVErr 函数采用一个参数,必须或者是一个整数,或者是包含整数的变量。
   NoRadius = CVErr(2010)

   NotANumber = 2020
   InvalidArgument = CVErr(NotANumber)
				
使用 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
				

使用内置的错误值

Mac.的 Excel 中有七个内置的错误值下表显示了错误号 (常数)、 文本错误值和已转换的错误值。
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)
				
使用相同的方式使用该用户定义的错误--数字转换为错误值使用 CVErr 函数这些内置的工作表错误值。唯一的区别在于为工作表错误,Visual Basic 应用程序提供的错误号,为内置的常数,并提供了原义的错误值。这些项目不提供对于用户定义的错误值。原义的错误值必须括在方括号内,如上表所示。

使用内置的错误值的示例:
   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
				

集中错误处理代码

当将错误处理代码添加到您的应用程序的宏的 Visual Basic 时,您将会发现会被反复处理同一错误。您可以减少您的代码和通过编写错误处理代码可以调用来处理常见的错误情况的几个过程中编写代码所需工作量的大小。

下面是一个示例的函数过程发生了错误将显示相应的一条消息,并在可能的情况下,允许用户指定要通过选择某个特定按钮执行下一次的操作。然后将代码编号返回到调用它的过程。
   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
				

处理用户中断

用户可以通过按命令 + 句点中断一个 Visual Basic 应用程序的过程。很可能禁用已完成应用程序中的过程的中断。但是,如果您不要禁用已完成的过程中用户中断,您可以确保当出现中断,以便它可以关闭文件、 从共享的资源断开连接或返回给用户应用程序的控件之前还原已修改的变量时通知您的过程。

可将用户中断过程中补漏白通过将 EnableCancelKey 属性设置为 xlErrorHandler 中。当此属性设置所有中断将都生成运行时错误号 18,可使用 On Error 语句捕获。您可以处理停止该过程并退出该程序错误。如果使用 Resume 语句将继续该过程之后安装的运行时错误,中断将被忽略。

也可能是由 EnableCancelKey 属性设置为 xlDisabled 完全忽略用户中断。在这种状态的 Mac 的 Excel 会忽略所有试图被用户中断当前正在运行的过程。若要恢复默认中断处理,更改 xlInterruptEnableCancelKey 属性的设置。要防止过程永久禁用用户中断 Mac 的 Excel 始终恢复 EnableCancelKey 属性的默认设置 xlInterrupt 时该过程完成其执行。若要确保在代码内正确处理中断,您必须显式禁用或补漏白中断,每次执行该过程。值得注意的是,只有一个中断处理程序可用于每个过程中,和相同的处理程序用于通过该过程中遇到的所有运行时错误。

下面的示例演示一个过程,需要一大段时间才能完成该过程。如果用户中断过程,被捕获错误。用户中断首先确认该过程应该实际暂停的然后退出该过程,以有序的方式。
   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
				
如果运行 ProcessData 宏,并且然后快速按下 CTRL + BREAK 会显示一个消息框,提示您是否要停止处理记录。 如果 单击会显示与"出现用户中断"的另一个消息框。如果单击 确定,该消息框中,则在宏结束。如果您单击 ,第一个消息框中,该宏将继续。

继续语句

Resume 语句在完成对错误处理例程之后继续执行代码。

属性

文章编号: 193247 - 最后修改: 2007年1月23日 - 修订: 5.4
这篇文章中的信息适用于:
  • Microsoft Excel 2004 for Mac
  • Microsoft Excel X for Mac
  • Microsoft Excel 2001 for Mac
  • Microsoft Excel 98 for Macintosh
关键字:?
kbmt kbdtacode kbhowto KB193247 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 193247
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com