在 Excel 中,有一种最佳方法可以对来自多个范围的连接值进行 qsort 排序,其中
a) 连接值必须是不同的
b) 每个连接值可以有一个可选的前后文本(分隔符)来包围它
c)连接值被排序(qsort )。
我在下面的 DISTINCT_CONCAT 函数中实现了 a) 和 b),但是 c) qsort 没有编码。在下面的代码中是否有最佳的 qsort 方法(不是冗长的),最好在参数之前和之后使用Collection Add 方法。任何想法将不胜感激希望此代码将来可以帮助其他人解决类似问题。
示例 Excel 公式:
对于电子表格单元格
A1:A4 包含
21、12、32、12
B2:B4 包含
14、08、12
,公式宏函数
将在另一个电子表格单元格中显示一个不同的范围值列表,如
$list.add("21");
$list.add("12");
$list.add("32");
$list.add("14");
$list.add("08");
我的偏好是该函数将不同范围值的排序字符串返回为
$list.add("08");
$list.add("12");
$list.add("14");
$list.add("21");
$list.add("32");
=DISTINCT_CONCAT("$list.add(";"); "&CHAR(10);TRUE;Sheet1!A1:A4;Sheet2!B2:B4)
没有 qsort 的 DISTINCT_CONCAT 函数
目的:一个范围内所有单元格值的不同连接,带有可选的前后文本
输入:
beforeCellValue - 出现在单元格值之前的
可选文本 afterCellValue - 出现在单元格值之后的可选文本
cellValueInQuotes - 如果为真,则单元格值 123 显示为“123 ",否则为 123
cellValueRange - 要连接的一个或多个范围,使用范围的文本值返回:连接字符串
Public Function DISTINCT_CONCAT( ByVal beforeCellValue As String, ByVal afterCellValue As String, ByVal cellValueInQuotes As Boolean, ParamArray cellValueRange() As Variant) As String
Dim c As Collection, i As Long, cell As Range
Set c = New Collection
For i = LBound(cellValueRange) To UBound(cellValueRange)
For Each cell In cellValueRange(i)
If Len(cell.text) > 0 Then
On Error Resume Next
c.Add cell.value, cell.text ' distinct collection (no duplicates)
On Error GoTo 0
End If
Next cell
Set cell = Nothing
Next i
Dim returnText As String
Dim value As Variant
For Each value In c
If cellValueInQuotes Then
returnText = returnText & beforeCellValue & Chr(34) & value & Chr(34) & afterCellValue
Else
returnText = returnText & beforeCellValue & value & afterCellValue
End If
Next value
DISTINCT_CONCAT = returnText
End Function