VBA error handler in Worksheet_Change event

时间:2017-05-16 09:31:31

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

I have hit a bit of a stumbling block.

I would like to know how i would build an error handler to prevent a run time error. I accidentally typed in a non numerical number into the named cell ProductNumber and got a debug

This is the worksheet change code

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

These are the macros i am using for each cell

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

1 个答案:

答案 0 :(得分:1)

而不是错误处理程序为您的代码引入一些验证。你可以查看:

  • 如果输入值为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