根据唯一的单元格值组合多个列
Combine multiple columns based on unique cell values
我有一个 sheet :
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
.
.
.
.
我需要一次合并两行,我是运行一个通过sheet的嵌套循环,每次满足一个条件,就合并两行。
条件是:两行不应该在 Col5 中共享一个相似的数字,换句话说,要使条件为真,“Col5 for row X”和“Col5 for row X+1”都应该具有唯一性数字。
像这样
第 1 行和第 2 行 returns 错误,因为它们有 56 个共同点
第 1 行和第 3 行 returns 正确,因为它们没有共同的数字
第 2 行和第 3 行 returns 错误,因为它们共有 125 和 85
如果“True”满足条件并合并行,则返回“false”,然后代码移至下一行。
检查两个单元格是否具有唯一/不重复数字的最佳方法是什么?
到目前为止我尝试了什么:
到目前为止,Col5 中的数字集很小,所以我只使用了逻辑语句“Num1 <> Num2 AND Num1 <> Num3 AND ......
但是随着数字的增长,不可能使用该方法。
我一直在考虑:
将两个Col5单元格做成一个动态数组,检查数组是否有唯一值(不知道怎么做)
在每个 Col5 单元格中,将每个数字乘以 2,然后将所有数字加在一起,得到一个我可以与另一个 Col5 单元格编号进行比较的数字。但是我不确定这个方程式是否每次都能从那组数字中得出一个唯一的数字(我希望能产生意义)
有什么建议吗?
请测试下一个代码。它处理第 5 列(“E:E”),returns 一个数组,正如我在评论中建议的那样,它的内容从第二行开始放在“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
请测试代码并发送一些反馈。
我试着评论那些看起来更难理解的台词。如果还有什么不清楚的,请不要犹豫,要求澄清。
我有一个 sheet :
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
.
.
.
.
我需要一次合并两行,我是运行一个通过sheet的嵌套循环,每次满足一个条件,就合并两行。
条件是:两行不应该在 Col5 中共享一个相似的数字,换句话说,要使条件为真,“Col5 for row X”和“Col5 for row X+1”都应该具有唯一性数字。
像这样
第 1 行和第 2 行 returns 错误,因为它们有 56 个共同点 第 1 行和第 3 行 returns 正确,因为它们没有共同的数字 第 2 行和第 3 行 returns 错误,因为它们共有 125 和 85
如果“True”满足条件并合并行,则返回“false”,然后代码移至下一行。
检查两个单元格是否具有唯一/不重复数字的最佳方法是什么?
到目前为止我尝试了什么:
到目前为止,Col5 中的数字集很小,所以我只使用了逻辑语句“Num1 <> Num2 AND Num1 <> Num3 AND ...... 但是随着数字的增长,不可能使用该方法。
我一直在考虑:
将两个Col5单元格做成一个动态数组,检查数组是否有唯一值(不知道怎么做)
在每个 Col5 单元格中,将每个数字乘以 2,然后将所有数字加在一起,得到一个我可以与另一个 Col5 单元格编号进行比较的数字。但是我不确定这个方程式是否每次都能从那组数字中得出一个唯一的数字(我希望能产生意义)
有什么建议吗?
请测试下一个代码。它处理第 5 列(“E:E”),returns 一个数组,正如我在评论中建议的那样,它的内容从第二行开始放在“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
请测试代码并发送一些反馈。
我试着评论那些看起来更难理解的台词。如果还有什么不清楚的,请不要犹豫,要求澄清。