excel - Worksheet_Change事件中的VBA错误处理程序

标签 excel error-handling runtime-error excel-2013 vba

我遇到了一个绊脚石。

我想知道如何构建错误处理程序以防止运行时错误。我不小心在命名单元格ProductNumber中输入了非数字,并进行了调试

这是工作表更改代码

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Target.Worksheet.Range("People_working_on_Campaign")) Is Nothing Then
        Toggle_Rows
    Else
    End If

    If Not Intersect(Target, Target.Worksheet.Range("ProductNumber")) Is Nothing Then
        Toggle_Rows2
    Else
    End If

End Sub

这些是我用于每个单元格的宏
Sub Toggle_Rows()
    Dim Sheet As Worksheet: Set Sheet = ThisWorkbook.Worksheets("ROI Calculator")
    Dim val As Integer

    val = Sheets("ROI Calculator").Range("People_working_on_Campaign").Value

    Select Case Sheet.Range("People_working_on_Campaign").Value2
        Case 1 To 10
            Sheet.Rows("45:59").Hidden = True
            Sheet.Rows(45).Resize(Sheet.Range("People_working_on_Campaign").Value2).Hidden = False
    End Select

End Sub

Sub Toggle_Rows2()
    Dim Sheet As Worksheet: Set Sheet = ThisWorkbook.Worksheets("ROI Calculator")
    Dim val As Integer

    val = Sheets("ROI Calculator").Range("ProductNumber").Value

    Select Case Sheet.Range("ProductNumber").Value2
        Case 1 To 9
            Sheet.Rows("4:12").Hidden = True
            Sheet.Rows(4).Resize(Sheet.Range("ProductNumber").Value2).Hidden = False
    End Select

End Sub

最佳答案

代替错误处理程序,对您的代码进行一些验证。您可以检查:

  • 如果输入值IsNumeric
  • 如果是,则执行Select Case...逻辑
  • 如果不是,那么再做其他事情

  • 我快速重新编写了您的代码。
  • Worksheet_Change中,您可以将Range传递给子例程,以防止需要重新定义它。
  • 在子例程中,将单元格值的变量定义为Variant,这意味着它可以接受任何数据类型。然后,您可以使用IsNumeric来检查输入是否为数字,并使用CLng来获取Select Case...逻辑的整数。

  • 工作表_更改
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim ws As Worksheet
    
        ' set a reference to worksheet of Target and use it below
        Set ws = Target.Worksheet
    
        If Not Intersect(Target, ws.Range("People_working_on_Campaign")) Is Nothing Then
            Toggle_Rows Target
        End If
    
        If Not Intersect(Target, ws.Range("ProductNumber")) Is Nothing Then
            Toggle_Rows2 Target
        End If
    
    End Sub
    

    子例程
    Option Explicit
    
    ' rng is going to be People_working_on_Campaign
    Sub Toggle_Rows(rng As Range)
    
        Dim var As Variant
    
        ' get value of range
        var = rng.Value
    
        ' test if range is numeric
        If IsNumeric(var) Then
            ' test range value - CLng will convert to Long which is preferred to Integer
            Select Case CLng(var)
                Case 1 To 10
                    rng.Worksheet.Rows("45:59").Hidden = True
                    rng.Worksheet.Rows(45).Resize(rng.Value2).Hidden = False
                Case Else
                    ' do something else ?
             End Select
        Else
            MsgBox "You should enter an integer to People_working_on_Campaign"
        End If
    
    End Sub
    
    ' rng will be ProductNumber
    Sub Toggle_Rows2(rng As Range)
    
        Dim var As Variant
    
        ' get value of range
        var = rng.Value
    
        ' test if range is numeric
        If IsNumeric(var) Then
            ' test range value - CLng will convert to Long which is preferred to Integer
            Select Case CLng(var)
                Case 1 To 9
                    rng.Worksheet.Rows("4:12").Hidden = True
                    rng.Worksheet.Rows(4).Resize(rng.Value2).Hidden = False
                Case Else
                    ' do something else ?
             End Select
        Else
            MsgBox "You should enter an integer to ProductNumber"
        End If
    
    End Sub
    

    关于excel - Worksheet_Change事件中的VBA错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43997602/

    相关文章:

    rest - asp.net Web Api - 默认错误消息

    javascript - RethinkDB 抛出错误而不是在回调中返回错误

    python - 为什么将我的数据转换为 ndarray 会给我 'python' 信号 SIGBUS 终止(地址未对齐错误)?

    compiler-errors - 尖齿: RUNTIME ERROR: Compilation error on line 22. Index out of range taking subset of w

    vba - 需要按顺序写出月份

    excel - 尝试根据第一列删除重复项

    python - 使用 python pandas 读取 sharepoint excel 文件

    c# - Interop.Excel 和 Tools.Excel 之间的区别?

    php - 如何在 PHP 中禁用错误​​抑制 "@"运算符?

    php - Symfony2中用于开发和生产的不同错误模板