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

VBA error handler in Worksheet_Change event

我碰到了一点绊脚石

我想知道如何构建错误处理程序来防止 运行 时间错误。我不小心在命名单元格 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... 逻辑的整数。

Worksheet_Change

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