抽選マクロ ListObjectオブジェクトから特定範囲を抜き出します

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

 Excel-VBA抽選マクロ(籤引きプロシージャ)

 データ内容は何でもいいのですが、自分で用意するのが面倒な人は次の表をコピーして貼り付けてくださいな。

氏名
生末徳実(いくすえ のりみ)
友定知幾(ともさだ ともちか)
外屋敷富之(そとやしき とみゆき)
大成言美(だいなり ことみ)
高馬貴亮(たかうま たかあき)
畔見和恵(あぜみ かずえ)
八賀允敏(はちが まさとし)
稲童丸統治(いなどうまる とうじ)
専光若子(せんこう わかこ)
馬渕雅江(まぶち まさえ)

 データはテーブル形式に変えておいてください。 Excel2013 であれば [ホーム] ⇒ [テーブルとして書式設定] として好きなデザインを選びます。また「先頭行をテーブルの見出しとして使用する」には必ずチェックを入れておきます。

抽選マクロ

 別記事で作った FRANDBETWEEN 関数 と組合わせてマクロを作ります。FRANDBETWEEN は指定した範囲内の整数値を返す関数で、ワークシート上では RANDBETWEEN 関数と同じようなはたらきをします。

 Function FRANDBETWEEN(a As Long, b As Long) As Long
  Randomize
  FRANDBETWEEN = Int((b - a + 1) * Rnd) + a
 End Function

 Sub 抽選()

 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

 マクロを実行する度にセル D3 の氏名が変化するはずです。

データ数を数えます

 テーブル形式データは VBA では ListObject オブジェクトとして用います。

ct = ActiveSheet.ListObjects("氏名").ListRows.Count

という記述で現在開いているシートの ListObject コレクションから「氏名」テーブルを選択し、見出し部分を除いた行である ListRows コレクションを参照してCount プロパティでその総数を得ています。

特定の行を選択します

 単一の行が欲しいときは ListRow オブジェクトを取得します。

mydata = ActiveSheet.ListObjects("氏名").ListRows(rd).Range

 ListRows() の引数を rd という無作為整数にすることで、 ListRows コレクションの中からランダムに行を選択しています。ちなみに ListObject オブジェクトから特定の範囲を得るには必ず Range プロパティが必要になるので注意してくださいね。

 ≫ VBA の技術トップページ

スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)