- ベストアンサー
文字列の組み合わせをエクセルで書き出したい。
エクセル初心者です。 文字列の組み合わせのパターンを全部書き出したいのですが、エクセルでそのようなことは可能でしょうか? A,B,C,D,E,F,Gの7文字から4文字を抽出し、文字列を作りたいです。 ex)ABCD、GEDCなど。 4文字は必ず異なるアルファベットです ex)AABF、ADCDなどはダメ。 順序が異なれば同じ組み合わせでもかまいません。 ex)ABCD、DCBA ←大丈夫。 また、もしエクセルでできなかったら手書きで書き出そうと思うのですが、簡単な方法をご存知でしたらそちらもお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#4です。 間違いがあったので訂正しておきます。 (#3でも同じ結果がでます。) '==========標準モジュールに記述=========================== Option Explicit Sub test() Dim i1 As Long Dim i2 As Long Dim i3 As Long Dim i4 As Long Dim i As Long Dim R As Long Dim k As Long Dim myArray As Variant myArray = Array(, "A", "B", "C", "D", "E", "F", "G") Application.ScreenUpdating = False Cells.Clear i = 1 For i1 = 1 To 7 For i2 = 1 To 7 For i3 = 1 To 7 For i4 = 1 To 7 Cells(i, "A").Value = myArray(i1) Cells(i, "B").Value = myArray(i2) Cells(i, "C").Value = myArray(i3) Cells(i, "D").Value = myArray(i4) i = i + 1 Next i4 Next i3 Next i2 Next i1 For k = i To 1 Step -1 For R = 1 To 7 If Application.WorksheetFunction. _ CountIf(Range(Cells(k, "A"), Cells(k, "D")), myArray(R)) >= 2 Then Rows(k).Delete End If Next R Cells(k, "E").Value = Cells(k, "A").Value & _ Cells(k, "B").Value & _ Cells(k, "C").Value & _ Cells(k, "D").Value Next k Application.ScreenUpdating = True End Sub
その他の回答 (6)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
=PERMUT(7,4) または、=FACT(7)/FACT(3) で 840個かな? で総当り =7^4 で2401 関数とフィルタオプションの設定を使っての回答 A2セル 1 A2セルを選択して 編集-フィル - 連続データの作成 範囲:●列、種類:●加算、増分値:1、停止値:2401 B1:E1セルにタイトル 適宜 B2セルに =CHAR(MOD(INT(($A2-1)/7^(4-COLUMN(A1))),7)+65) 右へオートフィル、そのままフィルハンドルダブルクリック 総当りの完成 条件表 G1セル には何も入力しない G2セル =SUMPRODUCT(COUNTIF(B2:E2,B2:E2))=4 データ - フィルタ - フィルタオプションの設定 抽出先:●指定した範囲 リスト範囲:$B$1:$E$2402 検索条件範囲:$G$1:$G$2 抽出範囲:$I$1 後は文字をつなげる
お礼
ご回答ありがとうございました! 画像をつけて頂き参考になりました。
がんばれば手作業でもできるので一応書いておく。 A1セル ABCDEFG A2~A36セル 1234 1235 1236 1237 1245 1246 1247 1256 1257 1267 1345 1346 1347 1356 1357 1367 1456 1457 1467 1567 2345 2346 2347 2356 2357 2367 2456 2457 2467 2567 3456 3457 3467 3567 4567 B1~Y1セル 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321 B2セル =MID($A$1,MID(A2,1,1),1) & MID($A$1,MID(A2,2,1),1) & MID($A$1,MID(A2,3,1),1) & MID($A$1,MID(A2,4,1),1) C2セル =MID($B2,MID(C$1,1,1),1) & MID($B2,MID(C$1,2,1),1) & MID($B2,MID(C$1,3,1),1) & MID($B2,MID(C$1,4,1),1) C2セルの数式をY2セルまでドラッグしてコピー B2~Y2セルまでを選択して、36行目まで数式をコピーする。
お礼
ご回答ありがとうございました! 色々な方法があるのですね。勉強になりました!
- ka_na_de
- ベストアンサー率56% (162/286)
VBAで作ってみました。 ただし、泥臭いのろまな方法です。 公開するのも恥ずかしいのですが、 お求めの結果は表示されると思います。(E列に) '==========標準モジュールに記述=========================== Option Explicit Sub test() Dim i1 As Long Dim i2 As Long Dim i3 As Long Dim i4 As Long Dim i As Long Dim R As Long Dim k As Long Dim myArray As Variant myArray = Array(, "A", "B", "C", "D", "E", "F", "G") Application.ScreenUpdating = False Cells.Clear i = 1 For i1 = 1 To 7 For i2 = 1 To 7 For i3 = 1 To 7 For i4 = 1 To 7 Cells(i, "A").Value = myArray(i1) Cells(i, "B").Value = myArray(i2) Cells(i, "C").Value = myArray(i3) Cells(i, "D").Value = myArray(i4) i = i + 1 Next i4 Next i3 Next i2 Next i1 For k = i To 1 Step -1 For R = 1 To 7 If Application.WorksheetFunction. _ CountIf(Range(Cells(k, "A"), Cells(k, "D")), myArray(R)) >= 2 Then Rows(k).Delete Else Cells(k, "E").Value = Cells(k, "A").Value & _ Cells(k, "B").Value & _ Cells(k, "C").Value & _ Cells(k, "D").Value End If Next R Next k Application.ScreenUpdating = True End Sub
- minosennin
- ベストアンサー率71% (1366/1910)
一発の関数では難しそうなので段階を分ける方法を考えてみました。 1.重複をかまわず、つぎの組み合わせを作る。ただしa~gを1~7に置き換える。 a b c d aaaa 1 1 1 1 aaab 1 1 1 2 aaac 1 1 1 3 . . gggg 7 7 7 7 まず、a1 b1 c1 d1 に1を入力する。 a2 =IF(IF(AND(B1=7,C1=7,D1=7),A1+1,A1)<=7,IF(AND(B1=7,C1=7,D1=7),A1+1,A1),1) b2 =IF(IF(AND(C1=7,D1=7),B1+1,B1)<=7,IF(AND(C1=7,D1=7),B1+1,B1),1) c2 =IF(IF(D2=1,+C1+1,C1)<=7,IF(D2=1,+C1+1,C1),1) d2 =IF(D1+1<=7,D1+1,1) 7^4=2401通りの組み合わせがあるので、2401行までドラッグ ここで、一旦別シートに値コピーを行う。 2.1.でできた組み合わせから、文字の重複分を取り除く これはcountif関数ででも 3.数字をabcに読み換える。 これはvlookup関数ででも 垢ぬけしませんが、もし他の方法でうまくいかない場合お試しください。
お礼
ご解答ありがとうございました! もうちょっとエクセルを勉強したいと思います。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 直接の回答ではないのですが・・・ 関数ではかなり難しいような気がします。 普通に考えると 7種類の中から4種類を選ぶ組み合わせは 7×6×5×4=840 通りになり、なおかつその中の順番が入れ替わってもOKということだと思いますので さらに 840×(4×3×2×1)=20160 通りになるかと思います。 (間違っていたらごめんなさい。) 何か規則性は見つからないかと思い ↓の画像のように表を作ってみました、 いちいちA・B・・・と入力するのは大変ですので A~D列に数字で組み合わせをあらわし、 F1セルに =VLOOKUP(A1,$K$1:$L$7,2,0) と入れて、オートフィルで列・行方向にコピーするようにしたのですが、 なかなか規則性が見つかりません。 A~D列で何か規則性を見つければ関数でもいけそうな感じがするのですが・・・ 回答になっていなくてこの程度でごめんなさいね。m(__)m
お礼
ご解答ありがとうございました! 実際に画像を載せていただき、大変参考になりました。 20160通り・・・・!!早々に質問してよかったです・・・・。
- imogasi
- ベストアンサー率27% (4737/17069)
順列という数学の理屈を勉強すること。 エクセルなどそれから考えること。 http://www.kwansei.ac.jp/hs/z90010/sugaku1/kakuritu/jyunretu/jyunre.htm の動画部分が参考になるのでは。 ーー 4文字から4+1=5点を離して書く。 第1点から第2点に、曲線で7本の線を結ぶ。 曲線にA,B・・Gの名前を書き込む。 第2点と第3点、第3点と第4点、第4と第5点でも、同じことをやる。 その「道=線}の通り方を考えるとよい。 そしてA-Aのような道は禁止らしいから、線の上にXを書いて考える。 ーーー VBAだと繰り返しや禁止のチェックが出来るので、プログラムが簡単になるが。 ーー 関数だとむつかしそうだ。
お礼
ご解答ありがとうございました! リンクがとても勉強になりました。
お礼
ご解答ありがとうございました! 2つあわせてお礼させていただきます。 エクセルは右も左もわからないのですが、なんとか教えていただいた方法で出すことができました!! 助かりました!