Excel2007宏验证输入单元格的数据,如果不正确,则显示msgbox

Excel2007宏验证输入单元格的数据,如果不正确,则显示msgbox,excel,if-statement,excel-2007,msgbox,vba,Excel,If Statement,Excel 2007,Msgbox,Vba,请有人帮我输入以下代码。它在以下行中给出了一个错误: Set range = "C5:L14" 这是完整的代码: Private Sub Worksheet_Change(ByVal Target As Excel.range) Dim ws As Worksheet Dim range As Worksheet Set ws = Application.ActiveSheet Set range = "C5:L14" If Not Application.Intersect(Target

请有人帮我输入以下代码。它在以下行中给出了一个错误:

Set range = "C5:L14"
这是完整的代码:

Private Sub Worksheet_Change(ByVal Target As Excel.range)
Dim ws As Worksheet
Dim range As Worksheet

Set ws = Application.ActiveSheet
Set range = "C5:L14"

If Not Application.Intersect(Target, range("C5:L14")) Is Nothing Then

    If range("C5:L14").Value = "" Then Exit Sub

    If range("C5:L14").Date = "< today()" Then Exit Sub

    If range("C5:L14").Date = "> today()" Then MsgBox ("Future dates not allowed!")

    Else
        MsgBox ("Please enter date as follows yyyy-mm")
    End If

End Sub
Private子工作表\u更改(ByVal目标为Excel.range)
将ws设置为工作表
将范围变暗为工作表
设置ws=Application.ActiveSheet
设置范围=“C5:L14”
如果不是,那么Application.Intersect(目标,范围(“C5:L14”))什么都不是
如果范围为(“C5:L14”).Value=“”,则退出Sub
如果范围(“C5:L14”).Date=“today()”则MsgBox(“不允许将来的日期!”)
其他的
MsgBox(“请输入日期,如下yyyy-mm”)
如果结束
端接头
单元格上的日期格式为“2013年1月”。不允许将来的日期,用户只应键入日期“2013-01”。格式应正确更改。如果他们输入“2013年1月”,则条件格式不会选择它。我尝试过数据验证,但仅限于一个


我需要宏来确保用户没有在指定的单元格中输入错误的日期。

您尝试的内容也可以在没有VBA的情况下解决。然而,我向你们展示了这两种方法。你挑吧

非VBA

选择要应用数据验证的单元格,然后执行以下步骤

第一步

步骤2

步骤3

步骤4

行动中

VBA

我已经对代码进行了注释,所以您在理解它时不会有任何问题

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Dim rng As Range
    Dim aCell As Range

    '~~> The below two lines are required. Read up more on
    '~~> http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640
    On Error GoTo Whoa
    Application.EnableEvents = False

    '~~> Set your range
    Set rng = Range("C5:L14")

    If Not Application.Intersect(Target, rng) Is Nothing Then
        '~~> Loop through all cells in the range
        For Each aCell In rng
            If aCell.Value <> "" Then
                If aCell.Value > Date Then
                    aCell.ClearContents
                    MsgBox "Future date not allowed in cell " & aCell.Address
                ElseIf IsDate(aCell.Value) = False Then
                    aCell.ClearContents
                    MsgBox "Incorrect date in cell " & aCell.Address
                Else
                    aCell.Value = Format(aCell.Value, "yyyy-mm")
                End If
            End If
        Next
    End If

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub
选项显式
私有子工作表_变更(ByVal目标为Excel.Range)
变暗rng As范围
Dim aCell As系列
“~~>以下两行是必需的。阅读更多关于
'~~> http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640
关于错误转到哇
Application.EnableEvents=False
“~~>设置您的范围
设置rng=范围(“C5:L14”)
如果不是Application.Intersect(Target,rng),则什么都不是
“~~>循环遍历范围内的所有单元格
对于rng中的每个aCell
如果aCell.Value为“”,则
如果aCell.Value>Date,则
aCell.ClearContents
MsgBox“单元格中不允许未来日期”&单元格地址
ElseIf IsDate(aCell.Value)=False然后
aCell.ClearContents
MsgBox“单元格中的日期不正确”&单元格地址
其他的
aCell.Value=格式(aCell.Value,“yyyy-mm”)
如果结束
如果结束
下一个
如果结束
让我们继续:
Application.EnableEvents=True
出口接头
哇
MsgBox错误说明
继续
端接头
希望这有帮助

编辑


一点变化。在非VBA方法的步骤4中,我错误地键入了“yyyy mm”。将其更改为“yyyy-mm”

您正在尝试的问题也可以在没有VBA的情况下解决。然而,我向你们展示了这两种方法。你挑吧

非VBA

选择要应用数据验证的单元格,然后执行以下步骤

第一步

步骤2

步骤3

步骤4

行动中

VBA

我已经对代码进行了注释,所以您在理解它时不会有任何问题

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Dim rng As Range
    Dim aCell As Range

    '~~> The below two lines are required. Read up more on
    '~~> http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640
    On Error GoTo Whoa
    Application.EnableEvents = False

    '~~> Set your range
    Set rng = Range("C5:L14")

    If Not Application.Intersect(Target, rng) Is Nothing Then
        '~~> Loop through all cells in the range
        For Each aCell In rng
            If aCell.Value <> "" Then
                If aCell.Value > Date Then
                    aCell.ClearContents
                    MsgBox "Future date not allowed in cell " & aCell.Address
                ElseIf IsDate(aCell.Value) = False Then
                    aCell.ClearContents
                    MsgBox "Incorrect date in cell " & aCell.Address
                Else
                    aCell.Value = Format(aCell.Value, "yyyy-mm")
                End If
            End If
        Next
    End If

Letscontinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume Letscontinue
End Sub
选项显式
私有子工作表_变更(ByVal目标为Excel.Range)
变暗rng As范围
Dim aCell As系列
“~~>以下两行是必需的。阅读更多关于
'~~> http://stackoverflow.com/questions/13860894/ms-excel-crashes-when-vba-code-runs/13861640#13861640
关于错误转到哇
Application.EnableEvents=False
“~~>设置您的范围
设置rng=范围(“C5:L14”)
如果不是Application.Intersect(Target,rng),则什么都不是
“~~>循环遍历范围内的所有单元格
对于rng中的每个aCell
如果aCell.Value为“”,则
如果aCell.Value>Date,则
aCell.ClearContents
MsgBox“单元格中不允许未来日期”&单元格地址
ElseIf IsDate(aCell.Value)=False然后
aCell.ClearContents
MsgBox“单元格中的日期不正确”&单元格地址
其他的
aCell.Value=格式(aCell.Value,“yyyy-mm”)
如果结束
如果结束
下一个
如果结束
让我们继续:
Application.EnableEvents=True
出口接头
哇
MsgBox错误说明
继续
端接头
希望这有帮助

编辑


一点变化。在非VBA方法的步骤4中,我错误地键入了“yyyy mm”。将其更改为“yyyy-mm”

Set Rng=ws.Range(“C5:L14”)
也不要将
Range
字用作变量,也可以将
Dim Range作为工作表更改为
Dim Rng as Range
顺便说一句,您不需要VBA。您可以手动设置DataValidation;)@SiddharthRout,这一切看起来都像是我的答案:)。
Set Rng=ws.Range(“C5:L14”)
也不要使用
Range
word作为变量,也可以更改
Dim Range as Worksheet
as
Dim Rng as Range
顺便说一句,您不需要VBA。您可以手动设置DataValidation;)@悉达多,这一切对我来说似乎都是一个答案:)。感谢所有的回复,尝试了所有的回复,效果都比预期的好。我每天都从这个网站和你的答案中学到越来越多的东西。谢谢你的快速回复,我现在就去了解更多。关于VBA方法,我只知道一个问题,我不明白。如果我清除该范围内的任何单元格,它将使用msgbox“future dates not allowed”一次清除一个单元格来清除整个电子表格。永远不会有理由删除电子表格上的任何内容,但这困扰着我,我想了解为什么要删除未来的VBA代码。谢谢,这是我的