エクセルについて教えていただきたく、質問をさせていただいております。
長文でわかりずらいのですが、お力添えいただければ幸いです。
画像のように、シート1のA2~I9データの、全ての重複組み合わせのパターンを、シート2に出力する方法を、VBAを使って実現することは可能でしょうか。
左の画像の場合、(2.3.4.5.6.7.8.9)(1.3.4.5.6.7.8.9)(1.2.4.5.6.7.8.9)(1.2.3.5.6.7.8.9)(1.2.3.4.6.7.8.9)(1.2.3.4.5.7.8.9)(1.2.3.4.5.6.8.9)(1.2.3.4.5.6.7.9)(1.2.3.4.5.6.7.8)の9つのデータの重複組み合わせのすべてのパターンを出力した場合です。
実際には、右の図のように数値が虫食いのように、消えて変動するので、その時に、VBAを使ったマクロボタンにてデータを算出できるようにできればと考えております。
実際には、出力結果がエクセルの最大行数内で収まる場合のみに使用する目的です。
エクセルに詳しい方がいらっしゃいましたら、お力添えいただけると助かります。
宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
以下のマクロを標準モジュールに登録してください。
文字数オーバーなので下記URLに記述しました。
http://climbi.com/b/10197/0
使用時の注意事項です。
実際のシート名ですが
シート1はSheet1
シート2はSheet2
であることが前提です。
Sheet2の2行目から出力します。(1行目はそのままです。変更されません)
Const MaxLimit As Long = 10000
ですが、組み合わせの件数が、この値を超えた場合、処理をしないようにしています。
現在は10000なので、最大行数の1,048,576 行まで出力するなら、
Const MaxLimit As Long = 1048575 としてください。(2行目から書くので、出力できる件数は1件少なくなります。)
但し、1048575 を設定すると、excelの限界まで書きますので、その結果、どうなるかは私は判りません。(自己責任でお願いします)
(最低でも該当ブックのバックアップをとってから実行なさってください)
MaxLimit 以内の場合でも、実行前に「実行するかどうか」の確認メッセージがでますので、キャンセルをクリックすれば中止します。
VBAというものを、今回初めて知って、回答者様のデータを見たときに、URLで説明をする方法や、こんなにも難しいデータを私にもわかりやすく説明してくださって、ただただ驚くばかりでした!
ご教示いただき、本当にありがとうございました。
No.5
- 回答日時:
別の猛者に一歩遅れをとりましたが。
前のご質問で回答した者ですが・・・。
https://oshiete.goo.ne.jp/qa/9762293.html(前の質問)
ざっくり手順だけお伝えします。
VBAで配列をご理解できれば、ご自身で書けると思います。
逆に僕はVBAで配列の操作を良く知らないものでして、別の言語(HTML + JavaScript)で検証しました。
(1) 表の改変
現状の表でも行けないことはないですが、
縦軸、横軸ともに候補者1~9を表し、
例えば、候補者1が、候補者2に投票する可能性があれば1列目2行目のセルにTRUE(真)、なければFALSE(偽)を記入された方が、VBAを組みやすくなります。
(2) 投票相手のパターンを二次元配列化
候補者1~9の投票相手を表す配列に、それぞれ投票する可能性のある相手の番号を、配列で指定します。
VBAの書き方と少し違います([]が配列を表します)が、
例えば候補者が4人で、
[[2,3],[1,3],[1,2,4],[2]]
というような配列なら、
1サン(2サンか3サンに投票)、2サン(1サンか3サンに投票)、3サン(1サンか2サンか3サンに投票)、4サン(2サンに投票)
という意味を示します。
(3) 投票パターン出力
ここは数学的な考え方をお伝えするのが難しいので、プログラムの概要を説明します。
「候補者数」、「投票パターン数」、「総パターン数」、「投票パターン数」、「投票パターン」、「パターン積」、「投票結果配列」の7つの変数を用意してください。
「パターン積」はLong型で1を代入する初期化を行ってください。
「投票結果配列」は、シート2のセルの配置をイメージした二次元配列です。
(3-1) 手順(2)の二次元配列の各配列の要素数の積を、総パターン数に代入する。
(3-2) 「for i = 1 To 候補者数」で大ループを作る
(3-3) 「パターン積」に手順(2)の二次元配列のi番目の配列の要素数を積算する。
(3-4) 大ループの中に「for j = 1 To 総パターン数」で小ループを作る。
(3-5) 投票パターン = (Int(j / 総パターン数 / パターン積)) を 投票パターン数 で割った余り。
(3-6) 「投票結果配列(i,j)」 = 手順(2)の二次元配列(i,投票パターン)
(3-7) 「投票結果配列(i,j)」は、iサンのjパターン目の投票相手を示すので、これをシート2に出力。
・・・以上。
楽しいお題でハマってしまいました(笑)
余談ですが、当選者が同じ票数だった場合どうします??
僕の場合が、同じ票数だったらどちらも当選と見なしています。
なので、僕のサンプル(↓)で出力される確率の和は100%を超えてます。
http://web.tgco.jp/apps/votes/
このサンプルをちょっと改変して済むことでしたら、もうちょっとだけお手伝いしますよ!
No.3
- 回答日時:
この質問をみました。
できれば、質問履歴を公開しておくか、前に関連する質問をしている場合には、その質問を参照できるようにしておいた方がいいと思います。
また この質問が前の質問に関連しているとすると、例えば、❶さんが7票で最高得票の場合、❶さんに投票しなかったのは、❶さん以外にあと一人の合計2人ですが、❶さんが❷~❾さんのどれかか誰にも投票しなかったのは9パターンになるのでしょうか。
あと一人の方についても無記名投票を含めて9パターンあるとカウントするのでしょうか。 そのようなパターンカウントも可能だと思いますが、それが今回のパターンカウントの狙いなのでしょうか。
何をどのような条件でカウントするのかが決まらないと、やり方は出てきにくいと思います。
No.2
- 回答日時:
元データ(シート1)で、A~Iまですべて入っているとき、
(=ひとつも欠けていない場合)
のみ、シート2に書き出すというイメージですか。
>出力結果がエクセルの最大行数内で収まる場合のみに使用
いまいち意味が読み取れませんが、あなたの使用バージョン、最大何行まで行けるかくらい
書いときましょう。
ちなみに、9の9乗は、3億8,000万を超えます。
エクセルの最大行は今のものでも、1,048,576行です。
No.1
- 回答日時:
意図が理解できません。
「シート1」の「重複組み合わせのパターン」というのは何でしょう。
なにをどう判断すると、「シート2」のA2=2、A3=2、B4=1、I4=3のように判断できるのでしょう。
「出力結果がエクセルの最大行数内で収まる場合のみに使用する目的です」も意味がわかりません。「シート1のA3:F13の全部、D7:I12の全部だけに、1桁の数字が入力されている」状況があった場合、「シート2」にはどのセルに出力がでる可能性があるのでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) VBA CSV出力について 3 2023/04/19 14:14
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Excel(エクセル) エクセルのマクロで複数条件に当てはまるものを全て抽出したいです 7 2022/05/21 08:51
- Excel(エクセル) エクセル バーコード作成で他のシートを参照するには? 2 2023/05/03 16:57
- その他(Microsoft Office) ピボットテーブルへの集計フィールド挿入 1 2023/02/26 11:33
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
順列の作成
-
2次元動的配列の第一引数のみを...
-
VB6 配列を初期化したい
-
エクセルで最小値から0を除く方法
-
for each の現在の配列ポインタ...
-
VBA 1次元配列を2次元に追加する
-
VBのコントロール配列を二次元...
-
配列を任意の数値で埋める方法
-
ListViewで、非表示列って作れ...
-
《エクセル2000》A列・B列の商...
-
Vbscriptで変数の宣言の仕方・...
-
【MATLAB】配列内のある数値の...
-
【VBA】配列とWorksheetFunctio...
-
VLOOKUP関数で、一番下...
-
subの配列引数をoptionalで使う...
-
配列変数の添字が範囲外ですと...
-
matlabにおける行列の格納
-
友愛数を探すプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
for each の現在の配列ポインタ...
-
配列変数の添字が範囲外ですと...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
subの配列引数をoptionalで使う...
-
ListViewで、非表示列って作れ...
-
VB6 配列を初期化したい
-
Excel-VBAの配列「Public Const...
-
配列を任意の数値で埋める方法
-
Dim は何の略ですか?
-
verilogで配列の任意の8bitを取...
-
VBのFunctionで、配列を引数...
-
2次元動的配列の第一引数のみを...
-
エクセルで最小値から0を除く方法
-
VBA Match関数の限界
-
Excel VBA配列をFunctionに渡す
-
VB2008: CSV を二次元配列に読...
-
fortranでのcsvファイルの読み込み
おすすめ情報
回答ありがとうございます。
シート1のイメージとしては、
A列=①サンの投票 ⇒ 投票先は2・3・4・5・6・7・8・9のうちのどれか。
B列=②サンの投票 ⇒ 投票先は1・3・4・5・6・7・8・9のうちのどれか。
・・・・・・
・・・
I列=⑨サンの投票 ⇒ 投票先は1・2・3・4・5・6・7・8のうちのどれか。
として、①~⑨の投票の組み合わせをすべて算出し、
その結果をシート2に出力したいのですが難しいでしょうか。
excelは2016を使用していて、最大行数が1,048,576 行なので、検出結果が1,048,576 パターン以内で終わる場合のみに使用したいと考えております。