Excel では、複数の範囲から連結された値を qsort する最適な方法があります。a
) 連結された値は異なる必要があります
b) 各連結された値には、それを囲むオプションの前後のテキスト (区切り文字) を含めることができ
ます c) 連結された値は並べ替えられます (qsort) )。
以下の DISTINCT_CONCAT 関数で a) と b) を達成しましたが、c) qsort はコーディングされていません。以下のコードで、できればパラメーターの前後にCollection Add メソッドを使用して qsort (冗長ではない) する最適な方法はありますか。どんなアイデアでも大歓迎です。うまくいけば、このコードが将来、同様の問題を抱えている他の人に役立つことを願っています。
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 - true の場合、セル値 123 は「123」として表示されます"、それ以外の場合は 123
cellValueRange - 範囲のテキスト値を使用して連結される 1 つまたは複数の範囲 戻り値: 連結された文字列
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