在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