在文本字符串中删除日期(Microsoft Excel)
Karan在工作簿中有很多文本数据。某些文本数据包含日期。她需要一种删除日期的方法,但要保留单元格中可能保留的其他任何文本。例如,从“ 4/15/16测试成功运行”或“测试在4/15/16运行”开始,在删除后,将是“
测试成功运行”和“测试运行”。
如果日期始终遵循简单的模式,则可以使用SUBSTITUTE函数将其删除。例如,如果日期始终由一位数字的月份和两位数字的日期组成,则可以使用以下命令将其删除:
=SUBSTITUTE(A1,MID(A1,SEARCH("?/??/??",A1),7),)
这样的公式存在多个问题。首先,如果单元格A1中没有日期,或者如果单元格A1中的日期只有一位数字,它将返回一个错误值。此外,如果日期具有两位数的月份,则它会保留该第一位数字不变(假设日期使用两位数的日期)或返回错误值(如果日期使用一位数的日期)。
如果日期显示在单元格中文本的开头或结尾,则可以使用其他类型的公式:
=IFERROR( IF( VALUE( LEFT( A1, 1)) > 0, RIGHT( A1, LEN(A1) - 7), ""), LEFT( A1, FIND( "/", A1) - 2))
这种方法的问题在于,它还需要精确的图案M / DD / YY或MM / D / YY。因此,它表现出与先前公式相同的问题。
一种更通用的方法是使用宏搜索日期,然后将其从字符串中删除。下面的示例宏查看单元格的内容,并使用Split函数将其分解为“单词”。然后,只要单词不是日期,它就会开始将单词放在一起。
Function RemoveDates(ByVal vC As String) Dim arr As Variant Dim s As String Dim i As Integer RemoveDates = "" If vC > "" Then arr = Split(vC, " ") For i = LBound(arr) To UBound(arr) If Not IsDate(arr(i)) Then s = s & arr(i) & " " End If Next i RemoveDates = Left(s, Len(s) - 1) End If End Function
您可以将宏用作工作表中的用户定义函数,如下所示:
=RemoveDates(A1)
此宏的唯一缺点是,如果单词之间有多个空格,则这些空格将在替换过程中删除。如果这对您来说很重要,则可以考虑依赖宏中的正则表达式,如下所示:
Function RemoveDates(MyRange As Range) As String Dim sRaw As String Dim sPattern As String Dim regEx As New RegExp sRaw = MyRange.Value sPattern = "[0-9]{1,2}[-.\\/][0-9]{1,2}[-.\\/][0-9]{2}" With regEx .Global = True .MultiLine = True .IgnoreCase = False .pattern = sPattern End With If regEx.Test(sRaw) Then RemoveDates = regEx.Replace(sRaw, "") Else RemoveDates = "Not matched" End If Set regEx = Nothing End Function
在您的工作表中使用此功能的方式与以前的用户定义功能相同:
=RemoveDates(A1)
对某些人来说,使用正则表达式似乎是一门妖术,但是这种特殊用法非常简单。模式(存储在sPattern变量中)表示,一个或两个数字后跟一个分隔符(破折号,句点,反斜杠或正斜杠),然后再加上一个或两个数字,再加上另一个分隔符后跟两个数字,则视为日期。如果在单元格中找到这样的匹配项,则将其删除。
为了使用常规的压缩方法,您需要确保在Visual Basic编辑器中包括对以下库的引用(从“工具”菜单中选择“引用”):
Microsoft VBScript Regular Expressions 5.5
您还应注意,如果您引用的单元格中没有日期,该函数将返回“不匹配”。
注意:
如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(7768)适用于Microsoft Excel 2007、2010、2013和2016。