ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求一个从100名员工中,按性别随机抽取30名男生,20名女生的VBA代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-6-2 15:02 | 显示全部楼层
Sub test()
    Dim i As Integer, j As Integer, x As Integer, n As Integer, d, 男生(1 To 10000), 女生(1 To 10000)
    i = 1
    Do Until i = 102
        If Cells(i, 3) = "男" Then
            x = x + 1
            男生(x) = Cells(i, 2)
        ElseIf Cells(i, 3) = "女" Then
            j = j + 1
            女生(j) = Cells(i, 2)
        End If
        i = i + 1
    Loop
    Set d = CreateObject("Scripting.Dictionary")
    i = 1
    Do Until i = 31
        n = Int(Rnd() * (x)) + 1
        If d.exists(男生(n)) = False Then
            Cells(i + 1, 4) = 男生(n)
            d(男生(n)) = ""
            i = i + 1
        End If
    Loop
    i = 1
    Do Until i = 21
        n = Int(Rnd() * (j)) + 1
        If d.exists(女生(n)) = False Then
            Cells(i + 1, 5) = 女生(n)
            d(女生(n)) = ""
            i = i + 1
        End If
    Loop
End Sub

TA的精华主题

TA的得分主题

发表于 2018-6-2 20:21 | 显示全部楼层
Zamyi 发表于 2018-6-2 09:54
脸厚不会红。
1、        ar(i, 1) = t纯属蛇足;
2、        当男或女一个取完后,也许在做无用功;

呵呵,这是香川的风格,你这么说,作为EH中众多香粉之一,表示不服!

你所列的1、2、3、4理由不成立
1、不是蛇足,是必须的,否则不能保证随机性
2、这种“无用功”是必须的,没有人能写出不做这种“无用功”的代码
3、逐个操作单元格,是因为数据量小,如果数据量大的话,自然会用数组来处理,这没什么可说的
4、这是少数我能一眼看明白的、香川写的代码思路的代码,就因为简单

我能想到的思路,与小刀的一样,计算复杂性最小是:总数+男数+女数,最大是:2×总数;而香川这个代码的最小是:男数+女数,最大是:总数。你的代码思路也算别出心裁,但计算复杂性是:总数+总数×ln(总数),当数据量大时,速度无法和香川的比。

TA的精华主题

TA的得分主题

发表于 2018-6-7 13:39 | 显示全部楼层
香川群子 发表于 2018-6-1 13:41
我也凑热闹来一个。

我出手必是精品。

这样可以吗?美女姐姐。
0.PNG

TA的精华主题

TA的得分主题

发表于 2018-6-7 13:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-6-7 14:26 | 显示全部楼层
lby0712 发表于 2018-6-7 13:39
这样可以吗?美女姐姐。

一直搞这个组合没多少实际意思的。论坛还有很多问题都没人能回答上来。

香川基本只在弄她的组合排列,已经变成孔乙己研究“回”字有几种写法了。

组合可用的场景很多?能解决实际问题就行了。就算真正的程序员也没几个人能去搞算法,

用VBA的,多学点知识就好,因为你也不靠这个吃饭。真想学算法,也不是在这里,这里多数人

都是来求助的,稍微懂点皮毛的人随便从其他书或网站弄点稍微复杂点的内容,在这里都大神了。

讲算法的书很多,要学习也应该去系统学习,能多看些数学书更好。

TA的精华主题

TA的得分主题

发表于 2018-6-7 14:37 | 显示全部楼层
ivccav 发表于 2018-6-7 14:26
一直搞这个组合没多少实际意思的。论坛还有很多问题都没人能回答上来。

香川基本只在弄她的组合排列, ...

举一反三,呵呵。

TA的精华主题

TA的得分主题

发表于 2018-6-7 15:03 | 显示全部楼层
  1. Public Sub tt()
  2.     Dim dic1 As New Collection, dic2 As New Collection, i&, m&, n&, arr
  3.     arr = Sheet1.Range("b2:c101").Value
  4.     Sheet1.Range("d2:d31").ClearContents
  5.     For i = 1 To 100
  6.         If arr(i, 2) = "??" Then
  7.             dic1.Add arr(i, 1)
  8.         Else
  9.             dic2.Add arr(i, 1)
  10.         End If
  11.     Next
  12.     ReDim arr(1 To 30, 1 To 1)
  13.     For m = 1 To 30
  14.         n = WorksheetFunction.RandBetween(1, dic1.Count)
  15.         arr(m, 1) = dic1(n)
  16.         dic1.Remove (n)
  17.     Next
  18.     Sheet1.Range("d2:d31").Value = arr
  19.     ReDim arr(1 To 20, 1 To 1)
  20.     For m = 1 To 20
  21.         n = WorksheetFunction.RandBetween(1, dic2.Count)
  22.         arr(m, 1) = dic2(n)
  23.         dic2.Remove (n)
  24.     Next
  25.     Sheet1.Range("e2:e21").Value = arr
  26.     Set dic1 = Nothing
  27.     Set dic2 = Nothing
  28. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-6-7 15:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-6-7 15:14 | 显示全部楼层
lby0712 发表于 2018-6-7 14:37
举一反三,呵呵。


想学组合排列,可以看看组合数学方面的书:图论,组合数学,组合最优,等等。

我开始的时候也喜欢在论坛看各种“高深”的帖子,后来发现学不到东西,还浪费时间(那些知识书上都有)。

而我之前花一个星期看完的VBA基础书籍,花两个星期看完的SQL语法,两个星期看完的ADO反而非常有用。

渐渐地你就明白,要想学到东西,必须看书,必须系统地学习。因为必修课学过汇编和C语言,对我而

言,觉得编程是最易学的(汇编考试卷面成绩能及格的不到30%,我能轻松90多),现在也会偶尔看看

编程书籍来解解压力,看过几本很厚的mysql、api,发现对于我们这些仅仅使用Excel vba的人,那些知识只

要了解即可,有个概念,在需要的时候知道有个方向,然后度娘。花费更多时间“研究”的应该是本职工作,

手里没什么工作需要“算法”来解决的,笨办法不一定慢多少,0.1秒和5秒差别都是可接受的。

TA的精华主题

TA的得分主题

发表于 2018-6-7 15:21 | 显示全部楼层
ivccav 发表于 2018-6-7 15:14
想学组合排列,可以看看组合数学方面的书:图论,组合数学,组合最优,等等。

我开始的时候也喜欢在 ...

Sounds good .
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 13:07 , Processed in 0.038882 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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