我有一个表单:
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中不应该共享相同的数字,换句话说,条件为真,"Col5为行X"and "Col5为行X+1"都应该有唯一的数字
这样的
ROW 1 &2返回false,因为它们有56个共同点行1 &3返回true,因为它们没有共同的数字ROW 2 &3返回false,因为它们共有125和85
如果"True"条件满足并将行合并,则"false";返回,则代码移动到下一行。
检查两个单元格是否有唯一/不重复的数字的最佳方法是什么?
我试过了:
到目前为止,Col5中的数字集很小,所以我只使用了逻辑语句"Num1 & lt;比;Num2 AND Num1 <>Num3 AND ......但是随着数字的增长,使用这种方法是不可能的。
我一直在想:
使两个Col5单元格作为一个动态数组,并检查数组是否有唯一的值(不确定如何做到这一点)
在每个Col5单元格中,将每个数字赋值为2,然后将所有数字加在一起,得到一个可以与其他Col5单元格编号进行比较的数字。但我不确定这个方程是否每次都能从那组数字中得到一个唯一的数字(我希望有意义)
有什么建议吗?
请测试下一个代码。它处理第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
请测试代码并发送一些反馈。
我试着注释那些看起来比较难理解的行。如果还有什么不清楚的地方,请不要犹豫,要求澄清。