在Excel中查找两个文本单元格之间的区别
我有2个单元格,其中有逗号(,)分隔的数字列表。 K
的列表是全集, D
的列表是局部集合。 我想把M
中不属于D
的部分放入M
中。
例:
K4 = 1,2,5,6
D4 = 1,5,6
结果M4 = 2
我已经使用SUBSTITUTE
,但只有在D
中的数字是有序的,而不是从K
中间丢失任何东西。
我需要一个非VBA的答案。
这是一个公式,将为一个单一的缺失值。 如果您需要返回多个缺失值,则可以使用帮助列,但是VBA会更简单。 该公式通常是input的,并应该与大多数版本的Excel一起工作:
=LOOKUP(2,1/ISERR(SEARCH(TRIM(MID(SUBSTITUTE(K4,",",REPT(" ",99)),seq_99,99)),D4 & ",")),TRIM(MID(SUBSTITUTE(K4,",",REPT(" ",99)),seq_99,99)))
seq_99
是一个定义的名称(公式,在这种情况下),生成值的数组{1,99,198,297, ...}
seq_99 Refers to: =IF(ROW(INDEX($1:$65535,1,1):INDEX($1:$65535,255,1))=1,1,(ROW(INDEX($1:$65535,1,1):INDEX($1:$65535,255,1))-1)*99)
对于VBA例程,特别推荐如果可能有多个缺less的项目,请尝试以下操作:
Option Explicit Function MissingValues(sFull As String, sPartial As String) As String Dim RE As Object Dim sPat As String Dim S As String 'Replace commas with pipes, surround by brackets "[]" and follow by end ' of line to create regex pattern from sPartial sPat = "[" & Replace(sPartial, ",", "|") & "](?:,|$)" Set RE = CreateObject("vbscript.regexp") With RE .Pattern = sPat .ignorecase = True .Global = True .MultiLine = True S = .Replace(sFull, "") .Pattern = ",$" MissingValues = .Replace(S, "") End With End Function
例程使用正则expression式来删除部分集合中出现的全集中的所有内容。 (然后进行最后的检查以删除任何terminal逗号)。 这将以相同的逗号分隔模式返回多个缺失的值。 这是不区分大小写的,但您可以看到哪里可以轻松更改。
下面是一个屏幕截图,比较两种方法在输出两个缺失值时的输出:
如果您订阅了Office 365 Excel,则可以使用此数组公式:
=TEXTJOIN(",",TRUE,IF(ISNUMBER(SEARCH("," &TRIM(MID(SUBSTITUTE(K4,",",REPT(" ",999)),(ROW(INDIRECT("1:" & LEN(K4)-LEN(SUBSTITUTE(K4,",",""))+1))-1)*999+1,999))&",",","&D4&",")),"",TRIM(MID(SUBSTITUTE(K4,",",REPT(" ",999)),(ROW(INDIRECT("1:" & LEN(K4)-LEN(SUBSTITUTE(K4,",",""))+1))-1)*999+1,999))))
作为一个数组公式,在退出编辑模式时,需要使用Ctrl-Shift-Enter来确认,而不是Enter。 如果做得正确的话,excel会把{}
放在公式的周围。
我知道你问了一个非VBA的答案,但;
如果您没有Office 365 Excel订阅您可以将此代码放在附加到工作簿的模块中,并使用上述公式。
Function TEXTJOIN(delim As String, skipblank As Boolean, arr) Dim d As Long Dim c As Long Dim arr2() Dim t As Long, y As Long t = -1 y = -1 If TypeName(arr) = "Range" Then arr2 = arr.Value Else arr2 = arr End If On Error Resume Next t = UBound(arr2, 2) y = UBound(arr2, 1) On Error GoTo 0 If t >= 0 And y >= 0 Then For c = LBound(arr2, 1) To UBound(arr2, 1) For d = LBound(arr2, 1) To UBound(arr2, 2) If arr2(c, d) <> "" Or Not skipblank Then TEXTJOIN = TEXTJOIN & arr2(c, d) & delim End If Next d Next c Else For c = LBound(arr2) To UBound(arr2) If arr2(c) <> "" Or Not skipblank Then TEXTJOIN = TEXTJOIN & arr2(c) & delim End If Next c End If TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim)) End Function