VBA无法弄清楚为什么Case语句不能正确工作

时间:2017-07-19 15:17:19

标签: vba if-statement target

我在工作表更改事件中有这段代码,但它没有像它应该的那样触发。

If Not Intersect(Target, rng6) Is Nothing Then

        Select Case IsDate(Target.Value)
        Case False
        Target.NumberFormat = "m/yyyy"
        Target = Empty
        Case True

            If Format(Target.Value, "m/yyyy") < Format(Now, "m/yyyy") Then
            MsgBox "Must not be less than" & vbLf & "current month & year !", vbExclamation, "Warning.."
            Target.Value = Format(Now, "m/yyyy")
            Else
            Target.NumberFormat = "m/yyyy"
            MsgBox Format(Target.Value, "m/yyyy") & "  " & Format(Now, "m/yyyy")
            End If

        End Select

    End If

FALSE部分工作正常,但当它变为TRUE并运行if语句时,它只返回一个或另一个。

例如,我在01/2017测试输入并返回IF的第一部分,但是当我在10月10日输入时,它返回第一部分ALSO并将其转换为今天的M / YYYY,而不是第二部分,因为当前的m / yyyy大于今天&#39; sm / yyy。

任何人都可以识别出错误是什么吗?我确定它很简单,解决方案就在那里/

由于

2 个答案:

答案 0 :(得分:1)

仅用于说明DateDiff的使用:

If Not Intersect(Target, rng6) Is Nothing Then
    Select Case IsDate(Target.value)
    Case False
        Target.NumberFormat = "m/yyyy"
        Target = Empty
    Case True
        If DateDiff("m", Target.value, Now) > 0 Then
            MsgBox "Must not be less than" & vbLf & "current month & year !", vbExclamation, "Warning.."
            Target.value = Format(Now, "m/yyyy")
        Else
            Target.NumberFormat = "m/yyyy"
            MsgBox Format(Target.value, "m/yyyy") & "  " & Format(Now, "m/yyyy")
        End If
    End Select
End If

DateDiff("m", Target.value, Now)将从下个月开始为负,本月为0,之前为正。

编辑:请注意,如果您使用DateNow(仅检查月/年),则DateDiff与“m”无关紧要

答案 1 :(得分:0)

您需要使用Date获取今天的日期,而不是使用Now。看看这两者之间的区别:

Public Sub TestMe()
    Debug.Print DateDiff("d", Date, Now)
    Debug.Print DateDiff("h", Date, Now)
    Debug.Print DateDiff("m", Date, Now)
End Sub

比较时,您无需格式化日期。根据您的日期,您可能需要做一些额外的调整:因此尝试这样:

If DateSerial(year(target),Month(target),day(target)) < Date Then

当VBA / Excel比较日期时,它只是比较它们的长数。该格式仅用于了解它的显示方式。

例如,今天的日期是42935,昨天是42934。您可以通过在即时窗口中编写?clng(Date)来获得此值。