gpt4 book ai didi

excel - 使用 Resume Next 在循环中处理错误

转载 作者:行者123 更新时间:2023-12-04 08:09:12 25 4
gpt4 key购买 nike

作为 VBA 的新手,我们将不胜感激。我的程序的基本点是遍历电子表格的列,并在指定范围内计算每列中非空白单元格的数量。
这是我的电子表格的示例。



1
2
3


1

事物

2

事物

3

事物



当列中的所有单元格都为空白时,VBA 会抛出 1004 错误,未找到单元格。我要做的是说,如果发生1004错误,将非空白单元格(nonBlank = 0)的计数设置为零,如果没有发生错误,则正常计数。在 Python 之类的东西中,我会使用 try/except。这是我的尝试。

For i = 1 To 3

On Error Resume Next
Set selec_cells = Sheet1.Range(Sheet1.Cells(FirstRow, i), Sheet1.Cells(LastRow, i)).SpecialCells(xlCellTypeVisible).Cells.SpecialCells(xlCellTypeConstants)

If Err.Number <> 1004 Then
nonBlank = 0
Else
nonBlank = selec_cells.Count
End If
On Error GoTo -1

Next i
我的问题是,当我运行这段代码时,它每次都会吐出 0,即使第 2 列应该返回 3。谢谢!
编辑: select_cells 是抛出错误的原因。

最佳答案

错误处理

  • 没有On Error Goto -1 VBA ,这是一个 VB 东西(这些是指向不同页面的链接)。如果你用谷歌搜索 VBA东西,放VBA 在你要找的东西前面。
  • 使用 On Error Resume Next 时(延迟错误捕获),您应该最多将其“应用”在一两行上,并使用 On Error Goto 0 “关闭” (禁用错误捕获)或使用另一个错误处理程序。
  • 您对 On Error Resume Next 的使用情况是 Not Acceptable ,因为在这种特殊情况下,我们可以测试范围:1. 延迟错误处理,2. 尝试设置范围,3. 禁用错误处理。如果出现错误,则不会设置范围,因此 If Not rg Is Nothing Then可以翻译为“如果 rg 是某事那么”(双重否定)或如果已创建对范围的引用则。
  • 第二种解决方案说明了主错误处理程序正在处理除 SpecialCells 之外的所有错误的情况。 error 有自己的错误处理程序。 Resume Next表示继续发生错误的行之后的行。注意 Exit Sub行和注释Resume ProcExit代码被重定向到标签的地方。
  • 以下说明了如何处理此问题的两种方法。在这个阶段,我建议你使用第一个并记住使用“关闭”On Error Goto 0每当您使用 On Error Resume Next (一两行)。

  • 代码
    Option Explicit

    Sub testOnErrorResumeNext()

    Const FirstRow As Long = 2
    Const LastRow As Long = 11

    Dim rg As Range ' ... additionally means 'Set rg = Nothing'.
    Dim nonBlank As Long ' ... additionally means 'nonBlank = 0'.
    Dim j As Long

    For j = 1 To 3 ' Since it's a column counter, 'j' or 'c' seems preferred.

    ' Since you're in a loop, you need the following line.
    Set rg = Nothing
    On Error Resume Next
    Set rg = Sheet1.Range(Sheet1.Cells(FirstRow, j), _
    Sheet1.Cells(LastRow, j)).SpecialCells(xlCellTypeVisible) _
    .Cells.SpecialCells(xlCellTypeConstants)
    On Error GoTo 0

    If Not rg Is Nothing Then
    nonBlank = rg.Cells.Count
    Else
    ' Since you're in a loop, you need the following line.
    nonBlank = 0
    End If

    Debug.Print nonBlank

    Next j

    End Sub

    Sub testOnError()

    On Error GoTo clearError

    Const FirstRow As Long = 2
    Const LastRow As Long = 11

    Dim rg As Range ' ... additionally means 'Set rg = Nothing'.
    Dim nonBlank As Long ' ... additionally means 'nonBlank = 0'.
    Dim j As Long

    For j = 1 To 3 ' Since it's a column counter, 'j' or 'c' seems preferred.

    ' Since you're in a loop, you need the following line.
    Set rg = Nothing
    On Error GoTo SpecialCellsHandler
    Set rg = Sheet1.Range(Sheet1.Cells(FirstRow, j), _
    Sheet1.Cells(LastRow, j)).SpecialCells(xlCellTypeVisible) _
    .Cells.SpecialCells(xlCellTypeConstants)
    On Error GoTo clearError

    If Not rg Is Nothing Then
    nonBlank = rg.Cells.Count
    End If

    Debug.Print nonBlank

    Next j

    ProcExit:
    Exit Sub ' Note this.

    SpecialCellsHandler:
    ' Since you're in a loop, you need the following line.
    nonBlank = 0
    Resume Next

    clearError:
    MsgBox "Run-time error '" & Err.Number & "': " & Err.Description
    Resume ProcExit

    End Sub

    关于excel - 使用 Resume Next 在循环中处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66069280/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com