ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba生成随机姓名列表?

如何利用vba生成随机姓名列表?

作者:绿色风 分类: 时间:2022-08-17 浏览:161
楼主
kevinchengcw
Q: 如何利用vba生成随机姓名列表?
A: 生成代码如下:
  1. Sub test()
  2. Dim Arr, Arr2, Arr3, I%, N&, S As Boolean, Str$, Dic, A&, B&
  3. N = Val(InputBox("请输入要生成的人名数:"))     '输入要生成的随机人名数量
  4. If N = 0 Then Exit Sub      '如果未输入或点了取消则退出程序
  5. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目,用于清除生成的重复的人名
  6. With Sheet1     '从sheet1中读取数据并随机生成姓名
  7.     Arr = .Range(.[a2], .Cells(.Rows.Count, 1).End(3))  '读取百家姓放入数组
  8.     Arr2 = .Range(.[b2], .Cells(.Rows.Count, 2).End(3))    '读取男子名常用字放入数组
  9.     Arr3 = .Range(.[c2], .Cells(.Rows.Count, 3).End(3))     '读取女子名常用字放入数组
  10.     Do  '循环执行
  11.         Str = ""       '先清空用于存储生成的名字的变量
  12.         S = Rnd > 0.5   '用取得的随机数来判断生成男子名还是女子名
  13.         I = 2 + IIf(Rnd > 0.8, 0, 1)    '用随机数确定生成的名字的字符数(80%的几率为三个字)
  14.         If S Then   '如果是男子名,则
  15.             A = Int(Rnd * (UBound(Arr) - 2)) + 2    '取得姓对应的数组下标
  16.             B = Int(Rnd * (UBound(Arr2) - 2)) + 2   '取得名字的对应下数组下标
  17.             Str = Arr(A, 1) & Arr2(B, 1)    '串接名字
  18.             If I > 2 Then   '如果名字的字符数大于2,则再得一次名字的字符下标并串接给字符串变量
  19.                 B = Int(Rnd * (UBound(Arr2) - 2)) + 2
  20.                 Str = Str & Arr2(B, 1)
  21.             End If
  22.         Else    '如果是女子名,则取对应的女子名数组内容,处理方式同上
  23.             A = Int(Rnd * (UBound(Arr) - 2)) + 2
  24.             B = Int(Rnd * (UBound(Arr3) - 2)) + 2
  25.             Str = Arr(A, 1) & Arr3(B, 1)
  26.             If I > 2 Then
  27.                 B = Int(Rnd * (UBound(Arr3) - 2)) + 2
  28.                 Str = Str & Arr3(B, 1)
  29.             End If
  30.         End If
  31.         Dic(Str) = ""   '将随机姓名放入字典中
  32.     Loop Until Dic.Count = N    '如果字典项目数量达到输入的数值则跳出循环
  33. End With
  34. With Sheet2     '将结果写入sheet2中
  35.     .Cells.Clear    '清空原有内容
  36.     If Dic.Count > 65536 Then   '防止数量太多时无法转置及数据超出单元格最大行号的情况
  37.         Arr = Dic.keys
  38.         For N = LBound(Arr) To UBound(Arr)
  39.             Cells((N Mod 65536) + 1, N \ 65536 + 1) = Arr(N)
  40.         Next N
  41.     Else    '数量少时直接转置
  42.         .[a1].Resize(Dic.Count, 1) = Application.Transpose(Dic.keys)    '转置字典的keys值
  43.     End If
  44. End With
  45. Set Dic = Nothing   '清空字典项目
  46. End Sub


附示例文件。
随机姓名生成测试.rar
2楼
君柳
谢谢小K,非常好用。
3楼
初学者2012
学习了**!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap