錯誤捕捉方式與 Visual Basic 應用程式在 Excel 中為 Mac

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

在此頁中

結論

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

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

其他相關資訊

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

範例使用 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
				

使用內建的錯誤值

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 會忽略所有嘗試被使用者中斷執行中的程序。若要還原預設插斷處理,EnableCancelKey 屬性的將設定變更為 xlInterrupt]。將以防止程序永久停用使用者插斷,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 Macintosh
  • Microsoft Excel 98 for Macintosh
關鍵字:?
kbmt kbdtacode kbhowto KB193247 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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