返回日期或不在范围

时间:2017-10-17 19:48:54

标签: arrays excel excel-2010 formulas

我一直在寻找这个答案几个小时,找不到任何东西。请帮忙。

我正在尝试编写一个公式,它将返回单元格中文本的位置或与该文本相关联的日期(日期是最终输出,但如果我有位置,我可以到达那里)。

数据如下:

  • A列包含帮助台票号列表。
  • B列包含故障单注释历史记录的文本输出(该列称为内部工作记录)。每个更新都标有以下字符串: mm-dd-yyyy hh:mm:ss - 人名(工作说明)。参见下面的单元格B2的内容示例。

  • 在另一个页面上,我有一个名为“MergedList”的表,其中包含我们的团队成员名称列表。我们假设该表包含John Smith的名称。

在C栏中,我想捕捉MergedList表上某人 NOT 的第一个条目的日期(使用下面的示例单元格内容,我想要“09-25-” 2017“将在C2中展示(即Mary Jones,因为我们不关心John Smith所做的更新)。

问题是我在网上找到的所有内容都与查找列表中的文本位置有关。我需要文本的位置不在列表中。

注意:在另一列中,我确实需要返回列表中某人的最新更新结果,并且我使用此数组公式进行了更新:

{=IFERROR(MID([@[Internal Work Notes]],FIND(INDEX(MergedList,MATCH(TRUE,ISNUMBER(SEARCH(MergedList,[@[Internal Work Notes]])),0)),[@[Internal Work Notes]])-22,10),"--")}

这返回了日期(位置后面22位)。

我尝试的另一个公式是从文本中提取人名,如下所示:

=MID([@[Internal Work Notes]],SEARCH(" - ",[@[Internal Work Notes]])+3,SEARCH(" (Work Notes)",[@[Internal Work Notes]])-23)

但这只是返回了最近更新故障单的人的姓名。

我认为最终的公式将在某种程度上结合上述两个,但我不知道如何'否定'公式。帮助

单元格B2内容示例:

10-09-2017 13:09:10 - 约翰史密斯(工作笔记) 对于扫描到文件夹功能,任何PC都需要软件。

必须重建或停用拥有此软件的PC /服务器。

09-28-2017 06:30:11 - 约翰史密斯(工作笔记) 等待Mike Nelson的信息

09-25-2017 08:17:16 - Mary Jones(工作笔记) 由于文件共享问题在我们会议后几分钟就解决了,我们能够在现场进行测试。

使用不同的共享文件夹进行测试时出错并且无效。我们将使用备用笔记本电脑和不同配置进行进一步测试。同时我们将让边防队检查身份验证。

09-24-2017 07:25:01 - Tony Harris(工作笔记) 文件服务器目前已关闭,因此无法在索菲亚进行测试

1 个答案:

答案 0 :(得分:0)

有可能使用多个辅助列和工作表函数来执行此操作,但这会很麻烦,不灵活且难以维护。

这是一个用户定义函数(UDF),它将返回名称不在MergedList中的列表中的第一个实例。您可以选择返回名称或日期。

它取决于字符串模式与您在日期/时间戳方面的显示方式完全相同,并且Name只有两个单词。如果名称不同,则需要调整模式。

模式被定义为正则表达式。

Option Explicit
Function NewName_Date(sInput As String, rNameList As Range, Optional ReturnName As Boolean = False) As Variant
    'RegexPattern
    Const sPat As String = "((?:\d{2}-){2}\d{4})\s(?:\d{2}:){2}\d{2}\W+(\w+\s+\w+)"
    Dim RE As Object, MC As Object, M As Object
    Dim R As Range

NewName_Date = "" 'Empty string if nothing found

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = sPat
    .ignorecase = True

    If .Test(sInput) = True Then
        Set MC = .Execute(sInput)
        For Each M In MC
            Set R = rNameList.Find(what:=M.submatches(1), LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False)
            If R Is Nothing Then
                Select Case ReturnName
                    Case True
                        NewName_Date = M.submatches(1)
                    Case False
                        NewName_Date = M.submatches(0)
                End Select
            End If
        Next M
    End If
End With

End Function

工作表上的公式可能如下所示:

C2:  =NewName_Date([@[Internal Work Notes]],MergedList,FALSE)

要返回匹配的名称,只需将FALSE更改为TRUE

即可

enter image description here