快速判斷工作簿中是否存在指定工作表

使用VBA代碼操作工作表時,如果工作表並不存在,那麼將產生運行時錯誤。爲了避免這種異常的發生,使用代碼操作任何表(不止侷限於工作表,也適用於宏表和圖表)之前應檢測該工作表是否存在。在代碼中這樣用到此功能,那麼將可以將此功能封裝爲一個自定義函數,在代碼中可以很方便的調用函數。


方法1:遍歷表對象

Function blnSheetExist1(ByVal strSheetName As String) As Boolean
    Dim objSht
    For Each objSht In ThisWorkbook.Sheets
        If UCase$(objSht.Name) = UCase$(strSheetName) Then
            blnSheetExist1 = True
            Exit For
        End If
    Next
End Function

【代碼解析】
第2行代碼聲明對象變量,由於該變量可能是工作表,也可以是宏表和圖表,因此聲明爲變體變量。
第3~8行代碼使用For ...Next循環結構變量工作簿中的表對象,其中Sheets是表對象的集合,包括工作表、宏表和圖表。
第4行代碼判斷名稱是否匹配。Excel工作表名稱不區分大小寫字符,也就是說在一個工作簿中不可能同時存在名稱爲“demo”和“DEMO”的工作表,所以此代碼中使用UCase$函數將名稱轉換爲大寫字符,然後進行比較。
如果名稱一致,那麼第5行代碼將函數返回值設置爲True,第6行代碼終止For ...Next循環。
如果循環結束,仍未找到指定的工作表,那麼函數返回值爲False


方法2:利用錯誤捕獲
如果工作簿中工作表較多,那麼每次調用函數將循環多次,影響代碼的整體效率。利用錯誤捕獲方法,可以更簡潔的實現相同的功能。

Function blnSheetExist2(ByVal strSheetName As String) As Boolean
    On Error Resume Next
    Debug.Print Sheets(strSheetName).Name
    If Err.Number = 0 Then blnSheetExist2 = True
    On Error GoTo 0
End Function

【代碼解析】
第2行代碼設置忽略運行時錯誤繼續執行代碼。
第3行代碼在立即窗口中輸出表名稱,此代碼並無實際意義,只是爲了調用指定對象,進而使用錯誤捕獲。
第4行代碼用於判斷是否已經發生了運行時錯誤。如果Err.Number = 0,說明並未產生運行時錯誤,此時將函數返回值設置爲True,否則返回值爲False
第5行代碼恢復系統的錯誤處理機制。

無論工作簿中有多少個工作表,此方法的運行時間都是相同的,起運行效率更高。

發佈了105 篇原創文章 · 獲贊 49 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章