从字符串中查找并提取日期不起作用?

时间:2018-02-01 20:16:48

标签: excel vba excel-vba

我试图确定包含其他文本的字符串内的日期是否小于另一个单元格中的日期,但由于某种原因,该函数似乎永远不会触及日期公式,即使日期格式也是如此匹配我的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

4 个答案:

答案 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