VBA中的错误处理方法
操作方法
- 01
从理论上讲,VBA没有供给任何的过错处置机制,这种被用在微软Office商品中的以Visual Basic言语为根底的脚本言语底子就不要任何的过错处置,当程序呈现过错或发作反常情况时,VBA会主动定位到犯错的代码行,然后提示用户犯错的能够缘由。这是典型的脚本言语的过错提示,联想到JavaScript言语,在浏览器中若是呈现脚本过错,浏览器会给出提示信息,但这并不影响整个程序的正常运转,最多也即是呈现过错之后的脚本不被持续解说罢了。不过即便如此,Javascript仍是供给了较为杰出的过错处置机制,例如常见的try catch句子和alert提示,以及后来撑持的debugger调试信息等,javascript在撑持面向目标言语特性的一起也逐步改进了它的过错处置和调试办法。 可是Visual Basci却没有这么走运,从诞生之初,Visual Basic就没有供给一个对比好的过错处置机制,虽然咱们在实践运用中总会遇到这样或那样的运转时过错(例如过错删去文件、磁盘驱动器空间不行、网络通讯发作反常等),可是关于Visual Basic的进程来说底子就没有过错处置,当过错发作时程序便中止运转,直到反常被铲除。有关对比详细的介绍Visual Basic的过错处置和调试办法的文章, VBA的言语特性类似于Visual Basic,大概说它们归于同一宗族,所以,用来在Visual Basic中处置程序反常的办法也一样能够被用在VBA中。 在Visual Basic中,常用的程序过错处置的办法是设置或运用过错圈套,以通知运用程序当过错发作时转移到何处(或处置当过错发作时要运转的代码),经过在代码中界说标签来奉告运用程序当过错发作时要转到的当地。这一点和C系列言语的过错处置办法是一样的。根本进程如下: 1. 设置一个有用的过错圈套,以通知运用程序发作过错时转移到何处持续运转。Visual Basic中的On Error句子能够使过错圈套有用,并为运用程序指定过错处置的进口。 2. 在过错程序的进口处编写呼应过错的详细完成,如持续测验履行之前的代码、或奉告用户犯错的详细缘由以让用户测验去处置等。 3. 退出过错处置。 有关怎么运用Visual Basic的过错处置和On Error句子的详细意义,读者能够仔细阅读上面给出的那个连接的文章,里边有十分详细的介绍。我在这里会结合实践运用来讲讲在VBA中怎么详细运用过错处置。 先看一个简略的示例。Private Sub CommandButton1_Click() On Error GoTo Err_Handle Dim a As Integer Dim b As Integer Dim c As Integer a = 10 b = 0 c = a / b '除数为0会致使运转时过错 MsgBox c End SubErr_Handle: MsgBox Err.DescriptionEnd Sub 在上述进程中,咱们首要经过On Error句子设置了一个过错圈套,该过错圈套将主动被激活,一起过错圈套指向了代码中界说的标签Error_Handle。当进程被调用时,若是呈现反常,程序会主动运转标签所指向的代码段,这里会给用户一个提示。Err目标为体系目标,其间包括了当过错发作时的描绘信息和过错编号,依据Err目标供给的这些简略信息咱们或许能够奉告用户运用程序发作了什么事情,然后结尾找出犯错的详细缘由。 在Visual Basic中,咱们经过On Error句子设置并激活了一个过错圈套,直到程序退出进程或办法,该过错圈套会一向有用。也即是说,咱们需求给每一个进程或办法在需求的时分设置独自的过错圈套,这个有点类似于C的代码中在需求的当地刺进try catch句子,过错处置程序在进程或办法内部界说的标签开端的当地,在程序运转时若是过错没有呈现,则标签之后的代码大概不会被履行到,因而咱们一般都需求在过错处置代码前刺进退出句子,例如End Sub或办法的回来句子。 走运的是咱们一般没有必要为每一个进程或办法界说过错圈套,在VBA中,往往只要一少有些进程或办法需求界说过错圈套,可是不扫除杂乱的VBA运用程序,当代码量到达上千行,进程或办法上百个时,大概不亚于一个小的VB体系,这个时分编写一个专门的过错处置函数仍是很有必要的。在需求进行过错处置的进程或办法中设置好过错圈套和用于处置过错的标签,然后在标签后调用过错处置函数并传入Err目标,由过错处置函数专门处置程序中各种不一样的过错。这个程序看起来大致是下面这个姿态。'-----Err number-----Private Const ErrNoPermissions = -2147217900Private Const ErrCannotLocateURL = -2146697211Private Const ErrDbDenyConnect = -2147217843Private Const ErrCannotFoundDbProvider = 3706'--------------------' Errors handle:' Return Description' 0 Resume' 1 Resume Next' 2 ErrorFunction ErrorsHandle() As Integer Dim intMsgType As Integer, intResponse As Integer, strMsg As String Dim myDoc As Worksheet Set myDoc = ActiveSheet Select Case Err.Number Case ErrCannotLocateURL ' Error -2146697211 strMsg = "Cannot connect to the Website specified. Please make sure the URL is correct and the website is available." intMsgType = VBRetryCancel Case ErrNoPermissions ' Error -2147217900 myDoc.Protect 'Protect the sheet if current user doesn't have permissions to Access the data strMsg = "User " & glUserName & " doesnt have permissions to access the data." intMsgType = vbExclamation Case ErrCannotFoundDbProvider ' Error 3706 strMsg = "Please ensure 'Microsoft SQL Server Native Client for SQL2005' installed at first." & _ "You can download at :http://download.microsoft.com/download/4/4/D/" & _ "44DBDE61-B385-4FC2-A67D-48053B8F9FAD/sqlncli.msi" intMsgType = vbExclamation Case ErrDbDenyConnect ' Error -2147217843 myDoc.Protect 'Protect the sheet if current user doesn't have permissions to connect the database strMsg = "Database login failed for user '" & glUserName & "'." intMsgType = vbExclamation Case Else strMsg = "Fatal error." & Err.Description & ".The error number is " & Err.Number intMsgType = vbCritical End Select intResponse = MsgBox(strMsg, intMsgType) Select Case intResponse Case 4, 6 ' Retry And Yes ErrorsHandle = 0 Case 5 ' Ignore ErrorsHandle = 1 Case Else ' Cancel and Abort ErrorsHandle = 2 End SelectEnd Function 略微做一下解说。当程序发作过错时,Err目标的Number特点会回来一个过错代码,ErrorsHandle函数得到这个过错代码并经过Select Case句子逐个比对过错代码,找到事前界说好的过错处置办法然后回来给用户最准确的信息。程序的一开端界说了一组常量用来描绘过错代码所表明的详细意义,在Select Case句子中依据不一样的过错代码回来给用户不一样的过错描绘信息,而且依据过错的品种弹出不一样类型的提示框(如断定、重试、撤销等),这个是由MsgBox常数所决议的,该常数分为许多品种,能够弹出各种不一样类型的提示框,读者能够自个查阅Office协助文档。若是需求,咱们能够随时在Select Case句子中弥补更多的内容来定制内容更丰厚的过错处置办法,而只需求承认何种过错代码代表何种详细的过错信息即可,这个过错信息咱们也能够经过Err.Description特点来获取,虽然这个描绘信息一般都并不那么准确。最终ErrorsHandle函数会回来三种不一样的成果(当然若是需求你能够让这个函数回来更多的值),用以表明调用它的进程或办法怎么持续处置,是停止程序运转,仍是测验再次运转,或许疏忽过错持续运转下面的代码等。