【问题标题】:Find the difference between two cells of text in Excel在 Excel 中查找两个文本单元格之间的差异
【发布时间】:2017-05-14 00:55:27
【问题描述】:

我有 2 个单元格,其中包含用逗号 (,) 分隔的数字列表。 K 中的列表是完整集,D 中的列表是部分集。我想将K 中不在D 中的部分放入M

示例:

K4 = 1,2,5,6

D4 = 1,5,6

结果M4 = 2

我使用了SUBSTITUTE,但这仅适用于D 中的数字有序且没有遗漏K 中间的任何内容。

我需要一个非 VBA 的答案,拜托。

【问题讨论】:

  • 最好的答案可能是不要以 CSV 格式存储您的数据。 Excel 与数据库一样,可能无法很好地处理 CSV 数据。如果您将这些数据分布在多行中,则处理您的问题会更容易。
  • 两个问题。 (1) K 列的元素个数是否总是 4?可以没有吗?逗号后面可以有空格吗? (2) 您是否愿意接受使用辅助列或什至几个辅助列来得出解决方案的解决方案?
  • @Variatus 的值可以多于或少于 4 个,这只是最简单的示例。
  • @ScottCraner 我没有 O365 订阅。
  • 那么我的答案应该可以在不需要 udf 的情况下工作。

标签: excel formulas excel-2016


【解决方案1】:

如果您订阅了 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

【讨论】:

  • 我发现第二个解决方案非常有趣,但我无法让它发挥作用。如果我理解正确,那么您以某种方式将 A1:B6 之类的范围传递给该函数。在中间部分,它查看数组是否具有多个维度。然后它以某种方式递归调用该函数并执行某些操作。但我的两个问题是,如何将范围传递给函数(UDF?)以及提取差异的其余部分是什么,例如外壳上的差异?
【解决方案2】:

这是一个适用于单个缺失值的公式。如果需要返回多个缺失值,可以使用辅助列,但 VBA 会简单得多。通常输入公式,并且应该适用于大多数版本的 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 例程,特别是在可能有多个缺失项的情况下推荐,请尝试以下操作:

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

例程使用正则表达式删除完整集中出现在部分集中的所有内容。 (然后进行最后检查以删除任何终端逗号)。这将以相同的逗号分隔模式返回多个缺失值。它不区分大小写,但您可以看到可以轻松更改的位置。

下面是两个缺失值时比较两种方法输出的屏幕截图:

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多