首页 > 解决方案 > 为什么这里似乎忽略了 VBA 错误处理?

问题描述

当第 1 行为空时,以下语句(在循环中)以错误结束。
我原以为错误会被默默地忽略并处理下一张纸。激活
时代码如何停止?on error我希望它忽略错误并在skip标签后继续处理。

Sub listSheets()
    Dim sh As Worksheet, ar
    Dim a
    Set a = Application

    For Each sh In ThisWorkbook.Sheets
        Sheet1.Cells(3 + sh.Index, 1) = sh.Name
        On Error GoTo skip
        ar = sh.Range("1:1").SpecialCells(xlCellTypeConstants)  'code stops here if row 1 empty
        ar = a.Transpose(a.Transpose(ar))
        Sheet1.Cells(3 + sh.Index, 2) = Join(ar, "//")
        ar = Null
skip:
    Next sh
End Sub

注意:错误捕获设置为“中断未处理的错误”

标签: excelvbaerror-handling

解决方案


我相信原因在于您已经遇到了错误。但是,您从未从处理程序中清除您的错误。第二个错误不会再次跳过该行。

所以为了复制这个,我有三个工作表,第二个和第三个是空白行。您On Error Goto浏览了第二张纸,但会Error 1004在第三张纸上返回。

您可能想要包括一个Err.Clear

On Error Resume Next
    ar = sh.Range("1:1").SpecialCells(xlCellTypeConstants)  'error 1004 on certain sheets
skip:
    Err.Clear
Next sh

编辑:刚刚在这里找到了一个替代解决方案


即便如此,甚至可能完全放弃错误处理并使用类似的东西:

If WorksheetFunction.CountA(sh.Rows(1)) > 0 Then
    ar = sh.Range("1:1").SpecialCells(xlCellTypeConstants)
End If

推荐阅读