Excel VBA 質問スレッド No.161 (未解決)

偏り、ダブりがないように選択して繰り返す方法を教えてください。

投稿者 : VBA初心者です     投稿日時 : 2021/01/14(Thu) 11:26:57     OS : Windows 10     EXCEL : Excel 2016
シートAに選択したい数字が20個あります(X)
シートBのA列とB列にはランダムに数字が入っています。(シートAの数字も含む)
D列とE列に同じ行内のA,B列とかぶらないようにXの中から選択して貼り付けたいです。
また、最終的に吐き出されたD,E列の数字は満遍なくXの中から選択されるようにしたいです。

どのようなコードを組めば実現可能でしょうか?

[返信 1] Re : 偏り、ダブりがないように選択して繰り返す方法を教えてください。
投稿者 : ヘンリー     投稿日時 : 2021/01/15(Fri) 00:33:11
>偏り、ダブりがないように選択して繰り返す
VBAの質問ではなく、アルゴリズムの質問と思いますが、
違っていたら申し訳ありません。

【前提条件】
シートAの20個ある数値に重複がない

【参考案】
作業用シートとして、シートCを作成して、A列の20個ある数字(数値と判断します)が、
DとE列に何回書き込まれたかをカウントしておき、
選ばれてる回数が少ない順から割り当てる
※数学が得意な人ならば、もっと違う方法もあるかと思いますが、
 私は数学が大の苦手なので(泣)、ロジックだけでなんとか実現します。

【考え方】
VBAはプログラミング言語のひとつです。
やり方は多数あると思いますが、
プログラミングとは、まずは、作業を細かく分けて、
それらの順番を並び替える、という事を考えます。

①シートCを作成する
②シートAのA列1行目から20行目までのデータを、シートCのA列1行目から20行目までに書き込む
③シートCのB列1行目から20行目までに数値の0(ゼロ)を書き込む
④シートCの読み取り用カウンター変数に1(イチ)をセット
⑤シートBのA列n行目の数値とシートCのA列1行目が不一致、
 且つシートBのB列n行目の数値と、シートCのA列1行目が不一致になるまで⑥を繰り返し
⑥シートCの読み取り用カウンター変数に1(イチ)を足す
⑦シートBのm列目(1回目は3、2回目は4)に、シートCのA列1行目の数値を書き込む
⑧シートCのA列1行目からB列20行目までを、B列、A列の小さい順に並び替え
⑨④~⑧を2回繰り返す
⑩④~⑨をシートBのデータのある行数分だけ繰り返す
⑪作業用シートのシートCを削除

と、こんな感じです。
ただ、今回は、繰り返し処理がネスト(繰り返し処理の中に、別の繰り返し処理を入れている事)
されております。こういう場合、プロシージャを分けることをお勧めします。

私なら、プロシージャを3つ作成します。
ただ、引数の受け渡し、戻り値を返すプロシージャが使用できない場合は、
1つのプロシージャに書いてもよいとは思います。

なお、⑪のシート削除の際に、メッセージを出したくない場合は、
Application.DisplayAlertsを使用します。

ご参考になれば幸いです。

当掲示板について
返信入力フォーム
お 名 前  :
内  容   :
ステータス  : この質問を解決済みにする

認証コード  :
        キャプチャ画像


( 処理日時 : 2021-01-27 11:59:15 )

Page
Top