かつて予想外に速攻作成に悩んだのが、Excel VBA で一覧からの無作為(ランダム)抽選です。ランダムは追求すると難しいのですが、今回は最も簡単にして、コードを書いてみます。
設定環境
Windows版 Microsoft Excel 2013
具体的には、以下の例を処理してみます。
5つの建物(ビル)に、抽選で応募者を入居者を募る例です。
60名の応募者がいて、40名はそのまま希望通りの建物に入居できます。
残りの20名はランダムに建物を割り当てます。
建物A、B、C、D、Eをそれぞれ建物1、2、3、4、5として数字に置き換えて処理します。
この例では、40名は確実に希望が叶いますが、残りの20名はくじ引きされますので、うまくいけば希望通りということになるだけです。
処理としては、まず、全員にランダムで建物を振り分ける、次に望みどおりになる40名をまず抽出、残りの20名はランダムのままにするという流れです。
結果としては 40名以上が希望通りの建物が割り当てられるという計算です(残り20名は抽選される)。
使用する関数1 Int()
a = 11.123
b = -11.123
Int(a) ' 11 になります
Int(b) '-12 になります
Int(n) は引数 n の小数部分を取り除いて返します。引数 n が負の数の場合は、絶対値が大きくなる方向に丸めます。
例えば、n に -11.123 を入れる場合、値が小さくなる方向(絶対値が大きくなる方向)-12 に丸めます。
使用する関数2 Rnd()
Rnd(n) は0以上1未満の乱数を返します。引数 n は省略可能です。
例えば、5~10までの整数をランダムに生成するには、以下のようなコードが定番です。
Int((10 - 5 + 1) * Rnd + 5) ' 5~10までの整数
Int((最大 - 最小 + 1) * Rnd + 最小) という定番式です。
「最大 - 最小」の部分で変化させる幅を求め、Rnd でその何割を有効にするか計算して、保証する最小値を加えて結果にしています。
実際のコードを書いていく手順
Cells や Columns、Range の使用方法(書式)は、もし馴染みがない方はヘルプを参照すのるがおすすめです。一分もあれば応用まですぐ飲み込めます。
以下の作業の例では、実際に使うセルの領域は B4:D63 になります。
セル C2 にはランダムではない、そのままの抽出数を入れます。
B 列は識別 ID 列で、計算では使いません。
C 列は希望建物の番号を入力します。
D 列に抽出結果を出します。
準備としては B4:C63 にあらかじめデータを入力しておくだけです。
VBA モジュールを作成する
Excel で実際にマクロを書いていきます。
画面は Excel 2013 の例です。
デフォルトでは、「表示」タブの右端にマクロボタンがあります。
VBA プロジェクトの「標準モジュール」を作成します。
VBA のコード
"Sub PickUp_F_Click()" から "End Sub" の間に以下のコードを書きます。
''' 一覧から無作為に抽選するマクロ
Sub PickUp_F_Click()
Dim Ret As Integer, i As Integer, Num As Integer, rn As Integer
i = 0
Columns("D").ClearContents 'D列の内容を消去します。
Columns("D").ClearFormats 'D列の書式を消去します。
'見出し行の行番号 3行目
Ret = 3
'全60行にまずランダムで割り振ります
i = 0
While i < 60
i = i + 1
' Cells 3:C列, 4:D列
Cells(Ret + i, 3).Copy Destination:=Cells(Ret + i, 4)
' 1~5までの数字をランダム抽出する
' Int((最大 - 最小 + 1) * Rnd + 最小) の定番式で処理
rn = Int((5 - 1 + 1) * Rnd + 1)
Cells(Ret + i, 4) = rn 'D列のセルに選んだランダム数字をセット
Wend
i = 0
While i < Cells(2, 3) 'セルC2に抽出したい人数を入れます
'見出し行の行番号
Rett = Int((60 * Rnd) + 1) + Ret
If Cells(Rett, 4).Value <> "*" Then
Cells(Rett, 4) = "*"
i = i + 1
Cells(Rett, 3).Copy Destination:=Cells(Rett, 4)
End If
Wend
End
このコードを、フォームのボタンに割り当てるか、もしくは「マクロ」から実行します。
興味ある方は、VBA の基礎コースなどチェックしてみてください。
-
Excel VBAで数値をランダム化する方法と基礎知識
かつてはPCでデタラメな数を生成することは、厳密には難しいことだったのですが、最近ではかなり巧妙に、二度と再現できないよ ...
続きを見る
-
[EXCEL]エクセルで楽にランダムペアを割り当てるには?
今回はEXCELの小ネタです。 本ページはこんな方におすすめ VBA 無しでランダムペアを組みたい 口頭で説明できるレベ ...
続きを見る