我试图确定包含其他文本的字符串内的日期是否小于另一个单元格中的日期,但由于某种原因,该函数似乎永远不会触及日期公式,即使日期格式也是如此匹配我的Like声明条件。
以下是我试图从1/9/2018 5:02AM Benjamin Button
中提取的一个单元格的示例
请参阅以下代码
Sub findAndCheck
for i = 2 to lastrow ''Lastrow declared and set, just not shown here [i is global]
if Getdate(cells(i,68).value2) then
comments = "True"
end if
next i
End Sub
Public Function Getdate(expression As Variant) As Boolean
Dim dateconvert As Date
If (expression Like "*#/#/####*") Then
dateconvert = CDate(Left(expression, 8))
Getdate = CDate(expression) < CDate(Cells(i, 66))
ElseIf (expression Like "*##/#/####*") Or (expression Like "*#/##/####*") Then
dateconvert = CDate(Left(expression, 9))
Getdate = CDate(expression) < CDate(Cells(i, 66))
ElseIf (expression Like "*##/##/####*") Then
dateconvert = CDate(Left(expression, 10))
Getdate = CDate(expression) < CDate(Cells(i, 66))
End If
End Function
答案 0 :(得分:2)
你没有包含i
作为你的函数的参数,所以我做了。
另外,只需检查expression
是否包含空格,然后对其进行拆分。
Public Function Getdate(expression As Variant, i As Long) As Boolean
Dim rawDate As Date
If InStr(1, expression, " ") > 0 Then
rawDate = CDate(Split(expression, " ")(0))
End If
Getdate = rawDate < CDate(Cells(i, 66))
End Function
您还应该检查rawDate = 0
,这意味着您的字符串根本不包含日期。
答案 1 :(得分:2)
isdate(split("1/9/2018 5:02AM Benjamin Button", chr(32))(0))
应确定您是否有领先日期。
Public Function Getdate(expression As Variant, _
optional i as long = 2) As Boolean
If isdate(split(expression, chr(32))(0)) Then
Getdate = CDate(split(expression, chr(32))(0)) < CDate(Cells(i, 66))
End If
End Function
答案 2 :(得分:1)
你的问题在于:
Getdate = CDate(expression) < CDate(Cells(i, 66))
您无法评估CDate(expression)
,因为表达式的全文仍包含日期戳以外的内容。我想你想要检查你的日期转换是否小于该单元格中的值:
Getdate = dateconvert < CDate(Cells(i, 66))
您还需要在某处声明i
。大概你想把它作为你函数中的另一个参数(例如):
Public Function Getdate(expression As Variant, i as integer) As Boolean
答案 3 :(得分:1)
要从类似于您显示的表达式中提取日期(日期位于开头,结尾处,或者以字符串其余部分的空格分隔,您可以使用:
Option Explicit
Function GetDate(sExpression As String) As Date
Dim v, w
v = Split(sExpression, " ")
For Each w In v
If IsDate(w) Then
GetDate = CDate(w)
Exit Function
End If
Next w
End Function
如果没有日期,该函数将返回零
并且,比较两个单元格,如:
Sub findAndCheck
for i = 2 to lastrow ''Lastrow declared and set, just not shown here [i is global]
if Getdate(cells(i,68) > getdate(cells(i,66) and _
getdate(cells(i,68) <> 0 and getdate(cells(i,66) <> 0 _
then
comments = "True"
end if
next i
End Sub