Excelを使って組合せをすべて列挙する関数「KUMIAWASE」を作りました。
書式
KUMIAWASE(全体,抜き取り数)
全体 抜き取る対象をカンマ区切りの文字列で指定します。「a,b,c,」のように末尾に「,」を付けます。
抜き取り数 抜き取る組み合わせ1組に含まれる項目の数を指定します。
解説
- 組合せを「a,b;a,c;b,c;」のような文字列で返します。「a,b」「a,c」「b,c」の組合せが列挙されます。
- 全体の末尾が「,」でない場合、あるいは総数<抜き取り数である場合、エラー値#VALUE!が返されます。
コード
Function KUMIAWASE(zentai, nukitorisu)
'使用例
'zentai="a,b,c,"
'nukitorisu=2
'KUMIAWASE="a,b;a,c;b,c;"
Const sep = ";"
Dim arrayall, arraypart
Dim numall As Long, numpart As Long, i As Long, j As Long
Dim temp As String, textpart As String
If Right(zentai, 1) <> "," Then
KUMIAWASE = "#VALUE!"
Exit Function
End If
arrayall = Split(zentai, ",")
numall = UBound(arrayall)
If nukitorisu > numall Then
KUMIAWASE = "#VALUE!"
ElseIf nukitorisu = 1 Then
For i = 0 To numall - 1
KUMIAWASE = KUMIAWASE & arrayall(i) & sep
Next i
ElseIf nukitorisu > 1 Then
For i = 0 To numall - nukitorisu
temp = ""
For j = i + 1 To numall - 1
temp = temp & arrayall(j) & ","
Next j
textpart = KUMIAWASE(temp, nukitorisu - 1)
arraypart = Split(textpart, ";")
numpart = UBound(arraypart)
For j = 0 To numpart - 1
KUMIAWASE = KUMIAWASE & arrayall(i) _
& "," & arraypart(j) & sep
Next j
Next i
End If
End Function
'使用例
'zentai="a,b,c,"
'nukitorisu=2
'KUMIAWASE="a,b;a,c;b,c;"
Const sep = ";"
Dim arrayall, arraypart
Dim numall As Long, numpart As Long, i As Long, j As Long
Dim temp As String, textpart As String
If Right(zentai, 1) <> "," Then
KUMIAWASE = "#VALUE!"
Exit Function
End If
arrayall = Split(zentai, ",")
numall = UBound(arrayall)
If nukitorisu > numall Then
KUMIAWASE = "#VALUE!"
ElseIf nukitorisu = 1 Then
For i = 0 To numall - 1
KUMIAWASE = KUMIAWASE & arrayall(i) & sep
Next i
ElseIf nukitorisu > 1 Then
For i = 0 To numall - nukitorisu
temp = ""
For j = i + 1 To numall - 1
temp = temp & arrayall(j) & ","
Next j
textpart = KUMIAWASE(temp, nukitorisu - 1)
arraypart = Split(textpart, ";")
numpart = UBound(arraypart)
For j = 0 To numpart - 1
KUMIAWASE = KUMIAWASE & arrayall(i) _
& "," & arraypart(j) & sep
Next j
Next i
End If
End Function
使用例
全体 | 抜き取り数 | KUMIAWASE |
---|---|---|
a,b,c,d,e, | 1 | a;b;c;d;e; |
a,b,c,d,e, | 2 | a,b;a,c;a,d;a,e;b,c;b,d;b,e;c,d;c,e;d,e; |
a,b,c,d,e, | 3 | a,b,c;a,b,d;a,b,e;a,c,d;a,c,e;a,d,e;b,c,d;b,c,e;b,d,e;c,d,e; |
a,b,c,d,e, | 4 | a,b,c,d;a,b,c,e;a,b,d,e;a,c,d,e;b,c,d,e; |
a,b,c,d,e, | 5 | a,b,c,d,e; |
コメント
こんにちは。
プログラムのDimでは、
Dim numall, numpart, i, j As Long
の様にすると、
jだけがLongになります。
numall, numpart, iは型宣言した事にはならないので、valiantになってしまいます。ご注意ください。
nakaiさん
ありがとうございます。訂正しました。