下図のように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度は読んでおきたい本です。本書には数字や文字を入力したり、セルの大きさを変えたり、罫線(けいせん)引いたりするという、ごくごく日常的に行っているありふれた作業を、ちょっとした工夫で劇的に改善するトピックが詰まっています。なので「エクセルはちょっと苦手だな」とか「業務でエクセルを使うけれども、それほど高度な知識は必要ないよ」という人にもおすすめです。
新品価格 |
コメント
【AI作文】抽選プログラムを作成の思考過程
抽選プログラムはランダムな選択を行う必要があるため、乱数生成のアルゴリズムが重要です。以下に、考えられるステップを示します。
1.プログラムの目的を明確にする:
・抽選対象のアイテムが何か?
・抽選する人数は何人か?
・重複選択を許可するかどうか?
2.ユーザー入力を受け入れる:
・ユーザーからアイテムのリストを受け入れるための入力ボックスを表示するか、特定のセルからデータを読み込むことが考えられます。
3.乱数生成アルゴリズムを選択:
・VBAでは、Rnd関数を使用して乱数を生成することができます。ただし、初期シード値を設定することが重要です。初期シード値が同じ場合、同じ乱数列が生成されるため、通常は時間を使用してシードを設定します。
4.抽選プロセスを実装:
・乱数を生成して、それをアイテムのリストのインデックスとして使用します。乱数の範囲をアイテムの数に合わせることを忘れないようにしましょう。
5.重複チェック:
・重複選択を許可しない場合、選択済みのアイテムをトラッキングして、同じアイテムが再度選ばれないようにします。これは配列やコレクションを使用して行うことができます。
6.選択結果を表示:
・選ばれたアイテムをユーザーに表示する方法を決定します。メッセージボックスやワークシートに出力するなどの方法が考えられます。
7.エラーハンドリング:
・ユーザーの誤った入力やプログラムのエラーに対処するためのエラーハンドリングコードを追加します。
8.プログラムのテスト:
・ランダムなアイテムが正しく選択されることを確認するために、プログラムをテストしましょう。特に重複選択の場合、選択結果が予想通りかどうかを確認します。
9.ドキュメンテーション:
・コードにコメントを追加し、他の人が理解しやすくするためにプログラムのドキュメンテーションを行います。
以上のステップを考慮して、VBAを使用して抽選プログラムを作成できるはずです。必要に応じて詳細なコード例を提供できます。