在 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 valuexlErrDiv0                   [#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 语句在完成对错误处理例程之后继续执行代码。
xl98 xl2001 xl2004 XLX

警告:本文已自动翻译

属性

文章 ID:193247 - 上次审阅时间:12/05/2015 09:21:18 - 修订版本: 5.4

Microsoft Excel 2004 for Mac, Microsoft Excel X for Mac, Microsoft Excel 2001 for Mac, Microsoft Excel 98 for Macintosh

  • kbnosurvey kbarchive kbmt kbdtacode kbhowto KB193247 KbMtzh
反馈