2016-09-13 6 views
0

いくつかのセルの入力値を確認するマクロを書きました。入力が8より大きい場合、余剰は別のセルに書き込まれ、入力は8に変更され、入力が8より小さい場合は、欠損量が第3のセルに書き込まれます。 これは私がセルの値を編集するマクロ

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
TA = Target.Address: R = Target.Row: C = Target.Column 
If C = 2 Or C = 7 Then 
    If (R < 19 And R > 11) Or (R < 33 And R > 25) Then 
    Hours = Cells(R, C).Value 
    If Hours <> 0 Then 
     If Hours > 8 Then 
     Cells(R, C) = 8 
     Cells(R, C + 1) = Hours - 8 
     End If 
     If Hours < 8 Then 
     Cells(R, C + 2) = 8 - Hours 
     End If 
    End If 
    End If 
End If 
End Sub 

を書いたコードは、問題は、私は、入力を入力したときに、マクロが実行されていないということですが、私は再び、セルを選択した場合のみ。エラーはどこですか?

答えて

1

最初にトリガーイベントをから変更してください。Worksheet_SelectionChange to Worksheet_Change

とのプロパティをTargetと読むことができるので、コードを最適化することができます。コードにいくつかの行を保存できます。

第3に、行を確認するためのテスト条件を変更しました。Select Caseに切り替えることで、この条件にさらに多くの行を簡単に追加できるようになりました。

Target.offsetを使用して隣接セルに結果を挿入します。

Exit Subを追加しましたので、ここで値を変更してから余分な時間がかかりません。

必要に応じて、Hoursが不要なので削除することもできます(この値を何らかの形で読み取るグローバル変数がない限り)。

あなただけ

Private Sub Worksheet_Change(ByVal Target As Range) 

' check if target is in Column B or Column G 
If Target.Column = 2 Or Target.Column = 7 Then 

    Select Case Target.Row 
     Case 12 To 18, 26 To 32 ' check if target row is 12 to 18 (including) ir between 26 to 32 (including) 

      Hours = Target.Value 
      If Hours <> 0 Then 
       If Hours > 8 Then 
        Target.Value = 8 
        Target.Offset(0, 1).Value = Hours - 8 
        Exit Sub 
       Else 
        If Hours < 8 Then 
         Target.Offset(0, 2).Value = 8 - Hours 
        End If 
        Exit Sub 
       End If 
      End If 
    End Select 
End If 

End Sub 
If Target.Value <> 0 Thenなどを使用することができます
関連する問題