ExcelVBAで乱数を使って抽選マクロを作成

この記事を読むのに必要な時間は約 15 分です。

 

Twitterで抽選を行っているのを見かけたので、Excel VBAで抽選マクロを作ってみました。

 

ソースコードを貼り付けて、枠とボタン1つ用意すれば動くようにしています。

 

VBAを勉強する方は、改造してみたら参考になるかもしれません。

 

ガチな人からはダメだしをくらいそうですがご容赦を・・・。

スポンサーリンク

Excel VBAの抽選マクロを作ってみた

今回作ったマクロはこんな感じです。

  • ボタンをクリックすると、下に貼り付けた応募者一覧からランダムで1名を抽出
  • 貼り付けていなかったらエラー
  • 間が抜けていてもエラー

 

Excel VBAで乱数を使って抽選マクロ作成

 

一覧の名簿には、ウィキペディアから西武ライオンズの方々のお名前を記載させていただいています。

引用元:ウィキペディア 埼玉西武ライオンズの選手一覧

 

抽選マクロの作り方

マクロのExcelファイルをそのまま公開すれば楽なんですが、ファイルに個人情報が入っちゃったりします。

 

それに、マクロの中身が分からない状態でダウンロードするのも不安かと思いますので、ソースコードなど出来るだけコピペで作って実行できるように解説したいと思います。

当選者と抽選対象者の枠を用意

まずは枠を用意します。
図と同じ位置に貼り付けてください。

 

当選者のところ:B4セルから貼り付け

No お名前 コメント
★当選者★

 

抽選対象者のところ:C9セルから貼り付け

No お名前(敬称略) コメント

 

Excel VBAで乱数を使って抽選マクロ作成

 

抽選ボタンを作る

「開発」タブから、「挿入」、コマンドボタン(ActiveX コントロール)をクリックして、ボタンを入れます。

 

「開発」タブが表示されていないときは、こちらの記事の最初のほうを参考にしてみてください。

 

 

Excel VBAで乱数を使って抽選マクロ作成

 

ボタンが入りました。

Excel VBAで乱数を使って抽選マクロ作成

 

「CommandButton1」って何だよ?と思う方もいらっしゃるかも。
やっぱりボタン名は変更しておきたいですよね。

 

デザインモードの状態で、ボタンを右クリックしてプロパティを開きます。

Excel VBAで乱数を使って抽選マクロ作成

 

プロパティにはいろいろと項目がありますが、変更するのはとりあえず次の2つで大丈夫です。

 

「(オブジェクト名)」:ソースコード内で使うボタン名です。
今回は一応変更していますが、ぶっちゃけボタン1つだけなら変えなくても困りませんw

 

Excel VBAで乱数を使って抽選マクロ作成

 

Captionを変更した通りに、画面の表示も変更されました。

Excel VBAで乱数を使って抽選マクロ作成

 

ソースコードを作成

今度はボタンをクリックしたときの動作について、ソースコードを書いていきます。

Excel VBAで乱数を使って抽選マクロ作成

 

「SelectButton1」というボタンをクリックしたときの動作が、次のように書かれています。

Private Sub SelectButton1_Click()
    
End Sub

 

ボタンをクリックしたら何して欲しいのか、この中に書けば抽選出来るわけです。

 

が、ちょっといったん置いておきます。

Excel VBAで乱数を使って抽選マクロ作成

 

「Microsoft Excel Objects」を右クリックして、「挿入」から「標準モジュール」を選択します。

 

「Module1」が出来ます。

Excel VBAで乱数を使って抽選マクロ作成

 

「Module1」を右クリックして、中にソースコードを書きます。

 

もしも書き方が分からない場合は、ソースコードをコピペしちゃってください。

 

特定の範囲内で乱数を取得する

一応、ポイントになりそうなところだけ説明しておきます。

 

応募者の人数によって、生成する乱数の範囲を絞ります。
人数が1桁ならlNumLenは10、2桁なら100、3桁なら1000をセットするのがここです。

'"1"の後、リストの人数の桁数分、"0"を繰り返す 
lNumLen = CLng("1" & String(Len(sLastRowtmp), "0"))

 

乱数を生成する関数は、「Rnd()」なのですが、出来るのは0以上1未満の値です。

 

先ほどのlNumLenを「Rnd()」に掛けることで、欲しい桁数の数字は整数部分。
Int関数で整数部だけ取り出します。

 

あとは、Do Loopで応募者の人数以下になるまでループします。

Do    
      '1未満の乱数Rnd()にlNumLenを掛けて、整数部だけ取り出す
      lSelectNo = Int(Rnd() * lNumLen)
    
      'リストの数以内の値になるまでループ
Loop While lLastRow - 10 < lSelectNo

 

Module1:

Option Explicit

Public sMsgString As String

'抽選のメイン関数
Public Sub selectPersonMain()

    Dim lSelectNo As Long
    
    Call checkPersonList
    
    If checkPersonList = True Then
        Call getSelectNo(lSelectNo)

        Call setSelectPerson(lSelectNo)
        
        sMsgString = "抽選結果が出ました!!"
        
    End If
    
    MsgBox sMsgString
    
End Sub


'引数 lSelectNo Long 参照渡し 当選した人の行数
'リストの数の中で、生成した乱数に一致する行数を取得
Private Sub getSelectNo(ByRef lSelectNo As Long)
    Dim lMax As Long
    Dim lMin As Long
    
    '一覧の最終行を乱数の最大値にセット
    lMax = Cells(Rows.Count, 4).End(xlUp).Row
    
    '乱数の最小値
    lMin = 10
    
    '乱数初期化
    Randomize

    '最小値から最大値の範囲で乱数を生成
    lSelectNo = Int((lMax - lMin + 1) * Rnd + lMin)
            
End Sub


'引数 lSelectNo Long 値渡し 当選した人の行数
'当選した人の情報を当選者欄にセット
Private Sub setSelectPerson(ByVal lSelectNo As Long)
    
    'Noをセット
    Cells(5, 3).Value = Cells(lSelectNo, 3).Value

    'お名前をセット
    Cells(5, 4).Value = Cells(lSelectNo, 4).Value & " 様"
    
    'コメントをセット
    Cells(5, 5).Value = Cells(lSelectNo, 5).Value

End Sub


'一覧未入力、途中抜けの場合のエラーチェック
Private Function checkPersonList() As Boolean
    checkPersonList = True

    Dim lLastRowName As Long
    Dim lTopRowName As Long
    lLastRowName = Cells(Rows.Count, 4).End(xlUp).Row
    lTopRowName = Cells(9, 4).End(xlDown).Row

    '10行目以降に1件も入力されていない場合エラー
    If lLastRowName < 10 Then
        sMsgString = "抽選対象のリストが入力されていません"
        checkPersonList = False
    
    '10行目から最終行の間に、名前が書かれていない行があればエラー
    ElseIf lLastRowName <> lTopRowName Then
        sMsgString = "抽選対象のリストには、間を開けずに入力してください" & vbCrLf & lTopRowName + 1 & "行目が空欄です"
        checkPersonList = False
        
    End If

End Function

 

Excel VBAで乱数を使って抽選マクロ作成

 

Module1の中に書いた「selectPersonMain」が本体です。

 

あとは、「SelectButton1_Click()」から「selectPersonMain」を呼び出すだけ。

 

Private Sub SelectButton1_Click()
    Call selectPersonMain
End Sub

Excel VBAで乱数を使って抽選マクロ作成

 

「SelectButton1_Click()」の「_」より手前の部分は、プロパティの(オブジェクト名)と一致させてくださいね。

 

これでボタンをクリックしたら動くはずです。

テスト

正常なヤツ

ちょっと抽選ボタンを押して、動作を確認してみます。

Excel VBAで乱数を使って抽選マクロ作成

 

ちゃんと動いたっぽいので、今度は何回もやってみます。
毎回同じ人が当選していたらダメですから。

 

そしたら、ちゃんと毎回違う人が当選者となりました。

 

これで抽選する動作は大丈夫です。

Excel VBAで乱数を使って抽選マクロ作成

 

エラーになるヤツ

エラーチェックの動作も確認します。

 

途中の名前が空欄の場合、エラーメッセージを表示します。

 

複数行未入力でも、「〇〇行目が空欄です」の〇〇は一番上の行だけ。
楽してすみません・・・。

 

全部出していたら、何百行も未入力だと、エラーメッセージがスゴイことになっちゃいますからね。

Excel VBAで乱数を使って抽選マクロ作成

 

未入力時のエラーチェックです。

 

一覧が未入力の場合でも、エラーだと判定してくれました。

Excel VBAで乱数を使って抽選マクロ作成

 

実は、名前の列で未入力かどうか判定しています。
名前の列以外が入力済みでもエラーになります。

 

名前だけ入力していないとか、おそらく無いと思うのでたぶん大丈夫。

 

抽選対象者の一覧を貼り付けてボタンを押すだけのシンプルなマクロだし、複雑なチェックも必要ないでしょう。

スポンサーリンク

まとめ:Excel VBAで抽選マクロ作成

Excel VBAで抽選のマクロを作ってみました。

 

応募者の一覧を貼り付けて抽選する場合には使えると思います。
VBAを勉強するネタとしてならもっと使えるかもしれません。

 

Twitterでよくやっている、「リプくれた方の中から抽選で1名にプレゼント」のような場合だと、一覧を作るだけで消耗しそうです(笑)

 

KUMAPさんがやっていた、応募日時をランダムで取得するやり方がシンプルですぐ出来ていいやり方だと思います。

 

リプくれたアカウント一覧って、API使って上手いこと一覧を作れるんですかね。
また時間があったらやってみます。