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
我碰到了一点绊脚石
我想知道如何构建错误处理程序来防止 运行 时间错误。我不小心在命名单元格 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