从Excel的两列中各随机抽出一半,组成新的一列

Excel学习世界 2024-11-07 20:38:37

关于随机抽奖问题,比较麻烦的在于去重,即每个人只能抽到一次。

来看今天的案例。

案例:

从下图 1 中的男和女中各抽出 7 个不重复的人,组成一个新的组,放置在 D 列中。

效果如下图 2 所示。

解决方案:

1. 将光标放置到工作表名称处 --> 右键单击 --> 在弹出的菜单中选择“查看代码”

2. 在 VBE 中输入以下代码:

Sub Macro1_FillDColumn()

Dim i As Integer, j As Integer

Dim randomIndexA As Integer, randomIndexB As Integer

Dim usedIndexesA() As Integer, usedIndexesB() As Integer

Dim countA As Integer, countB As Integer

Dim allValuesA() As Variant, allValuesB() As Variant

' 初始化变量

countA = 0

countB = 0

ReDim usedIndexesA(1 To 7)

ReDim usedIndexesB(1 To 7)

ReDim allValuesA(2 To 15)

ReDim allValuesB(2 To 15)

j = 2 ' 起始输出到D2

' 收集A列的所有值

For i = 2 To 15

allValuesA(i) = Cells(i, 1).Value

Next i

' 收集B列的所有值

For i = 2 To 15

allValuesB(i) = Cells(i, 2).Value

Next i

' 随机选择A列的7个不重复数据

For i = 1 To 7

Do

randomIndexA = Int((15 - 2 + 1) * Rnd + 2) ' A2:A15

If Not IsInArray(randomIndexA, usedIndexesA) Then

countA = countA + 1

usedIndexesA(countA) = randomIndexA

Cells(j, 4).Value = allValuesA(randomIndexA) '将结果输出到D列

j = j + 1

Exit Do

End If

Loop

Next i

' 随机选择B列的7个不重复数据

For i = 1 To 7

Do

randomIndexB = Int((15 - 2 + 1) * Rnd + 2) ' B2:B15

If Not IsInArray(randomIndexB, usedIndexesB) Then

countB = countB + 1

usedIndexesB(countB) = randomIndexB

Cells(j, 4).Value = allValuesB(randomIndexB) '将结果输出到D列

j = j + 1

Exit Do

End If

Loop

Next i

End Sub

Function IsInArray(valToBeFound As Integer, arr As Variant) As Boolean

Dim element As Variant

'判断随机数是否重复

On Error GoTo ErrorHandler

IsInArray = False

For Each element In arr

If element = valToBeFound Then

IsInArray = True

Exit Function

End If

Next element

ErrorHandler:

Exit Function

End Function

Sub ClearDColumns()

Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("Sheet1")

' 清空D列

ws.Range("D2:D" & ws.Cells(ws.Rows.Count, "D").End(xlUp).Row).ClearContents

End Sub

3. 关闭 VBE --> 在 Excel 工具栏中选择“开发工具”-->“插入”-->“按钮(窗体控件)”

4. 在弹出的对话框中选择 ...FillDColumn 这个宏 --> 点击“确定”

5. 将控件的默认文本修改为“分组”。

6. 选中控件 --> 右键单击 --> 在弹出的菜单中选择“复制”

7. 将复制出来的控件文本修改为“清空”。

8. 选中“清空”按钮 --> 右键单击 --> 在弹出的菜单中选择“指定宏”

9. 在弹出的对话框中选择 ...ClearDColumns 宏 --> 点击“确定”。

为了确保分组结果没有重复,再设置一下高亮显示重复值。

10. 选中 D 列 --> 选择工具栏的“开始”-->“条件格式”-->“突出显示单元格规则”-->“重复值”

11. 点击“确定”。

设置完成了。点击“分组”按钮,按要求自动分组,点击“清空”则清空分组结果。

12. 将文件保存为 .xlsm 格式。

0 阅读:1

Excel学习世界

简介:Excel 学习交流