Excel VBA 比较两个单元格的日期时出错

Excel VBA Error in comparing two cells for dates

在我的 sheet 列中 B:C 允许日期。我正在尝试创建一个检查以查看在 C 中输入的日期是否比 B 更新,如果可以,则提醒用户并清除内容。 我的代码 returns application.intersect 行中的 运行 时间错误 91:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Dates As Range
    Set Dates = Range("C4:C12")

    If Target.Cells.Count > 1 Or IsEmpty(Target) Then
    Exit Sub
    End If
    If Not Application.Intersect(Dates, Range(Target.Address)).Value > ActiveCell.Offset(0, -1).Value Then
    GoTo DatesMissMatch
    Else
        Exit Sub
    End If

DatesMissMatch:
    Target.ClearContents
    ActiveCell.Value = "A2"
    MsgBox "Please re-check dates"
End Sub

您可以循环行并比较日期。

Dim ws As Excel.Worksheet
Set ws = Application.ActiveSheet

Dim lRow As Long
lRow = 4
Do While lRow <= ws.UsedRange.Rows.count
    If ws.Range("C" & lRow).Value > ws.Range("B" & lRow).Value then
         GoTo DatesMissMatch
    End if
lRow = lRow + 1
Loop

我相信你只需要检查相交而不是比较。

Sub Worksheet_Change(ByVal Target As Range)

    Dim Dates As Range
    Set Dates = Range("C4:C12")

    If Target.Cells.Count > 1 Or IsEmpty(Target) Then
    Exit Sub
    End If

    If Not Application.Intersect(Dates, Range(Target.Address)) Is Nothing Then
        If Target.Value < Target.Offset(0, -1).Value Then
            GoTo DatesMissMatch
        Else
            Exit Sub
        End If
    End If

DatesMissMatch:
    Target.ClearContents
    ActiveCell.Value = "A2"
    MsgBox "Please re-check dates"
End Sub

我改变了你的方法,但这似乎有效。

我还注意到您将 A2 写入 ActiveCell 而不是 Target。如果输入了无效数据,您是否希望更新 C 列中的单元格,或者您是否打算将其更改为您移动到的任何单元格?

无论如何,这是我想出的方法

Private Sub Worksheet_Change(ByVal Target As Range)

        If Target.Cells.Count > 1 Or IsEmpty(Target) Then
                Exit Sub
        End If

        If Target.Column = 3 Then 'Check to see if column C was modified
                If Target.Value < Target.Offset(0, -1).Value Then
                        Target.ClearContents
                        Target.Value = "A2"
                        MsgBox "Please re-check dates"
                End If
        End If

End Sub

如果您想坚持目前的做法,那么我认为您需要检查交叉点是否为空,正如另一个答案所总结的那样。