VBA Workshhet 更改 - 仅限制特定范围的更改

Raf*_*pov 4 excel vba

我有一个触发器,我想在某些工作表中使用 - 就在 2 个特定列内。但是,当我输入另一个范围内的值时,它会触发该工作表的 Private Sub。我希望当我在 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
Run Code Online (Sandbox Code Playgroud)

K.D*_*ᴠɪs 5

您只需要检查是否Target与您想要的范围相交。我将在此检查中将两列合并在一起。

正如 DisplayName 隐晦地指出的那样,由于Target可以包含多个单元格,因此您应该单独检查目标中的每个单元格。或者,如果您的目的Target是始终拥有一个单元格,那么您可以For...Each完全避免该语句并使用此检查:If Target.Cells.Count > 1 Then Exit Sub当更改超过 1 个单元格时不运行该过程。

我还添加了另一个相交目标,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
Run Code Online (Sandbox Code Playgroud)

附带说明一下,当您多次使用相同的精确范围时,继续将该范围设置为变量并不是一个坏主意。因此,我们rngIntersect在这段代码中使用了两次,这样我们就不必多次调用 和Intersect()函数Union()。最重要的是,当您只需在一处更新范围而不是在代码中多次更新时,您会遇到更少的调试麻烦。