Microsoft 365 じゃないと数式では面倒なので、本来のVBAにします。
1.「作業」と言う名前のシートを一枚挿入してください。
2.基本データが入っているシートを「抽選」と言うシート名に変えてください。
3.抽選シートは下図の様にデータをセットしてください。
<抽選 シート 初期状態>
行 ___A___ ____B____ _C_ ____D____ _E_ _F_ _G_ _H_ _I_
1 氏名 グループ グループ A B C ・ ・
2 Name01 A 当選者数 5 2 3 ・ ・
3 Name02 A
: :
4.後記VBA(lottery)を実行する
<抽選 シート 実行後の結果例>
行 ___A___ ____B____ _C_ ____D____ ___E___ ___F___ ___G___ _H_ _I_
1 氏名 グループ グループ A B C ・ ・
2 Name01 A 当選者数 5 2 3 ・ ・
3 Name02 A Name07 Name08 Name14
4 Name03 A Name03 Name11 Name16
5 Name04 A Name01 Name15
6 Name05 A Name02
7 Name06 A Name04
8 Name07 A
5.標準モジュールに貼り付けるVBA
Sub lottery()
Dim ws抽選 As Worksheet
Dim ws作業 As Worksheet
Dim lastRW As Long, gTopRW
Dim Grp As Range
Dim rToSearch As Range
Set ws抽選 = Worksheets("抽選")
Set ws作業 = Worksheets("作業")
ws作業.Range("A1") = "Dummy"
ws作業.UsedRange.ClearContents
With ws抽選
Intersect(.UsedRange.Offset(1), .Columns("A:C")).Copy ws作業.Range("A1")
End With
With ws作業
lastRW = .Cells(Rows.Count, "A").End(xlUp).Row
With .Range("C1:C" & lastRW)
.FormulaLocal = "=RAND()"
.Value = .Value
End With
.Range("D1").FormulaArray = "=IF(OR(COUNTIF(C1:C1500,C1:C1500)>1),""有"",""無"")"
If .Range("D1") = "有" Then
MsgBox "乱数に重複があります。再試行してください"
Exit Sub
End If
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("B1"), Order:=xlAscending
.Sort.SortFields.Add Key:=.Range("C1"), Order:=xlAscending
.Sort.SetRange .Range("A1:C" & lastRW)
.Sort.Header = xlNo
.Sort.Apply
ws抽選.Range("E3").Resize(lastRW, 100).ClearContents
Set rToSearch = .Range("B1:B" & lastRW)
For Each Grp In ws抽選.Range("E1", ws抽選.Cells(1, 100).End(xlToLeft))
gTopRW = Application.Match(Grp, rToSearch, 0)
If IsNumeric(gTopRW) Then
With Grp
ws作業.Cells(gTopRW, "A").Resize(.Offset(1)).Copy Grp.Offset(2)
End With
End If
Next Grp
End With
End Sub