與 Visual Basic 應用程式的錯誤捕捉方式

文章翻譯 文章翻譯
文章編號: 146864 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

執行階段錯誤時在一個 Microsoft Visual Basic 應用程式的巨集的在螢幕上出現錯誤訊息及巨集可能是中止或預期的行為。

若要避免應用程式當機或運作不正常,您可以包含巨集程式碼,會攔截錯誤,並告知巨集如何處理它。攔截和處理執行時期錯誤的處理程序就稱為錯誤捕捉。組的指示,告訴應用程式如何處理錯誤稱為 「 錯誤處理常式"或"錯誤處理常式 」。

其他相關資訊

Microsoft 僅,為了說明提供程式設計範例,不提供任何明示或默示的保證。這包括,但不限於適售性或適合某特定用途之默示擔保責任。本文假設您已熟悉使用我們所示範的程式設計語言以及建立和偵錯程序所使用的工具。Microsoft 技術支援工程師可以協助解釋特定程序的功能,但它們不會修改這些範例以提供附加功能或建構程序,以符合您特定需求。執行 Visual Basic 程式碼時您可能會遇到幾種類型的可截獲的錯誤。您可以利用錯誤設陷在 Microsoft Excel 中使用下列的函式及陳述式。

在錯誤的陳述式

On Error 陳述式會使 Visual Basic 應用程式啟動或停止錯誤設陷。On Error 陳述式也會指定一組如果發生錯誤執行的陳述式。

如需詳細資訊請參閱下列文件 「 Microsoft 知識庫 」 中:
141571如何使用 「 開啟錯誤 」 來處理中的巨集錯誤

錯誤函式

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           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)
				
如需詳細資訊請參閱下列文 「 Microsoft 知識庫 」 中:
142138OFF: 的說明 Visual Basic 中可截獲錯誤的應用程式

錯誤函式

錯誤函數會傳回錯誤訊息對應到指定的錯誤號碼。

使用錯誤函數的範例:
   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 的方式,以避免在未來可能發生的衝突。

來模擬範例使用 Error 陳述執行階段錯誤:
   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
				

使用內建的錯誤值

在 Microsoft 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 藉由按下 CTRL + BREAK 或 ESC 鍵 (指令 + 句號在 Macintosh 上)。很可能停用在您完成的應用程式中的程序的插斷。不過,如果您不要停用使用者插斷,已完成的程序中,您可以請確定您的程序會被插斷已發生,讓它可以關閉檔案、 中斷共用資源,或傳回給使用者應用程式的控制項之前還原修改過的變數時通知。

您可以在程序中截取使用者插斷,藉由設定 [EnableCancelKey 要 xlErrorHandler 屬性。所有的插斷時這個屬性設定會產生執行階段錯誤代碼 18,可以使用 On Error 困的陳述式。您可以處理以中止程序並結束程式錯誤。 如果 Resume 陳述式用來在格式將補漏白的執行階段錯誤後繼續程序,插斷會被忽略。

另外,也可以藉由 EnableCancelKey 屬性設定為 xlDisabled 完全忽略使用者插斷。在此狀態 Microsoft Excel 會忽略所有嘗試被使用者中斷執行中的程序。若要還原預設插斷處理,EnableCancelKey 屬性的將設定變更為 xlInterrupt]。將以防止程序永久停用使用者插斷,Microsoft 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 陳述式會繼續執行程式碼。

?考

Excel 97

如需有關補漏白巨集錯誤的詳細資訊,按一下 [索引] 索引標籤在 Microsoft Excel 97 Visual Basic 說明],鍵入下列文字
截取錯誤
然後再連按兩下所選取的文字,以移至可截獲的錯誤 > 主題。

Excel 7.0

如需有關如何補漏白巨集錯誤的詳細資訊,按一下 [索引] 索引標籤在 Microsoft Excel 在 7.0 版的說明],鍵入下列文字
錯誤捕捉方式
然後再連按兩下所選取的文字,以移至錯誤截取 」 主題。

Excel 5.0

"Visual Basic 使用者指南,"5.0 第 9 章、 」 處理錯誤和錯誤值,"版中,請參閱下列主題:
  • "防止您從暫停或做正常的程式碼 」
  • "建立不會干擾您的程式碼的錯誤值"
  • [使用 Microsoft Excel 的內建的錯誤值"
  • 「 進階錯誤處理技術 」

屬性

文章編號: 146864 - 上次校閱: 2007年1月19日 - 版次: 3.4
這篇文章中的資訊適用於:
  • 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 for Macintosh
  • Microsoft Excel 5.0a for Macintosh
關鍵字:?
kbmt kbdtacode kbfaq kbhowto kbprogramming KB146864 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:146864
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