吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3502|回复: 16
收起左侧

[其他转载] 【VBA】excel随机抽选三名女朋友

[复制链接]
人二 发表于 2021-9-2 17:08

制作原因

最近女朋友太多,想随机抽选几个女朋友约会,遂制作该表格。

功能

1. 不重复滚动随机抽选三名女朋友
2. 检测来不了的女朋友,再次抽选填充该位置

未完成功能

1. 将抽选的女朋友,生成审批单报老板审阅。
2. 记录抽选记录

界面如下图

hrI9q1.png

vba代码


Sub delay(T As Single)   '这个是定义延时命令的
    Dim time1 As Single
    time1 = Timer
    Do
        DoEvents
    Loop While Timer - time1 < T
End Sub

Sub 清除名单()
    Range("A4:G65536").ClearContents
End Sub

Sub 开始() '开始抽选  代码从这里开始
    If Sheet1.Buttons(Application.Caller).Caption = "停止抽选" Then  '判断当前点击按钮上的文字     如果为"停止抽选" 则修改为"开始抽选"
        Sheet1.Buttons(Application.Caller).Caption = "开始抽选"

    ElseIf Sheet1.Buttons(Application.Caller).Caption = "开始抽选" Then '判断当前点击按钮上的文字     如果为"开始抽选" 则修改为"停止抽选"  并开始运行抽选代码
        Sheet1.Buttons(Application.Caller).Caption = "停止抽选"
        Call 开始抽选

    End If

End Sub

Sub 开始抽选()
    Sheet2.Range("T:BZ").ClearContents '清除P到BA列内容 防止出错
    'Sheet2.Columns("AA").Resize(, 10).Delete '删除AA列往后的10列
    hang = Sheet2.Range("B65536").End(xlUp).Row '取B列最后一行的行号
    'lie = Sheet2.Cells(2, Columns.count).End(xlToLeft).Column '取第二行最后一列单元格的列号
    helpRow = 1   '辅助列的起始行号

    For dataRow = 3 To hang  '从第三行到最后一行开始循环
        flag = 0   '符合条件的个数重置为0
        selectCon = condition()
        If InStr(1, Sheet2.Cells(dataRow, "F"), selectCon) > 0 Or Sheet2.Cells(dataRow, "F") = "" Then '判断F列每一个单元格是否符合条件   如果符合条件  那么符合条件个数也就是jishu+1
                flag = flag + 1
        End If
        If flag > 0 Then     '如果大于0也就是说至少有一个条件符合了   那么把这一行复制到辅助列  AA列处
            helpRow = helpRow + 1     ' 辅助列行数+1
            Sheet2.Range("A" & dataRow & ":G" & dataRow).Copy Sheet2.Cells(helpRow, "AA")
            Sheet2.Cells(helpRow, "AH") = dataRow

        End If
    Next

    break = 1 '重复循环跳出标志

    '判空操作
    If IsEmpty(Sheet1.Range("A4").Value) Then
            sdatarow = 4
        ElseIf IsEmpty(Sheet1.Range("A5").Value) Then
            sdatarow = 5
        ElseIf IsEmpty(Sheet1.Range("A6").Value) Then
            sdatarow = 6
        Else
            Sheet1.[按钮 1].Caption = "开始抽选"
            Sheet1.[按钮 1].Enabled = False
            MsgBox prompt:="抽选名单已满三人!", Buttons:=vbOKOnly + vbInformation, Title:="提示"
            Exit Sub
    End If

    Do

        If Sheet1.Buttons(Application.Caller).Caption = "开始抽选" Then Exit Do  '循环随机打乱   并判断按钮状态   如果按钮文字为开始抽选则停止循环  开始提取结果
AAA:
        delay (0.01)
        randomNum = Application.RandBetween(2, helpRow)
        hang = Sheet2.Cells(randomNum, "AH") '将命中的行号赋给行

        If break = 20 Then '跳出判断
                Sheet1.[按钮 1].Caption = "开始抽选"
                Sheet1.[按钮 1].Enabled = False
                MsgBox prompt:="没有更多可满足条件的专家抽选了", Buttons:=vbExclamation, Title:="提示"
            Exit Do
        End If

        If sdatarow = 4 Then
            If Sheet2.Cells(hang, "B") = Cells(sdatarow + 1, "B") Or Sheet2.Cells(hang, "B") = Cells(sdatarow + 2, "B") Then  '判断重复
                break = break + 1
                GoTo AAA '判断重复,若重复再次筛选
             End If
        ElseIf sdatarow = 5 Then
            If Sheet2.Cells(hang, "B") = Cells(sdatarow - 1, "B") Or Sheet2.Cells(hang, "B") = Cells(sdatarow + 1, "B") Then '判断重复
                break = break + 1
                GoTo AAA '判断重复,若重复再次筛选
            End If
        ElseIf sdatarow = 6 Then
            If Sheet2.Cells(hang, "B") = Cells(sdatarow - 1, "B") Or Sheet2.Cells(hang, "B") = Cells(sdatarow - 2, "B") Then '判断重复
                break = break + 1
                GoTo AAA '判断重复,若重复再次筛选
            End If
        End If

        delay (0.1)   '延迟时间 也就是滚动速度   单位为秒  数字越小  滚动越快
            Sheet1.Range("A" & sdatarow & ":G" & sdatarow).Interior.Color = 10079487
            Sheet2.Range("A" & hang & ":G" & hang).Copy Sheet1.Range("A" & sdatarow)
    Loop

        sdatarow = sdatarow + 1
        Sheet2.Columns("AA").Resize(, 10).Delete  '删除辅助列
End Sub

Sub AddWorksheet()
    Dim flag As Boolean
    '新建sheet表
    For Each Sheet In Sheets
        If Sheet.Name = Date & "抽选结果" Then
            flag = True
            Exit For
        End If
    Next
    If flag = False Then
        Sheets.Add After:=Sheets(Sheets.count)
        ActiveSheet.Name = Date & "抽选结果"
    End If:
    '格式保存
    Sheets("专家库").Range("J5:P10").Copy
    With Sheets(Date & "抽选结果").Range("A1")
        .PasteSpecial xlPasteColumnWidths
        .PasteSpecial xlPasteAll
    End With
      'Sheets(Date & "抽选结果").Range("A1").PasteSpecial Paste:=xlPasteFormats
      Sheets(Date & "抽选结果").Cells(1, "A") = Date & "获选名单"
      ThisWorkbook.Save
End Sub
Function condition()
    Dim count As Integer
    Set lst = Sheet1.[下拉框 5]
    cValue = lst.List(lst.Value)
    condition = cValue
End Function

excel下载地址

https://wwa.lanzoui.com/i2R6lti6a2f


感谢@小小涩郎

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
60235300 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 人二 发表于 2021-9-2 17:33
SmileHmily 发表于 2021-9-2 17:31
我觉得明明是用几个函数就能解决的,突然被你弄的很复杂……

主要是老板不会
hack528 发表于 2021-9-2 17:11
 楼主| 人二 发表于 2021-9-2 17:14
小小涩郎 发表于 2021-9-2 17:16
被召唤来了        来冒个泡   
夕魚 发表于 2021-9-2 17:29
東西學到了  請問女朋友去哪領
SmileHmily 发表于 2021-9-2 17:31
我觉得明明是用几个函数就能解决的,突然被你弄的很复杂……
piwei 发表于 2021-9-2 17:57
真他娘的是个天才
mercio 发表于 2021-9-2 18:39
到底是施工管理还是抽女朋友。。。
Wapj_Wolf 发表于 2021-9-2 18:45
说好的女朋友呢?谢谢楼主分享,学习了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 13:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表