先頭行、末尾行、列を指定して無作為抽出する VBAマクロ
以前にも紹介した無作為抽出の別バージョンです。
ファンクションマクロと連携するサブルーチンを作ってみました。
この無作為抽出的なマクロって、ググってもなかなか載っていなかったりするのでお得な情報ですよー。本当ですよー。てなわけで、シートに次のような形でデータが揃っていると仮定します。
A | |
---|---|
1 | |
2 | |
3 | 小樋山 江美子 (こひやま えみこ) |
4 | 漆畑 英美子 (うるしばた えみこ) |
5 | 末長 紫 (すえなが むらさき) |
6 | 西間 るびな (にしま るびな) |
7 | 千賀 阿己 (せんが あみ) |
8 | 黄地 偉史 (こうち いふみ) |
9 | 音居 秀樹 (おとい ひでき) |
10 | 照瀬 伊織 (てるせ いおり) |
11 | 元良 涼真 (げんりょう りょうま) |
12 | 下幸茂 慎之介 (しもこうも しんのすけ) |
実際に試してみたい人は2列目の「小樋山 江美子」以下をコピーしてセル A3 に貼りつけてね。まあ、何でも適当なデータを A 列に入れておけば大丈夫です。
RSELECTB 関数
まず先に列から1つだけ抜き取るユーザー定義関数を用意しておきます。
以前に RSELECT という関数を作ったので、それと区別するために RSELECTB という名前にします。頭文字の R は Random の略です。
' x で対象列を指定してセルの値を1つ抜き取ります
Function RSELECTB(bg As Integer, ed As Integer, x As Integer) As Variant
Randomize
y = Int((ed - bg + 1) * RND) + bg
RSELECTB = Cells(y, x)
End Function
抜き取るデータには何が入っているのかわからないので、関数は Variant で宣言しておきます。先頭行 bg から末尾行 ed までの範囲の整数 y をランダムに発生させて、y 行 x 列のデータを無作為に選びます。
無作為抽出マクロ
上で作ったユーザー定義関数を組み込んで、無作為に選んだセルの値を E1 から E10 まで計 10 個並べてみます。
'ユーザー定義 RSELECTB を呼び出し、
'セルを無作為に抜き出して E1 から E10 に並べます
Sub 無作為抽出()
For d = 1 To 10
Cells(d, 5).Value = RSELECTB(3, 8, 1)
Next
End Sub
For で E 列の 1 ~ 10 行までをループさせて、それぞれのセルにユーザー定義関数 RSELECTB(3, 8, 1) で抜き取った値を書き込んでいきます。このマクロを実行すると、次のように E 列に氏名が並びます(重複あり)。
E | |
---|---|
1 | 小樋山 江美子 (こひやま えみこ) |
2 | 漆畑 英美子 (うるしばた えみこ) |
3 | 千賀 阿己 (せんが あみ) |
4 | 西間 るびな (にしま るびな) |
5 | 漆畑 英美子 (うるしばた えみこ) |
6 | 西間 るびな (にしま るびな) |
7 | 西間 るびな (にしま るびな) |
8 | 小樋山 江美子 (こひやま えみこ) |
9 | 黄地 偉史 (こうち いふみ) |
10 | 黄地 偉史 (こうち いふみ) |
ただし、末尾行を 8 と指定してあるので、元のデータの 9 行目以降は抜き出しの対象になっていません(音居秀樹、照瀬伊織、元良涼真、下幸茂慎之介の氏名がないことを確認してください)。もちろん無作為ですから、並び順は実行するごとに違った結果となります。