• ベストアンサー

エクセルで順列の列挙

例えば 1 と 2 という2個の数字(文字)がある場合,  A列 B列   1   2   2   1 1 2 3 という3個の数字(文字)がある場合,  A列 B列 C列   1   2   3   1   3   2   2   1   3   2   3   1   3   1   2   3   2   1 1 2 3 4 という4個の数字(文字)がある場合,  A列 B列 C列 D列   1   2   3   4   1   2   4   3    ~ 省略 ~   4   3   2   1 という具合に n 個の数字(文字)がある場合,過不足無く列挙させるマクロ(VBA)を教えてください。 Excelの仕様上65,536行までしかないので,「8個の場合」とかいう限定された個数でもかまいません。 また,123,132,213,…,321 という具合に数値として1列に並べる方法でもかまいません。 また昇り順でなくてもかまいません。 よろしくおねがいします。

noname#35109
noname#35109

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 学校の宿題とかではありませんよね。 以下は、再帰を使った、順列生成のアルゴリズムです。 たぶん、大丈夫だと思います。後は、65536を超えないようにしてください。 Const N As Integer = 3 '生成する順列数 Dim k As Long Dim p(1 To N) Sub perm_test()  Dim i As Long  ActiveSheet.Cells.ClearContents  k = 0  For i = 1 To N   p(i) = i  Next i  perm 1 End Sub Private Sub perm(i As Long)  Dim j As Long, t As Long  If i < N Then   For j = i To N    t = p(i): p(i) = p(j): p(j) = t    perm i + 1    t = p(i): p(i) = p(j): p(j) = t   Next j  Else    For j = 1 To N     Cells(k + 1, j).Value = p(j)    Next j    k = k + 1  End If End Sub

noname#35109
質問者

お礼

えっ,し・し・し…宿題… バレたか… というような歳ではないのですよ,残念ながら。 宿題はイヤですけど,2~3日くらいなら宿題があったころにもどってみたい気もします。 回答ありがとうございました! 8桁までならハングアップすることもなかったです。完璧です。すごい。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

過去に似たような質問がありました (セルを分けていませんが) http://okweb.jp/kotaeru.php3?qid=1126322 http://okweb.jp/kotaeru.php3?qid=1128457

noname#35109
質問者

お礼

回答ありがとうございました。 実際に2つとも実験させていただきました。 特に「質問:EXCELのマクロ :再帰的式を使って書き換える」は参考になりました。 JavaScriptの方ではよくお名前を拝見しておりましたが,実は何でもプログラムできる方だったのですね。 今後ともよろしくおねがいします。

関連するQ&A

  • エクセルで有効データのみ列挙する方法について

    A列とB列は数字が列挙、C列に『=if(A1>0,A1*B1,""』が入力されています。 C列に表示されている数字のみD列に列挙される関数のような物ってありますか? フィルタ機能使ったりしないでA列とB列にデータを入力したら瞬時にD列にデータが集まる方法があれば教えて下さい。 よろしくお願いします。

  • エクセルかマクロで・・・

    エクセル関数かマクロで作りたいのですが、   A列に数字B列に個数を入力していくとします。   A列の数字をB列の個数分だけC列に表示したいのです。  例えばA1に300、B1に5、A2に500、B2に6と入力した場合、   C1からC5に300、C6からC11に500、と表示するにはどうしたらよい  でしょうか。 よろしくお願いいたします。

  • ■エクセル■ PRODUCT関数で「~ではない」。

    早速ですが、例えば、 ・A1~A10の範囲に1~5が入っている。 ・B1~B10の範囲に文字列「あ」~「お」までが入っている。 ・C1~C10の範囲に個数が入っている(1~99の数字)。 この場合で、D1のセルに「A1~A10の数字が5で、「お」以外の個数の合計」を求めるときはどういった関数を使えばいいのでしょうか?? =SUMPRODUCT((A1:A10=5)*(B1:B10<>"お")*(C1:C10)) と、入力してもエラーが出てしまうので、困ってます。どうしたらできますか?? よろしくおねがいします。

  • エクセルの関数について

    エクセルのシート1で1行目には見出しがあります。 A1には「店名」の文字 A2には、A店 A3にはC店 A4にはB店 A5にはA店とA2~A200には、ランダムにA店~C店の文字がランダムに入っています。 B2には、「個数」の見出し文字。B2には 3 B3には 201  B4には 42 などとB2~B200まで色々な数字が入っています。 ちなみに B列には 0~300までのランダムな数字。 これをシート2に、B列の数の区分けをしたいのです B列の区分け 0~30 31~50  50~300  よって、シート2のA1には「店名」という文字。B2には 0~30  C2には 31~50  D2には50~300という文字が入っています・ シート2のA2には、A店 シート2のA3には B店 シート2の A4には C店 という文字が入っています。 シート2のB2にはシート1のA店のB列にある B2~B200に入ってる文字の 0~200までに入ってる数字 0~30の セルの個数を出したいのですが どうやってシート2に関数を入れたらいいのですか?教えてください

  • エクセルで教えてくだいSUMPRODUCT

    A列B列に文字と数字が混ざって並んでいます A列で7かつB列で0以上の個数を調べたいのですが SUMPRODUCTを使うと文字を0と認識するようでうまくできませんどうしたらいいですか A B 7 9 7 5 7 みかん この場合2個ですが文字のおかげで3になってしまいます

  • エクセルで同じ数字が連続している個数を関数でセルに出力

    A列に1かー1かいずれかの数字が入力されているとき、その行から上方に数えて、B列には1の連続している個数を、C列にはー1の連続している個数を出力したいのです。例えば A列    B列    C列 1      1     0 1      2     0 -1    0     1 -1    0     2 -1    0     3 といった具合です。 この時、B列、C列にはどのような関数を入力すればよいでしょうか。

  • エクセル マクロ 足し算

    いつもお世話になります。マクロ勉強中の初心者です。 マクロの足し算を教えてください。 A列  B列  C列 ・・・・  1   2    3  4   5    6  7   8    9 という数字のデータがあります。 これらのA列の合計、B列の合計・・・など列の合計を出すマクロはわかるのですが、  作成したVBA    Range("a4") = Application.WorksheetFunction.Sum(Range("a1:a3")) A列の合計(A1~A3)とB列の合計(B1~B3)とC列(C1~C3)の合計を、D4に合計させる方法を 教えてください。 どうぞよろしくお願いします。

  • エクセルマクロに詳しい方

    すいません教えて下さい。  例えば、A1のセルに30、A2のセルに5 A3のセルに7 といった感じで数字があるとして どこかの列のある位置 を基準として 例えば C列の先頭から A1のセルにある 数字の分だけ色分けるマクロってどのようになるのでしょうか この場合 C1からC30までが黒 C31~35までは緑 といった具合にしたいのです。 A列に入る数字は必ずしも 一定ではありません。  できましたら、 マクロを簡単に書いて頂けると大変うれしいです。 よろしくお願いします。

  • エクセルでの連番の処理

    お世話になります。 1行目に入力されたデータをルールに沿って2行目以下にどんどん追加していきたいと思っています。 まずD1、E1のセルに数字を入れます。 例:D1に3、E1に25 を入れてマクロを実行するとD列の2行目以下に3,4,5,6…25と連番で入力出来るようにしたいのです。 この例ではD列は24行目まで入力されています。そこで2行目から24行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。なおA,B,C列は数字、文字列どちらもあります。空白の場合もあります。 この状態でA~E列の1行目のデータを変更し、仮にD1を2、E1を15としたとします。ここで再度マクロを実行すればD25に2、そして順に連番が入りD38に15が入るようにします。 同時に25行目から38行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。 これの繰り返しです。 つまり2行目以下のD列で空白の行以下にどんどん連番を入れていく具合です。 前提としてD1、E1は整数しか入りません。またE1の数字はD1より大きいです。ただD1,E1に同じ数字が入った場合、その数字の1行分だけが入力されるようにします。 以上の処理が自動化できるマクロはできますか? アドバイス願います。

  • エクセルの関数について

    エクセルについてご教授をお願い致します。 C列のセルに入っている文字列があります。 (例えばA-111やB-111Gなど) D列のセルの中から、C列の文字列を検索して、 C列の文字列の次の文字が数字だった場合のみ、 その数字1文字だけを削除する場合はどのようにしたら宜しいでしょうか。 (例えばA-1113の3の部分や、B-111G1の1の部分です。 数字じゃない場合や、次の1文字以降(2文字目)に数字があっても 削除対象ではありません。 あくまで、C列の文字列の次の数字1文字のみです。 (例えばA-11131の場合は3だけ削除でA-1111となります。  Bー111G1Gの場合は、1だけ削除でB-111GGとなります。) 説明がわかりにくいとは思いますが、 この説明でわかって頂ける先生がおられましたら ご教授お願いします。

専門家に質問してみよう