下図のように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度は読んでおきたい本です。本書には数字や文字を入力したり、セルの大きさを変えたり、罫線(けいせん)引いたりするという、ごくごく日常的に行っているありふれた作業を、ちょっとした工夫で劇的に改善するトピックが詰まっています。なので「エクセルはちょっと苦手だな」とか「業務でエクセルを使うけれども、それほど高度な知識は必要ないよ」という人にもおすすめです。
新品価格 | ![]() |

コメント