【问题标题】:Pull a name out of cell if date is greater than a cell如果日期大于单元格,则将名称拉出单元格
【发布时间】:2016-06-17 15:39:54
【问题描述】:

我的一个跟踪批准的软件应用程序将所有数据放在一个字段中,我试图跟踪个人是否迟到批准它,他们的名字是什么。问题是批准的数量不一致,所以可能有一个,也可能有 20 个。下面是系统返回的示例。

批准历史状态:已批准 06/11/12 04:01 AM 提交给 John Doe 06/13/12 04:20 AM 批准由 Steve Smith 出于某种原因与“某些名称 - XYZ1 - 程序”相关联2012 年 6 月 13 日上午 4:20 由史蒂夫·史密斯批准 出于某种原因与“字:LS 其他”相关联 2012 年 6 月 13 日上午 04:20 由史蒂夫·史密斯批准 出于某种原因与“另一个名称:产品 - LMN1”相关联' 2012 年 6 月 13 日上午 4 点 20 分由史蒂夫·史密斯批准,出于某种原因与“随机不同的名称:单词 - QRS1”相关联 2012 年 6 月 13 日上午 4 点 26 分由玛丽·苏批准,出于某种原因与“其他事情”相关联:Program -- DEF14' 06/13/12 04:26 AM 由 John Doe 批准 注意:自动批准:批准者与提交者是同一用户

我正在寻找一个可以查看所有日期并将它们与单元格 A1 中的日期进行比较并检查是否有大于单元格 A1 的宏。

例如,如果 A1 中的日期是“2012 年 6 月 10 日”,它应该返回值“John Doe”。如果没有一个日期大于单元格 A1,则返回空白。有时前 4 个日期都小于 A1,但其余日期会更大。我想要大于 A1 的第一个日期。

这样可以吗?

【问题讨论】:

  • 我想你可以把所有这些放在一行中,通过带有空格分隔符的文本到列。然后您可以查看每个单元格,如果是日期,则将其左侧两个单元格中的信息拉出。 What have you tried so far?
  • @BruceWayne 起初我也这么认为。但似乎这些名字并不总是在同一个位置。因此,这不适用于Steve Smith 和日期 06/13/12。在这里,名称被包裹在名称左侧和右侧的文本之间(据我所知)。
  • 哈哈,你昨天问过这个问题(现已删除)说你知道如何用宏来做,但想看看你是否可以通过公式来做。编辑:我认为是@jnevill 评论说你应该使用宏,而不是公式。
  • 您是否有一份您希望出现在该文本中的人员列表?我们可以使用什么样的推理来确定名称?必须有某种逻辑,否则这会变得非常棘手,因为名称和日期似乎可以出现在任何地方。也许没有办法调整输出该数据的系统,嗯?
  • 名称列表根据营业额而变化,因此未完全定义。我使用“批准者”一词并将位置向左调整以获取日期,然后向右调整以获取名称。

标签: vba excel date


【解决方案1】:

由于您对从字符串中提取的数据要做什么有点模糊,以下是我对这个问题的看法。原始字符串粘贴到“B1”中,后期批准者保存到数组中。将出现一个消息框,告诉您第一个迟到的批准者是谁。

Sub GetDatesFromString()

Dim SubStrings() As String
Dim NameSplit() As String
Dim TimeSplit() As Date
Dim Approvers() As String
Dim index, UpperBound, ApproversIndex As Integer

SubStrings() = Split(Cells(1, 2), "M ")
UpperBound = UBound(SubStrings())
ReDim NameSplit(UpperBound)
ReDim TimeSplit(UpperBound)

ApproversIndex = 0
For index = 0 To UBound(SubStrings())
    If (Right(SubStrings(index), 1) = "A" Or Right(SubStrings(index), 1) = "P") Then
        SubStrings(index) = SubStrings(index) & "M"
    End If
    NameSplit() = Split(SubStrings(index), " ", 5)
    If (Right(SubStrings(index), 2) = "AM" Or Right(SubStrings(index), 2) = "PM") Then
        TimeSplit(index) = Right(SubStrings(index), 17)
        If ((TimeSplit(index) > 0) And (Left(SubStrings(index), 8) = "Approved")) Then
            If TimeSplit(index) > Cells(1, 1) Then
                ApproversIndex = ApproversIndex + 1
                ReDim Preserve Approvers(ApproversIndex)
                Approvers(ApproversIndex) = NameSplit(2) & " " & NameSplit(3) & " on " & TimeSplit(index)
            End If
        End If
    End If
Next index

If ApproversIndex > 0 Then
    MsgBox ("The first late approver was " & Approvers(1))
Else
    MsgBox ("There were no late approvers")
End If

End Sub

如果数据格式不一致,则输出可能与预期不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2015-01-19
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多