個人事業主の方必見!確定申告のお悩み解決

エクセル初心者です。
文字列の組み合わせのパターンを全部書き出したいのですが、エクセルでそのようなことは可能でしょうか?

A,B,C,D,E,F,Gの7文字から4文字を抽出し、文字列を作りたいです。
ex)ABCD、GEDCなど。

4文字は必ず異なるアルファベットです
ex)AABF、ADCDなどはダメ。

順序が異なれば同じ組み合わせでもかまいません。
ex)ABCD、DCBA ←大丈夫。

また、もしエクセルでできなかったら手書きで書き出そうと思うのですが、簡単な方法をご存知でしたらそちらもお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0
この回答へのお礼

ご解答ありがとうございました!
2つあわせてお礼させていただきます。
エクセルは右も左もわからないのですが、なんとか教えていただいた方法で出すことができました!!
助かりました!

お礼日時:2009/10/27 00:25

=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

後は文字をつなげる
「文字列の組み合わせをエクセルで書き出した」の回答画像7
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました!
画像をつけて頂き参考になりました。

お礼日時:2009/10/27 00:28

がんばれば手作業でもできるので一応書いておく。



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行目まで数式をコピーする。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました!
色々な方法があるのですね。勉強になりました!

お礼日時:2009/10/27 00:26

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
    • good
    • 0

一発の関数では難しそうなので段階を分ける方法を考えてみました。


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関数ででも

垢ぬけしませんが、もし他の方法でうまくいかない場合お試しください。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございました!
もうちょっとエクセルを勉強したいと思います。

お礼日時:2009/10/27 00:24

こんばんは!


直接の回答ではないのですが・・・

関数ではかなり難しいような気がします。

普通に考えると 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
「文字列の組み合わせをエクセルで書き出した」の回答画像2
    • good
    • 0
この回答へのお礼

ご解答ありがとうございました!
実際に画像を載せていただき、大変参考になりました。
20160通り・・・・!!早々に質問してよかったです・・・・。

お礼日時:2009/10/27 00:22

順列という数学の理屈を勉強すること。


エクセルなどそれから考えること。
http://www.kwansei.ac.jp/hs/z90010/sugaku1/kakur …
の動画部分が参考になるのでは。
ーー
4文字から4+1=5点を離して書く。
第1点から第2点に、曲線で7本の線を結ぶ。
曲線にA,B・・Gの名前を書き込む。
第2点と第3点、第3点と第4点、第4と第5点でも、同じことをやる。
その「道=線}の通り方を考えるとよい。
そしてA-Aのような道は禁止らしいから、線の上にXを書いて考える。
ーーー
VBAだと繰り返しや禁止のチェックが出来るので、プログラムが簡単になるが。
ーー
関数だとむつかしそうだ。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございました!
リンクがとても勉強になりました。

お礼日時:2009/10/27 00:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング