• ベストアンサー

順列の組み合わせを表示させる方法

B~Cの3列のそれぞれの2つの数字からできる順列の組み合わせを図のように表示させる方法をご教示願います。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.3です。 列数は必ず3列というコトですので、前回の方法で大丈夫のはずです。 ただ、この操作を何度も行うのであれば、表示されているデータを一旦削除する必要がありますね。 >3行目が数字の桁数だと思いますが、 とは >cnt = 2 のコトでしょうか? これは桁数ではありません。何行目から表示するか?という基準の行数ですので、 あらかじめ「2」(2行目)を指定してやり For~Nextでループするたびに >cnt = cnt + 1 のように1行ずつプラスしていますので、結局3行目以降、順番に表示しているだけです。 ↓のコードに変えてマクロを実行してみてください。 ※ データを入れるセルは 必ずB2~D2セルとします。 Sub Sample2() 'この行から Dim i As Long, j As Long, k As Long, cnt As Long, endRow As Long endRow = Cells(Rows.Count, "B").End(xlUp).Row If endRow > 2 Then Range(Cells(3, "B"), Cells(endRow, "D")).ClearContents End If cnt = 2 For i = 1 To Len(Cells(2, "B")) For j = 1 To Len(Cells(2, "C")) For k = 1 To Len(Cells(2, "D")) cnt = cnt + 1 With Cells(cnt, "B") .Value = Mid(Cells(2, "B"), i, 1) .Offset(, 1) = Mid(Cells(2, "C"), j, 1) .Offset(, 2) = Mid(Cells(2, "D"), k, 1) End With Next k Next j Next i End Sub 'この行まで ※ B2~D2セルには何桁でも良いので、何らかのデータを入力してください。 空白セルがあると全く反応しません。m(_ _)m

KIKAIDER01
質問者

補足

ありがとうございます。バッチリいけました。 k、j、iはアルファベットであれば、なんでもいいのでしょうか?

その他の回答 (6)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

No.3・5です。 返信が遅くなってごめんなさい。 >k、j、iはアルファベットであれば、なんでもいいのでしょうか? に関して・・・ ご自身で変数の宣言をすれば アルファベットでも日本語でもなんでも構いません。 >Dim i As Long, j As Long, k As Long, の部分は >Dim B列 As Long, C列 As Long, D列 As Long のように好みで宣言してみてください。 ただ、あまりに長い変数にしてしまうと、前回のコードでは i → B列 j → C列 k → D列 とコード内すべてで間違えないように入力しなければならないので、 個人的には簡単なアルファベットにしているだけです。 ※ 注意点 ※  使用するアルファベットに関してですが、m(月) d(日) 等々Excelでは他に使用しているアルファベットは 極力使用しない方が良いと思います。m(_ _)m

KIKAIDER01
質問者

お礼

ありがとうございます。 お礼が遅くなってごめんなさい。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.6

>2行目の「17」「69」「45」というのがあり、B3~D10に順列のパターン(164、165、194、195、764、765、794、795)を表示させる方法というのが質問の趣旨でした。 逆でしたか。 B2、C2、D2の値をB3:D10へ1桁ずつ配置する処理ですね。 元のデータは2桁の3組ですから2^3=8となり8つのパターンがあります。 B3=IF(ROW()-3<(2^3)/2,IF(ROW()-2<=2^3,VALUE(MID(B$2,1,1)),""),IF(ROW()-2<=2^3,VALUE(MID(B$2,2,1)),"")) C3=IF(MOD(ROW()-3,4)<(2^3)/4,IF(ROW()-2<=2^3,VALUE(MID(C$2,1,1)),""),IF(ROW()-2<=2^3,VALUE(MID(C$2,2,1)),"")) D3=IF(MOD(ROW()-2,2)=1,IF(ROW()-2<=2^3,VALUE(MID(D$2,1,1)),""),IF(ROW()-2<=2^3,VALUE(MID(D$2,2,1)),"")) 上記3つの関数をセットして、下へオートフィルでコピーすれば完成です。 手違いで11行目以降へコピーしても結果は空欄になります。 元データの上桁が下桁より大きいときは期待通りの結果になりませんのでB列を優先順位1位、B列を2位、C列を3位として昇順ソートすれば目的通りになります。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.4

B3:D10に提示添付画像の通りに値が入力されていることを前提にすれば以下の方法でB2からD2へ目的通りの値を算出できます。 1、B2へ次の式を入力する。  =VALUE(IF(COUNTIF(B3:B10,1),"1","")&IF(COUNTIF(B3:B10,2),"2","")&IF(COUNTIF(B3:B10,3),"3","")&IF(COUNTIF(B3:B10,4),"4","")&IF(COUNTIF(B3:B10,5),"5","")&IF(COUNTIF(B3:B10,6),"6","")&IF(COUNTIF(B3:B10,7),"7","")&IF(COUNTIF(B3:B10,8),"8","")&IF(COUNTIF(B3:B10,9),"9","")) 2.B2セルをC2とD2にコピーする。 COUNTIF関数で検出された値を文字化して連結しました。 出来上がった文字列をVALUE関数で数値化しています。 B2からD2までの値が文字列で良ければVALUE関数を省いて運用してください。 文字列連結は&演算子以外にCONCATENATE関数を使うこともできます。

KIKAIDER01
質問者

補足

すいません、説明不足でした。2行目の「17」「69」「45」というのがあり、B3~D10に順列のパターン(164、165、194、195、764、765、794、795)を表示させる方法というのが質問の趣旨でした。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! No.2さんと同じ疑問を持ちつつ・・・ 質問の画像通りの3列配置とします。 VBAになってしまいますが、一例です。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, j As Long, k As Long, cnt As Long cnt = 2 For i = 1 To Len(Cells(2, "B")) For j = 1 To Len(Cells(2, "C")) For k = 1 To Len(Cells(2, "D")) cnt = cnt + 1 With Cells(cnt, "B") .Value = Mid(Cells(2, "B"), i, 1) .Offset(, 1) = Mid(Cells(2, "C"), j, 1) .Offset(, 2) = Mid(Cells(2, "D"), k, 1) End With Next k Next j Next i End Sub 'この行まで ※ 2行目の桁数は1桁以上であれば何桁でも対応できます。 ※ 列数が増える場合は変数を増やせば対応可能です。 こんなんではどうでしょうか?m(_ _)m

KIKAIDER01
質問者

補足

3行目が数字の桁数だと思いますが、No.2さんが書かれているように桁数は増える可能性があります(列数は増えません)。しかも、B~D列の桁数がまちまちになることもありますので、桁数を自動認識するようにはできないでしょうか。お手間を取らせますが、引き続きご教示お願い致します。

noname#204879
noname#204879
回答No.2

後になって、「3つの数字」の場合とか、「B~Dの4列」の場合とか、言い出しませんか?

回答No.1

B3 =0+mid(B$2,1+mod(int((rows(B$3:B3)-1)/2^(3-columns($B3:B3))),2),1) B3 セルをコピー、B3:D10 のセル範囲に貼り付け

関連するQ&A