2017-05-16 14 views
1

私はちょっとした障害にぶつかった。Worksheet_Changeイベントの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 
+2

が言って行を削除し、 'ヴァル= ...' - 彼らが使用されていないと(私は仮定)あなたのエラーの原因です。 'Select Case'ステートメントは、数値以外の値を無視するように設定されています。 – YowE3K

答えて

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 
+0

FWIW - 'var'が使用されていないので' Dim var As Variant''var = rng.Value'を削除できます。 – YowE3K

関連する問題