Excel 检查区域中的单元格是否包含日期
我想确定我的区域中的单元格是否包含日期(任意日期),以及是否包含日期,然后用消息退出子单元格。 日期格式如下所示:dd mmm yy,但由单元格内的公式生成 下面是我已经编写的一些代码,以及我想要实现的一些伪代码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
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,检查数字格式是否包含