• 締切済み

Excelマクロでのデータ全通り組み合わせ出力方法

Excelマクロでのデータ全通り組み合わせ出力方法 VBA初心者です。以下の内容につき教えて頂けますと助かります。 添付ファイルの【因子/水準表】データの全組み合わせを【全通り組み合わせ表】に出力したいです。 以下にやりたいことを纏めます。 ・【因子/水準表】データ(因子/水準)の全組み合わせを【全通り組み合わせ表】に出力したい。 ・【因子/水準表】と【全通り組み合わせ表】は同一シート内で列を合わせたい。 ・因子数、水準数は可変としたい。(添付ファイルでは因子数3、水準数の最大は4となっているが、この数が可変となるため、【全通り組み合わせ表】の開始セルも併せて可変となる) 以上、よろしくお願いいたします。

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

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

こんばんは! VBAでないので、参考にならなかったら無視してください。 ↓の画像でA列~C列のデータをE列~G列に表示しています。 E2セルは =IF(COUNTA($A$2:$A$100)*COUNTA($B$2:$B$100)*COUNTA($C$2:$C$100)<ROW(A1),"",INDEX($A$2:$A$100,INT((ROW(A1)-1+COUNTA($B$2:$B$100)*COUNTA($C$2:$C$100))/(COUNTA($B$2:$B$100)*COUNTA($C$2:$C$100))))) F2セルは =IF(E2="","",INDEX($B$2:$B$100,IF(MOD(INT((ROW(A1)-1)/COUNTA($C$2:$C$100))+1,COUNTA($B$2:$B$100))=0,COUNTA($B$2:$B$100),MOD(INT((ROW(A1)-1)/COUNTA($C$2:$C$100))+1,COUNTA($B$2:$B$100))))) G2セルは =IF(E2="","",INDEX($C$2:$C$100,IF(MOD(ROW(A1),COUNTA($C$2:$C$100))=0,COUNTA($C$2:$C$100),MOD(ROW(A1),COUNTA($C$2:$C$100))))) という数式を入れ、E2~G2セルを範囲指定し、G2セルのフィルハンドルで下へずぃ~~~!っと コピーすると画像のような感じになります。 以上、無理矢理って感じの方法ですが 最初に書いたように参考にならなかったら読み流してくださいね。m(__)m

brickts
質問者

お礼

ご回答ありがとうございます! なるほど関数でもいけるのですね。ご教授頂いた通りできました。 勉強になります。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mimeu
  • ベストアンサー率49% (39/79)
回答No.3

No1.です。 For ~ Next 文は理解しやすくてよいのですが、因子の数が増減するとプログラムを書き換える必要があり、またその数がヤタラ多いと使えない欠点があります。 なので「理解しにくい」バージョンも作ってみましたので、紹介します。 これだと因子数や水準数が増減してもプログラムを書き換えずにこのままで使えます。 (どちらも最大限32767件までですが、実用上問題ないでしょう) 添付図は実行結果です。 経験の浅い方には何をしてるのか一見して全然ワカランと思いますが、 実は For ~ Next 文と全く同じことをしています。 もしプログラムを書き込む方法をご存じなかったら、http://qa.jiji.com/qa5717655.html などをご覧ください。 ' 仮に因子水準表のA列は水準1,水準2等の文字、B2セルは因子1の文字だと ' 仮置きします、違ってたら Const 行加算・列加算 を適宜訂正してください。 ' また組合せ表は見出し行、見出し列なしにA1セルから ' いきなりデータを書き込んでいます。 Option Explicit Option Base 1 Sub Try()   Const 行加算 = 2   Const 列加算 = 1   Dim 因子数行 As Integer, 因子数 As Integer, 水準値配列() As Integer, 因子数配列() As Integer   Dim 因子水準表 As Worksheet, 組合せ表 As Worksheet   Dim 行 As Long, 列 As Long   ' 作業準備   Set 因子水準表 = Worksheets("水準表") ' 適当な名前に直してね   Set 組合せ表 = Worksheets("組合せ")   ' 適当な名前に直してね   因子数行 = 因子水準表.Range("A" & 因子水準表.Rows.Count).End(xlUp).Row   因子数 = 因子水準表.Range("B2").End(xlToRight).Column - 列加算   ReDim 水準値配列(因子数)   ReDim 因子数配列(因子数)   For 列 = 1 To 因子数     因子数配列(列) = 因子水準表.Cells(因子数行, 列 + 列加算)   Next 列   組合せ表.UsedRange.Clear   行 = 1   列 = 1   Application.ScreenUpdating = False    組合せ表出力:   水準値配列(列) = 水準値配列(列) + 1   If 水準値配列(列) > 因子数配列(列) Then     If 列 = 1 Then       Application.ScreenUpdating = True       End     End If     水準値配列(列) = 0     列 = 列 - 1     GoTo 組合せ表出力   End If   If 列 < 因子数 Then     列 = 列 + 1     GoTo 組合せ表出力   End If   For 列 = 1 To 因子数     組合せ表.Cells(行, 列) = 因子水準表.Cells(水準値配列(列) + 行加算, 列 + 列加算)   Next 列   列 = 因子数   行 = 行 + 1   GoTo 組合せ表出力 End Sub

