見出し画像

VBA抽選ツール「ロッカーの位置を決める君」の開発③

 40人分の苗字一覧の中から1人の苗字を抜き出してC9セルに表示するところまではできました。次は、こうして抽選で選ばれた人を順番に1番ロッカー、2番ロッカーとロッカーを割り当てていきます。


当選した人を順番にロッカーを割り当てる

 Excelの「抽選」シートのK列とL列にロッカー番号とそのロッカーを使う人の名前を入れるように表を作ります。この表に1番から順番に当選した人の苗字を入力するようにしていきたいですね。

当選した人の名前を順番に入れていく

 これは全開の記事で書いた通り、rd = WorksheetFunction.RandBetween(1, ninzu)で選んだ数字の右隣のセルにある苗字を取り出してnameという変数に入れているので、これをL6セルにも入れればいいだけなのでさほど難しくありません。C9セルに当選者を表示するのと同じ要領で
と付け加えればOKです。 

2番ロッカーの人を決める

 では、次に2番ロッカーの人を決めていきましょう。「なんだ、簡単簡単。また同じく40人の中から一人を選べばいいよね~」というわけにはいきませんよね。なぜなら確率的には少ないとしても、すでに1番ロッカーに決まった藤井さんがまた選ばれてしまう可能性があるからです。ですので、2番ロッカーの人を選ぶときには1番ロッカーに決まった人を除いて、39人の中から一人を選ぶようにしなくてはなりません。
 ということで、前回までに作ったプログラムにコードを追加していきます。まず、追加するのは1~40までの数字の中から選ばれた数字とその隣の名前をを書いたセルを削除して上に詰めるというコードです。
rd = WorksheetFunction.RandBetween(1, ninzu)で1~40までの数字からランダムに一つ選び、B12~B51の範囲の中からその数字が入っているセルを見つけ出して、その隣のセルに入っている苗字を表示させていたので、その2つのセルを削除して上に詰めます。その後、B列の数字を1から振りなおせばよいのでコードは以下のようになります。

Sub 当選者決め()
Dim ws As Worksheet
Dim lastRow As Long, rd As Long, ninzu As Long
Dim mydata As String

Set ws = ThisWorkbook.Worksheets("抽選")
    '名前一覧に掲載されている名前の個数(=人数)を数える
    lastRow = ws.Cells(12, 3).End(xlDown).Row
    ninzu = lastRow - 11

    '1から人数までのランダム整数をrdに入れる
'    rd = FRANDBETWEEN(ninzu)
    rd = WorksheetFunction.RandBetween(1, ninzu)
    
Dim searchRange As Range, cell As Range
Dim name As String, Add As String
Set searchRange = ws.Range(Cells(12, 2), Cells(lastRow, 2))
    For Each cell In searchRange
        If cell.Value = rd Then
            name = cell.Offset(0, 1).Value
            Add = cell.Address
            Debug.Print Add
        End If
    Next cell

    '抽選結果を書き込む
    ws.Range("C9").Value = name
    ws.Range("L6").Value = name
        
    Dim targetRange As Range, lastrowB As Long, i As Long
    Set targetRange = ws.Range(Add, ws.Range(Add).Offset(0, 1))
    targetRange.Delete Shift:=xlUp
  
    lastrowB = ws.Cells(ws.Rows.count, "B").End(xlUp).Row
    For i = 12 To lastrowB
        ws.Cells(i, "B").Value = i - 11
    Next i
    
End Sub

2番ロッカーの人の名前をL列に入力

 2番目の人を39人の中から選べるようになりましたので、次は選んだ人の苗字をL列に入力したいですが、今のままだとL6セルにしか入りません。なのでここも行番号を変数を使って空のセルに入力するようにしていきます。
Cells(Rows.count, 12).End(xlUp).rowでL列の最終セルの行番号を取得して、その一つ下のセルに入力するようにして完成したのが以下のコードです。

Sub 当選者決め()
Dim ws As Worksheet
Dim lastRow As Long, rd As Long, ninzu As Long
Dim mydata As String

Set ws = ThisWorkbook.Worksheets("抽選")
    '名前一覧に掲載されている名前の個数(=人数)を数える
    lastRow = ws.Cells(12, 3).End(xlDown).row
    ninzu = lastRow - 11

    '1から人数までのランダム整数をrdに入れる
'    rd = FRANDBETWEEN(ninzu)
    rd = WorksheetFunction.RandBetween(1, ninzu)
    
Dim searchRange As Range, cell As Range
Dim name As String, Add As String
Set searchRange = ws.Range(Cells(12, 2), Cells(lastRow, 2))
    For Each cell In searchRange
        If cell.Value = rd Then
            name = cell.Offset(0, 1).Value
            Add = cell.Address
            Debug.Print Add
        End If
    Next cell

    ws.Range("C9").Value = name
    
    Dim row As Long
    row = ws.Cells(Rows.count, 12).End(xlUp).row
    ws.Cells(row + 1, 12).Value = name
        
    Dim targetRange As Range, lastrowB As Long, i As Long
    Set targetRange = ws.Range(Add, ws.Range(Add).Offset(0, 1))
    targetRange.Delete Shift:=xlUp
  
    lastrowB = ws.Cells(ws.Rows.count, "B").End(xlUp).row
    For i = 12 To lastrowB
        ws.Cells(i, "B").Value = i - 11
    Next i
    
End Sub

このコードを40回実行すれば、40人すべての人がどのロッカーを使うかを決めることができますね。

やったー!

 次回以降で細かい修正をしていきましょう。

いいなと思ったら応援しよう!