Excel 检查区域中的单元格是否包含日期

Excel 检查区域中的单元格是否包含日期,excel,vba,Excel,Vba,我想确定我的区域中的单元格是否包含日期(任意日期),以及是否包含日期,然后用消息退出子单元格。 日期格式如下所示:dd mmm yy,但由单元格内的公式生成 下面是我已经编写的一些代码,以及我想要实现的一些伪代码 Sub RemoveRowButton() 'This Macro deletes a row where the button is clicked. 'Variables Dim row As Long Dim varResponse As Variant Application

我想确定我的区域中的单元格是否包含日期(任意日期),以及是否包含日期,然后用消息退出子单元格。 日期格式如下所示:dd mmm yy,但由单元格内的公式生成

下面是我已经编写的一些代码,以及我想要实现的一些伪代码

Sub RemoveRowButton()
'This Macro deletes a row where the button is clicked.
'Variables
Dim row As Long
Dim varResponse As Variant

Application.ScreenUpdating = False



'Message box confirming user is doing the right thing
varResponse = MsgBox("Delete this row? 'Yes' or 'No'", vbYesNo, "Delete Row")
    If varResponse <> vbYes Then Exit Sub

'Carry on with deleting row.....

Set rng = ActiveSheet.Buttons(Application.Caller).TopLeftCell.EntireRow


*******Pseudo Code *******
'Check if the row to be deleted has a date in the D Column of the range (which is a Row)

'If IsDate **in D column of the Range is ture*** Then
'MsgBox "This Row Contains a Date!"
'End If


'Unprotect sheet
ActiveSheet.Unprotect Password:="***"

'Delete row on button row
rng.Delete

'Protect sheet again
 ActiveSheet.Protect Password:="***"

End Sub

由于我不熟悉VBA,我不知道这是否是最佳实践意义上的“好”。如果没有,并且您想更正它,请这样做。

以下是解决您的问题的方法。将代码安装在您希望执行操作的工作表的代码表中(而不是像“Module1”这样的标准模块中!)请注意,代码会对D列中从第2行向下双击到a列中最后使用的行作出反应。你可以调整一下。按照代码本身中的说明进行操作。我使用这种方法,而不是你的工作表中每一行似乎都有一个按钮——这是一个偏好问题,但在这里用于演示和避免创建按钮

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' 03 Jan 2019

    Dim Rng As Range
    Dim R As Long
    Dim Cell As Range
    Dim i As Integer

    R = Cells(Rows.Count, "A").End(xlUp).Row        ' last used row in column A
    Set Rng = Range(Cells(2, 4), Cells(R, 4))       ' used range in column D

    If Not Application.Intersect(Target, Rng) Is Nothing Then
        ' if a cell in Rng as double-clicked:-
        R = Target.Row
        Set Rng = Range(Cells(R, "A"), Cells(R, "S"))
        For Each Cell In Rng
            With Cell
                If IsDate(.Value) Then
                    For i = 3 To 1 Step -1
                        ' check if the Numberformat contains all of "m", "d" and "y"
                        If InStr(1, .NumberFormat, Mid("dmy", i, 1), vbTextCompare) = 0 Then Exit For
                    Next i
                    If i = 0 Then                   ' all 3 were found
                        If MsgBox("Do you want to delete row " & R & " ?", _
                                  vbQuestion Or vbYesNo, _
                                  "Click ""No"" to keep the row") = vbYes Then
                            Rows(R).Delete
                        End If
                        Exit For
                    End If
                End If
            End With
        Next Cell
        Cancel = True                               ' ends in-cell editing
    End If
End Sub
代码对每个单元格执行两次检查(A:S)。它首先检查其值是否为日期。然后,假定它是一个数字,它检查单元格格式。如果数字格式包含所有字母‘m’、‘d’和‘y’,则确认为日期并发布删除,在此之前用户可以确认其意图。
此方法可能需要一些微调。首先,如果单元格具有文本日期,则必须执行不同的第二次检查。第二,如果日期格式仅包含3个标准中的2个,则必须相应减少对其在掩码中存在的测试。一旦更改的性质发生变化,可以执行其中一个或两个修改您的数据更容易理解。

以下是解决您问题的方法。请将代码安装在您希望执行操作的工作表的代码表中(而不是安装在“Module1”之类的标准模块中!!)请注意,代码会对D列中从第2行向下双击到a列中最后使用的行作出反应。您可以进行调整。按照代码本身中的说明进行操作。我使用此方法,而不是您在工作表的每一行中似乎都有的按钮-这是一个偏好问题,但此处用于演示和避免创建g按钮

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' 03 Jan 2019

    Dim Rng As Range
    Dim R As Long
    Dim Cell As Range
    Dim i As Integer

    R = Cells(Rows.Count, "A").End(xlUp).Row        ' last used row in column A
    Set Rng = Range(Cells(2, 4), Cells(R, 4))       ' used range in column D

    If Not Application.Intersect(Target, Rng) Is Nothing Then
        ' if a cell in Rng as double-clicked:-
        R = Target.Row
        Set Rng = Range(Cells(R, "A"), Cells(R, "S"))
        For Each Cell In Rng
            With Cell
                If IsDate(.Value) Then
                    For i = 3 To 1 Step -1
                        ' check if the Numberformat contains all of "m", "d" and "y"
                        If InStr(1, .NumberFormat, Mid("dmy", i, 1), vbTextCompare) = 0 Then Exit For
                    Next i
                    If i = 0 Then                   ' all 3 were found
                        If MsgBox("Do you want to delete row " & R & " ?", _
                                  vbQuestion Or vbYesNo, _
                                  "Click ""No"" to keep the row") = vbYes Then
                            Rows(R).Delete
                        End If
                        Exit For
                    End If
                End If
            End With
        Next Cell
        Cancel = True                               ' ends in-cell editing
    End If
End Sub
代码对每个单元格(A:S)进行两次检查。首先检查其值是否为日期。然后,假定它是数字,检查单元格格式。如果数字格式包含所有字母“m”、“d”和“y”,则确认为日期并发布删除,在此之前,用户可以确认其意图。 此方法可能需要稍微微调。首先,如果单元格有文本日期,则必须执行不同的第二次检查。其次,如果日期格式仅包含3个标准中的2个,则必须相应减少对其在掩码中存在的测试。一旦对数据的性质有了更好的了解,这些修改中的任何一项或两项都可以实施。

@J4C3N-14您是否尝试过:

Sub Test_Date()

    Dim strDate As String

    With ThisWorkbook.Worksheets("Sheet1")

        strDate = .Range("A1").Value

        If IsDate(strDate) Then
            'Code
        End If

    End With

End Sub
@J4C3N-14您是否尝试过:

Sub Test_Date()

    Dim strDate As String

    With ThisWorkbook.Worksheets("Sheet1")

        strDate = .Range("A1").Value

        If IsDate(strDate) Then
            'Code
        End If

    End With

End Sub

你所有的日期都在D栏吗?细胞范围是多少?(一行可以很短,也可以很长……)是的,所有日期都在D列,并且永远都在D列。行中的列/单元格从A扩展而来。问题是,对于Excel,日期是以类似日期的格式屏蔽的数字。因此,如果您的列中也有数字,则很难将日期和数字分开。您可以将
Range.NumberFormat
属性与IsNumeric()结合使用来测试值是否大于0。如果全部通过,那么很可能是一个日期。您可以使用ISERROR(中有一个示例)。如果单元格可能为空,您也可以检查空值..?由于@ScottCraner概述的原因,很难判断。但如果你解释了为什么需要这样做,也许可以设计出一个更合适的解决方案。还有,单元格中可能还有什么?您的所有日期都在D列吗?细胞范围是多少?(一行可以很短,也可以很长……)是的,所有日期都在D列,并且永远都在D列。行中的列/单元格从A扩展而来。问题是,对于Excel,日期是以类似日期的格式屏蔽的数字。因此,如果您的列中也有数字,则很难将日期和数字分开。您可以将
Range.NumberFormat
属性与IsNumeric()结合使用来测试值是否大于0。如果全部通过,那么很可能是一个日期。您可以使用ISERROR(中有一个示例)。如果单元格可能为空,您也可以检查空值..?由于@ScottCraner概述的原因,很难判断。但如果你解释了为什么需要这样做,也许可以设计出一个更合适的解决方案。另外,单元格中还有什么?谢谢你的指点和示例。不幸的是,我确实需要每行有一个按钮。但是,如何检查日期格式可能是一个解决方案。如何最好地将其实现到我的代码中?在您的代码中,“如果范围的D列中的IsDate为真*那么“MsgBox”这一行包含一个日期!”对应于我的代码如果IsDate(.Value),那么对于i=3到1步骤-1,检查数字格式是否包含所有的“m”、“D”和“y”,如果InStr(1、.NumberFormat、Mid(“dmy”,i,1)、vbTextCompare)=0然后退出下一个i如果i=0则“所有3个都找到了感谢您的指针和示例。不幸的是,我确实需要在每行中设置一个按钮。但是,如何检查日期格式可能是一个解决方案。如何最好地将其实现到我的代码中?在您的代码中,“If IsDate in D column”范围的n为真*那么“MsgBox”这一行包含一个日期!”对应于我的代码如果是IsDate(.Value),那么对于i=3到1步骤-1,检查数字格式是否包含