特定のワークシートで使用したいトリガーがあります-2つの特定の列のすぐ内側です。しかし、別の範囲内に値を入力すると、そのワークシートのプライベートサブがトリガーされます。E列またはH列内の値を変更するだけで機能し始めたいと思います。誰かがそれを正しく行う方法を知っていますか?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim LR As Long
Dim rng1 As Range
Dim rng2 As Range
'WE WANT TO KEEP THE TARGET COLUMNS BETWEEN 0% TO 100%
LR = Cells(Rows.Count, "A").End(xlUp).Row
Set rng1 = Intersect(Target, Range(Cells(2, "E"), Cells(LR, "E")))
On Error GoTo 1
If Target.Value < 0 Or Target.Value > 1 Then
MsgBox "bla bla bla", vbCritical + vbMsgBoxRtlReading + vbMsgBoxRight, "error"
Target.Value = 0
Exit Sub
End If
On Error GoTo 1
Set rng2 = Intersect(Target, Range(Cells(2, "H"), Cells(LR, "H")))
If Target.Value < 0 Or Target.Value > 1 Then
MsgBox "bla bla bla", vbCritical + vbMsgBoxRtlReading + vbMsgBoxRight, "error"
Target.Value = 0
Exit Sub
End If
1
End Sub
Target
目的の範囲と交差するかどうかを確認する必要があります。このチェックでは、2つの列を結合します。
DisplayNameで不可解に述べられてTarget
いるように、複数のセルを含めることができるため、ターゲットの各セルを個別にチェックする必要があります。または、Target
常に1つのセルFor...Each
を使用することを意図している場合は、ステートメントを完全に回避して、次のチェックを使用If Target.Cells.Count > 1 Then Exit Sub
できます。複数のセルが変更されたときにプロシージャを実行しないようにします。
またMe.Rows("2:" & rows.count)
、ヘッダーが更新されないように、別の交差ターゲットを追加しました。データにヘッダーが含まれていない場合は、この範囲をから削除できますIntersect()
。
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo safeExit
Dim rngIntersect As Range
Set rngIntersect = Intersect(Target, Union(Me.Columns("E"), Me.Columns("H")), _
Me.Rows("2:" & Rows.Count))
If Not rngIntersect Is Nothing Then
Application.EnableEvents = False
Dim cel As Range
For Each cel In rngIntersect
If cel.Value < 0 Or cel.Value > 1 Then
MsgBox "bla bla bla", vbCritical + vbMsgBoxRtlReading + vbMsgBoxRight, _
"error"
cel.Value = 0
End If
Next cel
End If
safeExit:
Application.EnableEvents = True
End Sub
ちなみに、同じ正確な範囲を複数回使用している場合は、先に進んでその範囲を変数に設定することは悪い考えではありません。したがって、rngIntersect
このコードでは2回使用しているため、Intersect()
andUnion()
関数を複数回呼び出す必要がありません。さらに、コード内で複数回ではなく1つの場所で範囲を更新するだけでよい場合、デバッグの問題が少なくなります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加