Excel指定文本按指定次数随机排序显示
来源:网络收集 点击: 时间:2024-03-11如图,在D列中,要把B列廊脂里的文本按C列中的次数生成,同时生成的顺序是随机的比如案例里“18基本”要在D列出现5次,“伐陕科18舒适”要8次,“18豪华”要10次,“13基本”边畜要7次。即D列要出现30个名称,但是“18基本”、“18舒适”、“18豪华”、13基本”要随机生成。

B1:C6放在一组数mb(名称,数量)中,根据C列总计出有30个名称,每个名称个数生成按序号1,2,3,…,30对应名称的数组mn(序号,名称),然后随机生成1到30的随机数,然后按这些随机数查找mn(序号,名称),生成mm(随机序号,名称)数组随机名称。

首先打开上例文件,如下图。

然后按下快捷键ALT+F11打开VBA(宏)编辑界面,然后点菜单栏【插入】下拉中列表中点【模块(M)】如图。

然后插入了一个模块1,在代码框中复制如下代码:
Option Base 1
Sub 文本次数随机显示()
2020-5-7 22:32:18
Dim i As Long, j As Long, k As Long, n As Long, mb, mn(), mm(), rn As Long
mb = Range(Range(b3), Range(c Range(b Rows.Count).End(xlUp).Row))
n = Application.WorksheetFunction.Sum(Application.WorksheetFunction.Index(mb, 0, 2))
k = 0
ReDim mn(n, 2)
For i = 1 To UBound(mb, 1)
For j = 1 To mb(i, 2)
k = k + 1
mn(k, 1) = k
mn(k, 2) = mb(i, 1)
Next j
Next i
Erase mb
ReDim mm(n, 2)
Randomize
For i = 1 To n
rn = Int((n * Rnd) + 1)
If i = 1 Then
mm(i, 1) = rn
mm(i, 2) = Application.WorksheetFunction.VLookup(rn, mn, 2, False)
Else
k = i
For j = 1 To i - 1
If mm(j, 1) = rn Then i = i - 1: Exit For
Next j
If k = i Then
mm(i, 1) = rn
mm(i, 2) = Application.WorksheetFunction.VLookup(rn, mn, 2, False)
End If
End If
Next i
Range(d3).Resize(n, 1) = Application.WorksheetFunction.Index(mm, 0, 2)
End Sub

以上操作动态过程如下:

回到工作表窗口,首先选原数据表,然后运行【文本次数随机显示】宏(菜单栏中点【视图】中下列表中【宏】列表【查看宏(V)】打开宏对方框,选该宏名),输出结果,运行过程如下图。


下面修改下代码,做成万能式随机显示,选原数据(不含标题两列,后列必须是 数字),然后运行宏得到随机排列,代码如下:
Sub 选数据随机显示()
2020-5-7 22:32:18
Dim i As Long, j As Long, k As Long, n As Long, mb, mn(), rn As Long, myr As Range
mb = Selection
n = Application.WorksheetFunction.Sum(Application.WorksheetFunction.Index(mb, 0, 2))
k = 0
ReDim mn(n, 2)
For i = 1 To UBound(mb, 1)
For j = 1 To mb(i, 2)
k = k + 1
mn(k, 1) = k
mn(k, 2) = mb(i, 1)
Next j
Next i
Erase mb
Randomize
On Error Resume Next
With CreateObject(scripting.dictionary)
For i = 1 To n
rn = Int((n * Rnd) + 1)
.Add rn, Application.WorksheetFunction.VLookup(rn, mn, 2, False)
If Err.Number 0 Then
i = i - 1
End If
Err.Clear
Next i
Set myr = Application.InputBox(prompt:=选择输出随机数据一个单元格, Type:=8)
myr.Resize(.Count, 1) = Application.WorksheetFunction.Transpose(.items)
End With
End Sub


回到工作表窗口,首先选原数据表,然后运行【选数据随机显示】宏(菜单栏中点【视图】中下列表中【宏】列表【查看宏(V)】打开宏对方框,选该宏名),提示“选择输出随机数据一个单元格”,选好后输出结果,运行过程如下图。


如果觉得这篇经验帮到了您,请点击下方的 “投票点赞 或者“收藏”支持我!还有疑问的话可以点击下方的 “我有疑问”,谢谢啦!
注意事项动态图片要双击成单独大图才能播放全过程。
两个宏代码里不同处理不重复数字,前者是数组处理,后者用到字典对象处理。后者比前者速度快,如果数据量大,要用后者,否要等很久。
版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、文章链接:http://www.1haoku.cn/art_323044.html