【发布时间】:2012-12-17 15:19:38
【问题描述】:
在 Excel 中,有一种最佳方法可以对来自多个范围的串联值进行 qsort 排序,其中
a) 连接的值必须是不同的
b) 每个连接的值可以有一个可选的前后文本(分隔符)来包围它
c) 对连接的值进行排序 (qsort)。
我已经在下面的 DISTINCT_CONCAT 函数中实现了 a) 和 b),但是 c) qsort 没有编码。 在下面的代码中是否有最佳的 qsort 方法(不详细),最好使用 Collection Add method before 和 after 参数。任何想法将不胜感激希望此代码将来可以帮助其他人解决类似问题。
Excel 公式示例:
对于电子表格单元格
A1:A4 包含 21、12、32、12
B2:B4 包含 14, 08, 12
公式宏功能
=DISTINCT_CONCAT("$list.add(";"); "&CHAR(10);TRUE;Sheet1!A1:A4;Sheet2!B2:B4)
将在另一个电子表格单元格中显示一个不同的范围值列表,如
$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");
没有 qsort 的 DISTINCT_CONCAT 函数
目的:一个范围内所有单元格值的不同连接,之前和可选
文字后
输入:
beforeCellValue - 出现在单元格值之前的可选文本
afterCellValue - 出现在单元格值之后的可选文本
cellValueInQuotes - 如果为 true,则单元格值 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
【问题讨论】:
-
只是好奇,这是干什么用的?
-
你的
cellValueInQuotes不是多余的吗?如果用户想要引号,他们可以将它们附加/添加到beforeCellValue和afterCellValue参数 -
是的,它会附加引号,但这意味着在公式字符串中添加 CHAR(34) 2 次,这使得它不可读。例如:
=DISTINCT_CONCAT("$list.add("&CHAR(34);CHAR(34)&"); "&CHAR(10);TRUE,Sheet1!A1:A4,Sheet2!B2:B4) -
joseph4tw,它将动态操作代码添加到 Drools 规则决策表 (.xls)。然后将此决策表转换为 drools 规则语言文件 (.drl),该文件由 drools 规则引擎在运行时加载,在专家系统中使用。
-
或者你可以在字符串中使用双双引号:=DISTINCT_CONCAT("$list.add(""";"""); "&CHAR(10);TRUE,Sheet1! A1:A4,Sheet2!B2:B4)
标签: vba sorting excel concatenation distinct