brickts
質問者

お礼

ご回答ありがとうございます! 現在ご教授頂いた内容を勉強中です。後日再コメントさせて頂きます!

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

既に回答が出ていますが、私の書き方で書いてみました。 解釈というよりも、味付けだけの違いで、考え方は同じです。 '// Sub CombinationMaking()  Dim x As Long, y As Long, z As Long  Dim a As Range, b As Range, c As Range    j = 10 '書き出し行  '因子に空白行を入れないでください。  Set a = Range("B2", Range("B2").End(xlDown))  Set b = Range("C2", Range("C2").End(xlDown))  Set c = Range("D2", Range("D2").End(xlDown))  Range(Cells(j, 2), Cells(j, 4).End(xlDown)).Resize(, 3).ClearContents  Application.ScreenUpdating = False  For x = 1 To a.Count   For y = 1 To b.Count    For z = 1 To c.Count     Cells(j, 2).Value = a.Cells(x, 1).Value     Cells(j, 3).Value = b.Cells(y, 1).Value     Cells(j, 4).Value = c.Cells(z, 1).Value     j = j + 1    Next   Next  Next  Application.ScreenUpdating = True End Sub

brickts
質問者

お礼

ご回答ありがとうございます! No1の方のご回答と合わせて理解することができました。 次は因子数を自動的に判定し、全通りの組み合わせができるよう、 自分なりに検討してみます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mimeu
  • ベストアンサー率49% (39/79)
回答No.1

因子の数がいくらくらいかによりますが、 また Excel のバージョンにもよると思いますが 少数なら (汗)  For ~ Next 文で簡単にできます。 こんな感じです.   For 因子1の水準値 = 1 To 因子1の水準数     For 因子2の水準値 = 1 To 因子2の水準数       For 因子3の水準値 = 1 To 因子3の水準数         ~~~~ 以下同形式の繰り返し ~~~~           行 = 行 + 1           出力シート.Cells(行,1) = 因子水準表.Cells(因子1の水準値+頭位置,1)           出力シート.Cells(行,2) = 因子水準表.Cells(因子2の水準値+頭位置,2)           出力シート.Cells(行,3) = 因子水準表.Cells(因子2の水準値+頭位置,3)           ~~~~ 以下同形式の繰り返し ~~~~         Next       ~~~~ 以下同形式の繰り返し ~~~~     Next   Next ただし For ~ Next 文を入れ子にするには限度があります。 残念ながら私はその限界数をしりませんので正確なことを言えませんが、 もし因子数が何十何百とあるなら、この方法はつかえません。 その場合は、少しだけ理解しにくい別の手を使います。

brickts
質問者

お礼

