首页 > 解决方案 > 根据唯一的单元格值组合多列

问题描述

我有一张这样的表:

       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 行返回假,因为它们共有 56 个第 1 行和第 3 行返回真,因为它们没有共同的数字 第 2 行和第 3 行返回假,因为它们共有 125 和 85 个

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

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

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

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

我一直在考虑:

有什么建议么 ?

标签: arraysexcelvbaunique

解决方案


请测试下一个代码。它处理第 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

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

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


推荐阅读