玩全甲板游戏(Microsoft Excel)
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的较早菜单界面找到此技巧的版本:
全甲板玩。