Excel擅长生成随机数,但不擅长用随机数填充其中没有重复特定数字两次的单元格区域。例如,您可能想要以随机顺序填充从1到52的52个单元格。 (这与从卡组中随机选择卡片非常相似,其中只能选择一次特定卡片。因此,此技巧的标题。)

显然没有内置的Excel函数可以提供此功能,因此您只能使用宏。幸运的是,创建这样的宏并不是很困难。下面的宏可以很好地解决这个问题:

Sub FillRand()

Dim nums() As Integer     Dim maxval As Integer     Dim nrows As Integer, ncols As Integer     Dim j As Integer, k As Integer     Dim Ptr As Integer     Randomize

Set s = Selection     maxval = s.Cells.Count     nrows = s.Rows.Count     ncols = s.Columns.Count

ReDim nums(maxval, 2)



'Fill the initial array     For j = 1 To maxval         nums(j, 1) = j         nums(j, 2) = Int((Rnd * maxval) + 1)

Next j

'Sort the array based on the random numbers     For j = 1 To maxval - 1         Ptr = j         For k = j + 1 To maxval             If nums(Ptr, 2) > nums(k, 2) Then Ptr = k         Next k         If Ptr <> j Then             k = nums(Ptr, 1)

nums(Ptr, 1) = nums(j, 1)

nums(j, 1) = k             k = nums(Ptr, 2)

nums(Ptr, 2) = nums(j, 2)

nums(j, 2) = k         End If     Next j

'Fill in the cells     Ptr = 0     For j = 1 To nrows         For k = 1 To ncols             Ptr = Ptr + 1             s.Cells(j, k) = nums(Ptr, 1)

Next k     Next j End Sub

该宏使用二维数组(数字)来确定要使用的数字以及应使用的顺序。在宏的开头附近,该数组填充有一个静态数(1到单元数)和一个介于1和单元数之间的随机数。然后,使用第二个数字对数组进行排序。一旦存储阵列,将原始数字放在单元格中就很简单了。

顺便说一句,使用二维数组的原因是因为VBA用于生成随机数的Rnd函数可以返回重复值。因此,即使数组的第二维中可以有重复项,但是当最终对数组进行排序时,第一维将不具有重复项。

要使用宏,请先选择要随机填充顺序值的单元格。当您运行宏时,将填充该范围。例如,如果选择十个单元格然后运行宏,则这些单元格将以随机顺序填充数字1到10。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(8269)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处为Excel的较早菜单界面找到此技巧的版本: