ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 490|回复: 12

[求助] 考场抽签,随机排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-12 19:34 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不同颜色的考场在不同的教学楼,只能在同颜色里随机排序。
下面是参考代码。求助高手给修改一下。
Sub test()
    r = Application.CountA(Range("a:a"))
    r1 = [a65536].End(3).Row
    Range("c:c").ClearContents
    Set d = CreateObject("Scripting.Dictionary") '字典
    For i = 1 To 100
        s = Int(Rnd * r + 1)
        d(s) = ""
        If d.Count = r Then Exit For
    Next i
    k = d.keys
    For j = 1 To r1
        If Cells(j, 1) <> "" Then
        n = n + 1
        x = k(n - 1)
        Cells(j, 3) = k(n - 1)
        End If
    Next j
    ThisWorkbook.Save
End Sub


抽签.rar

11.49 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2024-6-12 20:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.jpg

抽签.rar

18.38 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-12 21:10 | 显示全部楼层
或者用下面这段代码,从论坛里复制来的,忘了是哪位朋友的了。
Sub main()
Dim Ar, I&, Br(), K&
    Ar = Range("a1:a" & Cells(Rows.Count, 1).End(3).Row).Value
    For I = 1 To UBound(Ar)
        If Ar(I, 1) <> "" Then
            K = K + 1
            ReDim Preserve Br(1 To K)
            Br(K) = Ar(I, 1)
        End If
    Next I
   
    Call GetRnd(Br, 1, K, K)
    K = 0
    For I = 1 To UBound(Ar)
         If Ar(I, 1) <> "" Then
            K = K + 1
            Ar(I, 1) = Br(K)
        End If
    Next I
    Range("b1").Resize(UBound(Ar), 1) = Ar
End Sub
Sub GetRnd(Brr, a, b, N&) '香川
Dim L&, I&, R&, T
    Randomize
    L = LBound(Brr)
    For I = L To N + L - 1 '一維数組洗牌
     R = Int(Rnd() * (b - a + 1 - (I - L))) + a + (I - L)
        T = Brr(R): Brr(R) = Brr(a + (I - L)): Brr(I) = T '一維
  Next
End Sub

TA的精华主题

TA的得分主题

发表于 2024-6-12 21:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Option Explicit
Sub test2()
    Dim ar, br(), i&, j&, r&
   
    Application.ScreenUpdating = False
   
    With [A1].CurrentRegion
        ar = .Value
        For j = 1 To UBound(ar, 2) Step 3
            Erase br: r = 0
            For i = 3 To UBound(ar)
                If Len(ar(i, j)) Then
                    r = r + 1
                    ReDim Preserve br(1 To r)
                    br(r) = ar(i, j)
                End If
            Next i
            arrGetRnd1 br
            For i = 1 To UBound(br)
                ar(i + 2, j + 1) = br(i)
            Next i
        Next j
        .Value = ar
    End With
   
    Application.ScreenUpdating = True
    Beep
End Sub
Function arrGetRnd1(ByRef ar)
    Dim xNum&, i&, n&, vTemp
    Randomize
    n = UBound(ar)
    For i = 1 To UBound(ar)
        xNum = Int((n - i + 1) * Rnd() + i)
        vTemp = ar(xNum): ar(xNum) = ar(i): ar(i) = vTemp
    Next
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-12 21:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请参考。。。

抽签.rar

19.56 KB, 下载次数: 18

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-12 21:20 | 显示全部楼层
下面代码是从论坛的网友复制来的,可以参考
Sub main()
Dim Ar, I&, Br(), K&
    Ar = Range("a1:a" & Cells(Rows.Count, 1).End(3).Row).Value
    For I = 1 To UBound(Ar)
        If Ar(I, 1) <> "" Then
            K = K + 1
            ReDim Preserve Br(1 To K)
            Br(K) = Ar(I, 1)
        End If
    Next I
   
    Call GetRnd(Br, 1, K, K)
    K = 0
    For I = 1 To UBound(Ar)
         If Ar(I, 1) <> "" Then
            K = K + 1
            Ar(I, 1) = Br(K)
        End If
    Next I
    Range("b1").Resize(UBound(Ar), 1) = Ar
End Sub
Sub GetRnd(Brr, a, b, N&) '香川
Dim L&, I&, R&, T
    Randomize
    L = LBound(Brr)
    For I = L To N + L - 1 '一維数組洗牌
     R = Int(Rnd() * (b - a + 1 - (I - L))) + a + (I - L)
        T = Brr(R): Brr(R) = Brr(a + (I - L)): Brr(I) = T '一維
  Next
End Sub

TA的精华主题

TA的得分主题

发表于 2024-6-13 15:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-13 15:20 | 显示全部楼层
JS代码
  1. function 考场抽签(){
  2.         ["a3","d3","g3"].forEach(rg=>{
  3.                 let res=[], arr=Range(Range(rg),Range(rg).End(xlDown)).Value2;
  4.                 while(arr.length!=0) res.push(arr.splice(Math.floor(Math.random()*arr.length),1)[0]);
  5.                 Range(rg).Offset(0,1).Resize(res.length,res[0].length).Value2=res;
  6.         });
  7. }
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-13 15:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
附件,WPS测试有效

抽签.zip

17.97 KB, 下载次数: 5

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-13 21:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
LIUZHU 发表于 2024-6-13 15:21
附件,WPS测试有效

感谢。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 13:35 , Processed in 0.046399 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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