下図のように1列に並んだ氏名のデータから無作為に1つを抜き出す抽選(くじ引き)マクロを VBA で作ってみましょう。

データ内容は何でもいいのですが、自分で用意するのが面倒な人は次の表をコピーして貼り付けてください。
| 氏名 |
|---|
| 生末徳実(いくすえ のりみ) |
| 友定知幾(ともさだ ともちか) |
| 外屋敷富之(そとやしき とみゆき) |
| 大成言美(だいなり ことみ) |
| 高馬貴亮(たかうま たかあき) |
| 畔見和恵(あぜみ かずえ) |
| 八賀允敏(はちが まさとし) |
| 稲童丸統治(いなどうまる とうじ) |
| 専光若子(せんこう わかこ) |
| 馬渕雅江(まぶち まさえ) |
データはテーブル形式に変えておいてください。Excel 2013 であれば [ホーム] ⇒ [テーブルとして書式設定] として好きなデザインを選びます。また「先頭行をテーブルの見出しとして使用する」には必ずチェックを入れておきます。
【VBA】抽選マクロ
別記事で作った FRANDBETWEEN 関数と組合わせてマクロを作ります。FRANDBETWEEN は指定した範囲内の整数値を返す関数で、ワークシート上では RANDBETWEEN 関数と同じようなはたらきをします。
'[VBA] 抽選(くじ引き)プロシージャ
'指定範囲の整数をランダムに返す関数
Function FRANDBETWEEN(a As Long, b As Long) As Long
Randomize
FRANDBETWEEN = Int((b - a + 1) * Rnd) + a
End Function
Sub Lottery()
Dim ct As Long
Dim rd As Long
Dim mydata As String
'見出し部分を除いたデータ数を数えます
ct = ActiveSheet.ListObjects("氏名").ListRows.Count
'1からデータ総数までのランダム整数をrdに入れます
rd = FRANDBETWEEN(1, ct)
'リストのデータ部分を文字列変数 mydata に入れます
mydata = ActiveSheet.ListObjects("氏名").ListRows(rd).Range
'セルD3に抽選結果を書き込みます
ActiveSheet.Range("d3").Value = mydata
End Sub
Lottery() を実行する度にセル D3 の氏名が変化するはずです。
テーブル形式データは VBA では ListObject オブジェクトとして用います。
ct = ActiveSheet.ListObjects("氏名").ListRows.Count
という記述で現在開いているシートの ListObject コレクションから「氏名」テーブルを選択し、見出し部分を除いた行である ListRows コレクションを参照してCount プロパティでその総数を得ています。
単一の行が欲しいときは ListRow オブジェクトを取得します。
mydata = ActiveSheet.ListObjects("氏名").ListRows(rd).Range
ListRows() の引数を rd という無作為整数にすることで、 ListRows コレクションの中からランダムに行を選択しています。ちなみに ListObject オブジェクトから特定の範囲を得るには必ず Range プロパティが必要になるので注意してくださいね。
【書籍紹介】仕事が速い人ほどマウスを使わない! 超速エクセル仕事術
関数の使い方もマクロも載っていないけど、Excel を使う人なら1度は読んでおきたい本です。本書には数字や文字を入力したり、セルの大きさを変えたり、罫線(けいせん)引いたりするという、ごくごく日常的に行っているありふれた作業を、ちょっとした工夫で劇的に改善するトピックが詰まっています。なので「エクセルはちょっと苦手だな」とか「業務でエクセルを使うけれども、それほど高度な知識は必要ないよ」という人にもおすすめです。
新品価格 | ![]() |

コメント