ご回答ありがとうございます! VBA初心者ですがご丁寧な説明で内容を理解することができました。 2点目のご回答も自分なりに勉強してみます!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelでデータ全通り組み合わせ出力方法

    Excelでデータ全通り組み合わせ出力方法について教えて頂けますと助かります。 セルA~Eに、数がまちまちのアイテム名が入っています。 (セルA~Eというのは例で、変則的に全てのアイテム数は増減します。) 全ての組合せをセルG~Kに各々書き出してくれる方法はあるでしょうか? (イメージ添付あり) できればセルに入力すれば自動的に組合せが追加されていくのが理想です。 Excel2010を使用しており、VBAは初心者です。 どなたかご存じでしたら、ぜひお教え下さい。 よろしくお願いします。

  • Excelですべての組合せ(重複組合せ)を出力するには?

    Excelですべての組合せ(重複組合せ)を出力するには? 次の条件のような場合、Excelですべての組合せ(重複組合せ)をVBAで出力するにはどうしたらいいのでしょうか? 10種類のお菓子の中から、好きなものを3個選んでセットにするとします。 同じものを複数選ぶのはありですが「菓子A、菓子B、菓子C」と「菓子B、菓子C、菓子A」は選んだ順が違うだけで同じ組合せなので、どちらか片方だけにします。 この場合、すべての組合せの数は Excelの関数で求めることができるようで COMBIN(10+3-1,3) = 220 通りあることまではわかりましたが、このすべての組合せの一覧をどのようにして出力したらいいのかがわかりません。 いろいろ検索した結果、順列という方法は見つかりましたが、重複組合せでの方法は見つけることができませんでした。 また、Accessを使っても似たようなことができるのでしょうか? 直積? できれば、3個固定ではなく5個の場合も出来るとうれしいです。 よろしくお願いします。

  • Excel 2003のVBAマクロデータをExcel 2007で見たい

    Excel 2003のVBAマクロデータをExcel 2007で見たい。 Excel 2003でVBAマクロを登録したExcelファイルがありますが、今回、Excel 2007をインストールして、該当ファイルを開いたところ、「マクロデータを削除しました。」とメッセージが出て、VBEを起動してもマクロが見えなくなりました。OSはWindowsXP SP3です。Excel 2003で登録したVBAマクロをExcel 2007で削除されないで、次の2点について、可能にするにはどうすればよいか、ご教示願います。 (1)マクロデータを残す方法。 (2)マクロ起動する方法。

  • Excelマクロ:配列データからグラフを作成するには?

    マクロ初心者です。 Excel VBAのマクロで、2つの配列データから、散布図グラフを作成したいのですが、セルに配列データを書き込まず、直接グラフ化するにはどうしたらよいでしょうか? 配列データの要素数がexcelの行と列の最大数(65536,256)?を超えてしまっているので、配列データから直接グラフ化したいと思っています。 よろしくお願いいたします。

  • 2つのエクセルから同じデータを持つ行を出力する方法

    エクセルで作成した二つのDBがあります。それぞれ、列・行の数は異なるのですが、同じ名称の列(例えば郵便番号)を持っています。 この二つのファイルから、同じ列に同じ情報をもった行を取りだす、ということをしたいのですが、関数やマクロでの実現できる方法がございましたら、教えて頂けないでしょうか。 例:二つの住所録のようなファイルAとファイルBがあって、郵便番号が154-0001のデータ(行)を、別のファイルCに出力する。(また、ファイルC上では、各データがファイルAとファイルBのどちらから出力されたものかも、判別が付くように出力したい) 分かりにくいケースで大変恐縮ですが、ご存じの方がおりましたら、どうぞよろしくお願いいたします。 ※エクセル2003を使用しています。

  • エクセルマクロでDBのデータをエクセルに出力したい。

    エクセルマクロを初めてしています。 基本的な事で半日費やしてしまい恐縮なのですがアドバイス頂けたら助かります。 マクロの中身は大体こんな感じかな・・というかんじで分かるのですが、いざ自分が作るとなるとよく分からないでいます。 タイトル通りなのですが、エクセルマクロでDBのデータをエクセルに出力するには、どうしたらよいのでしょうか。なにか関数があるのでしょうか。 また何かサンプルがあるサイトがあれば教えてください。

  • EXCELVBA 全通りの組み合わせの出力

    はじめまして! VBAの記述の方法が分からず困っています。 過去の質問も検索してみましたが、自分のケースにどうあてはめればよいかわからず・・。 どなたが教えていただけないでしょうか? A1~AK1までそれぞれ1~37までの数字が入力されています。 組み合わせとして、そこから35個の数字を選ぶ場合の全通りを記載したいです。 2行目のA1~AI1までに選んだ35個の数字を出力し、 1行ずつ下にずらしていきたいです。 大変お手数ですが・・・よろしくお願いします・・・

  • エクセルを使った組み合わせ検索をしたい

    添付ファイルのように条件にあった組み合わせはなんなのかを算出したいです。 正直組み合わせは数百とあり、その中であったものを選びたいんです。 無茶はわかっております。 どうしてもエクセルで行いたいのです。しかもVBAを使わずに だれかアイデアマンのかた教えてください。

  • excelで購入データから商品の組み合わせを集計

    添付の【表1】のように、購入者が購入した商品が一個一行でまとめられた購入データがあります。 購入者がどのような組み合わせで商品を購入しているかを把握するために、 【表2】のように、同一購入者が併買している組み合わせの数をエクセルでカウントしたいと考えています。 excelの関数、またはピボットテーブル等で集計する方法があれば教えていただけないでしょうか。 併買を集計する目的にかなうのであれば、【表2】の表を変更いただいても構いません。 どうかよろしくお願いいします。

  • 外部データを取り込むマクロ

    マクロ初心者です。 デスクトップ上にCSVファイルを出力し、それをエクセルに取り込んで、 そのデータを見やすく加工するマクロを作りました。 自分のパソコンだとうまく実行できますが、 社内の他の人のパソコンだとできません。 CSVのデータは、共有のオラクルからデータを出力しているので、同じものです。 実行しようとすると、 「実行時エラー1004  外部データ範囲を更新するためのテキスト ファイルが見つかりません  テキスト ファイルが移動または名前が変更されていないことを確認し、  再度実行してください」 と言われ、 デバッグするとVBAで .Refresh BackgroundQuery:=False が黄色くなっています。 どうすればうまくいきますか? 教えてください。よろしくお願いします。

専門家に質問してみよう