【问题标题】:Combine multiple columns based on unique cell values根据唯一的单元格值组合多列
【发布时间】:2021-09-20 06:36:47
【问题描述】:

我有一张这样的表:

       Col1  Col2  Col3  Col4   ------ Col5 --------
ROW 1   A     C     D     T     12,26,56,58,84,96
ROW 2   J     K     K     L     56,89,105,85,96,125
ROW 3   Y     I     X     O     5,10,60,90,85,125,40
 .
 .
 .
 .

我需要一次合并两行,我在工作表中运行一个嵌套循环,每次满足条件时,这两行就合并在一起。

条件是:两行在 Col5 中不应该共享一个 smilar 数字,换句话说,要使条件为真,“Col5 for row X”和“Col5 for row X+1”应该都有唯一的数字。

喜欢这个

第 1 行和第 2 行返回 false,因为它们共有 56 个 第 1 行和第 3 行返回 true,因为它们没有共同的数字 第 2 行和第 3 行返回 false,因为它们共有 125 和 85

如果“真”满足条件并合并行,则返回“假”,然后代码移至下一行。

检查两个单元格是否具有唯一/不重复数字的最佳方法是什么?

到目前为止我尝试了什么:

到目前为止,Col5 中的数字集很小,所以我只使用了逻辑语句“Num1 Num2 AND Num1 Num3 AND ...... 但随着数量的增长,无法使用该方法。

我一直在考虑:

  • 将两个 Col5 单元格作为一个动态数组,并检查该数组是否具有唯一值(不知道怎么做)

  • 在每个 Col5 单元格中,将每个数字幂为 2,然后将所有数字相加,然后得到一个数字,我可以将其与另一个 Col5 单元格编号进行比较。但我不确定这个方程是否每次都能从这组数字中产生一个唯一的数字(我希望这有意义)

有什么建议吗?

【问题讨论】:

  • 欢迎来到 SO。你自己尝试过什么?根据你的例子,你能说明two rows should not have similar numbers in the last row是什么意思吗?什么被认为是unique / not duplicate?也许再提供一行或两行来解释它们。
  • 你自己尝试了什么?您的问题并不清楚,即使有人会尝试帮助制定规则,该规则规定您必须证明您自己尝试过/做过某事。 “根据条件将多行组合在一起”是什么意思?您希望这样的代码返回什么? “两行的最后一行不应有相似的数字”是什么意思? “两个单元格具有唯一/不重复的数字”简单的意思是不相等。 Unique 概念在相同范围内有多个值的情况下有意义......
  • 我编辑了我的帖子,我希望我的问题更清楚一点,而且现在很有意义。
  • 要从第 5 列的内容中创建一个数组,请使用 SPLIT 函数。要判断它们是否唯一,请遍历它们,将它们存储在 Dictionary、Collection 或 ArrayList 对象中。
  • “第 1 行和第 3 行返回 true,因为它们没有共同的数字”? 85呢?行是如何组合的? col5 是否扩展到两组数字?

标签: arrays excel vba unique


【解决方案1】:

请测试下一个代码。它处理第 5 列(“E:E”),按照我在评论中的建议返回一个数组,其内容从第二行开始放在“G:G”列中:

Sub comopareRows()
   Dim sh As Worksheet, lastRow As Long, arr, arr2, arrChk, arrC
   Dim mtch, i As Long, arrFin, j As Long, k As Long
   
   Set sh = ActiveSheet
   lastRow = sh.Range("E" & sh.rows.count).End(xlUp).row
   arr = sh.Range("E2:E" & lastRow).Value 'place the range in an array for faster iteration
   ReDim arrFin(1 To WorksheetFunction.Combin(UBound(arr), 2), 1 To 1): k = 1
   For i = 1 To UBound(arr)
        arrChk = Split(arr(i, 1), ",")
        For j = i + 1 To UBound(arr)
            arr2 = Split(arr(j, 1), ",")
            mtch = Application.IfError(Application.match(arrChk, arr2, 0), "##") 'it replace the not mathing error with "##"
            If UBound(Filter(mtch, "##", False)) = -1 Then        'it eliminates the error replacement string and counts remained elements (in base 0)
                                                                  'an empty array returns -1
                arrFin(k, 1) = i & "-" & j & " = True": k = k + 1
            Else
                arrFin(k, 1) = i & "-" & j & " = False": k = k + 1
            End If
        Next j
   Next i
   'drop the result:
    sh.Range("G2").Resize(UBound(arrFin), 1).Value = arrFin
End Sub

请测试代码并发送一些反馈。

我尝试评论那些看起来更难理解的行。如果仍有不清楚的地方,请随时要求澄清。

【讨论】:

  • @mounim 你没抽时间测试一下上面的代码吗?如果经过测试,它没有满足您的需求吗?
  • 谢谢你,它做我真正需要的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 2018-02-27
  • 2016-07-24
  • 1970-01-01
相关资源
最近更新 更多