Gary在工作表中有两个列表。其中一个在A列中包含我们公司的剩余项目列表,另一个在G列中包含名称列表。 B:F列中没有任何内容。 Gary希望为项目列表随机分配名称。 G列中的每个名称只能分配一次。如果名称多于项目,那么某些名称将不会被使用。如果名称少于项目,则某些项目将没有关联的名称。

有两种方法可以完成此操作。但是,也许最简单的方法是简单地为A列中的每个项目分配一个随机数。假设第一项位于单元格A1中,则将以下内容置于单元格B1中:

=RAND()

双击单元格B1中的填充手柄,您应该在A列中每个项目的右边以一个随机数(0到1之间)结束。

现在,选择B列中的所有单元格,然后按Ctrl + C将其复制到剪贴板。使用“选择性粘贴”将值直接粘贴回B列中的那些单元格中。(这会将单元格从公式转换为实际的静态值。)

|基于列B中的值,以升序对A列和B列进行排序。如果您查看各行,现在将获得与名称(列G)随机相关的项目(列A)。

即使没有必要,您也可以按照相同的步骤在每个名称的右边添加一个随机数,然后对名称进行排序。 (我说这是没有必要的,因为将项目随机化应该足以确保每个名称都有随机的项目。)

如果您仅需要偶尔进行一次随机配对,那么到目前为止讨论的技术非常有用。如果您需要经常执行此操作,则宏可能是一种更好的方法。当然,您可以使用许多不同的基于宏的方法。下面的方法假定项目列表在A列中,名称列表在G列中。它还假定第一列的每一列都有标题单元格。

如果名称多于项目,则宏会为项目随机分配名称。如果项目多于名称,它会为名称随机分配一些项目,并随机留下“空洞”(没有名称的项目)。它将它们存储在B列中,覆盖那里的内容。

Sub AssignNames()

Set srItems = Range("A2").CurrentRegion     Set srNames = Range("G2").CurrentRegion     NameCount = srItems.Rows.Count - 1     ItemCount = srNames.Rows.Count - 1

'Randomize Names     ReDim tempArray(NameCount, 2)

For x = 0 To NameCount - 1         tempArray(x, 0) = Range("G2").Offset(x, 0)

tempArray(x, 1) = Rnd()

Next x

'Bubble Sort     For i = 0 To NameCount - 2         For j = i To NameCount - 1             If tempArray(i, 1) > tempArray(j, 1) Then                 tempItem = tempArray(j, 0)

tempName = tempArray(j, 1)

tempArray(j, 0) = tempArray(i, 0)

tempArray(j, 1) = tempArray(i, 1)

tempArray(i, 0) = tempItem                 tempArray(i, 1) = tempName             End If         Next j     Next i

'AssignNames     Range("B2") = "Assigned"

AssignCount = NameCount     If NameCount > ItemCount Then AssignCount = ItemCount         For x = 0 To AssignCount         Range("B2").Offset(x, 0) = tempArray(x, 0)

Next x End Sub

注意:

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

链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

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

本技巧(5682)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。