我一直在寻找这个答案几个小时,找不到任何东西。请帮忙。
我正在尝试编写一个公式,它将返回单元格中文本的位置或与该文本相关联的日期(日期是最终输出,但如果我有位置,我可以到达那里)。
数据如下:
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(工作笔记) 文件服务器目前已关闭,因此无法在索菲亚进行测试
答案 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