一个单元格中的非重复随机数与文本一起

一个单元格中的非重复随机数与文本一起

我有一个大数据表,其中有很多单独命名的范围,这些范围由下拉列表依赖调用。

由于所有名称都需要唯一,因此我想为每个名称分配一个唯一的 ID。忽略我无法通过这种方式生成不重复的随机数的问题,我还需要将唯一 ID 与名称的其余部分放在同一个单元格中。因此它应该看起来像“xyz-name_ID:rand()”。这可能吗?如果我必须从额外的行连接名称,那将很麻烦。

感谢并欢呼

答案1

因此,我理解您需要为名称的“:rand()”部分分配 1,000 个唯一值。您希望以随机顺序而不是某种排序顺序分配它们。新的 ID 将成为命名范围,我不得不假设您的意思是立即,然后将在电子表格中自由使用。我看不出有其他很好的解释方法。并且您希望在不影响使用它们的结构的情况下形成它们。

我认为,如果您需要额外的附加功能,VBA 将是您的最佳选择。它可以获取现有命名范围的列表,从列表中删除明显的无效内容(例如打印范围),然后将剩余部分拆分为随机部分,生成 10 或 20 个随机值并查看它们是否在已经存在的随机部分中,挑选一个不存在的,然后在启动宏之前返回您选择的单元格中的新 ID。不过,我无法为您写出这个,所以这里有一个解决方案,它不会比您预期的更麻烦,因为您必须实际创建命名范围,而这无法通过单元格中的公式来完成。所以:

创建一个完成后可以移开的页面。使用以下公式创建(最终有 1,000 多个)可能 2,000 个值(因此可能是 A1:A2000):

=RANDBETWEEN(1000,9999)

一旦填充了多个单元格,就复制并粘贴值,这样它们就不会不断地变化。在下一列中使用以下公式:

=COUNTIF(A1:$A$2000,"="&A1)

它将检查列表中的每个值,看从该值到列表末尾有多少个相同的值。因此,公式将测试 A35 的值在范围 A35:A2000 中出现的次数... 不是整个列表,只是从该值到列表末尾。这就是A1:$A$2000使用范围的原因(通常您会看到绝对引用首先给出从相关单元格开始的值)。任何在其下方再次出现的值都将给出 >1 的值。该值在列表中的最后一次出现将给出 1,因此将保留它的一个副本,但所有更早的出现都将给出 >1 的数字。

复制列表并粘贴值,这样就不会发生任何变化。按“COUNT()”列对两列进行排序,Az,这样>1 的值就会出现在底部。转到底部并返回到值开始为 1 的位置。突出显示并清除具有“非 1”值的单元格对。现在您有一个介于 1000 和 9999 之间的唯一随机值列表,并且仍然处于随机顺序。

接下来返回B1并输入以下公式:

=IF(B1="","",B1&"_ID:"&A1)

这样,您可以在 C 列中输入所选名称,然后查看 C 列中出现的全名、_ID:”部分和唯一随机值。您只需复制并粘贴值,然后 1) 立即转到命名区域函数对话框并创建一个新区域,您将看到该区域采用您刚刚粘贴值的单元格中的值,因此您不必键入或粘贴该名称,然后继续到“引用”部分输入您最喜欢的范围,或者 2) 按 F2,复制单元格中的所有内容,转到获取名称的范围并突出显示它,进入命名区域对话框并创建一个新名称,粘贴您刚刚创建的名称,然后查看“引用”部分已填充您之前选择的范围。我更喜欢第二种方法,因为随身携带确切的名称很容易,让 Excel 完成从我的选择中指定范围的困难部分,但每个人都是独一无二的。

您将其粘贴为一个值以确保它永远不会改变。这里并不是真正需要担心的问题,但这是一种很好的做法。这样您就可以执行上面的方法 2),如果不这样做,名称将无法轻松携带。

所以,真的完成了。您必须费尽心思创建命名范围,并首先创建名称本身,只需单击某处并先输入它,就不会太麻烦。VBA 甚至可以消除这个问题,但这不是一项简单的任务。首先创建列表花了我三分钟,这需要进行实验以确保我不会弄乱它并发布弄乱的公式。您甚至可以编写一个简单的宏来转到包含列表的工作表,并编写一个宏来返回您离开的确切工作表和位置。为它们分配相应的快捷方式(例如 Ctrl-N 转到它,Alt-N 返回它)。已经有很多快捷方式,无论您选择什么,您都会踩到其中的一两个,所以在使用之前先看看每个快捷方式的作用!当然,它可能会稍微复杂一些,选择下一个未取值,逐步完成手动完成的工作,然后将控制权返回给您,而您从未离开过您启动它的位置……命名范围已经创建,并且所有键入名称、复制、粘贴值的步骤也已完成。如果您在启动它的单元格中输入“xyz-name”部分,它可以使用它来制作名称,并在将控制权返回给您时将其从单元格中清除,以便它是原始的,并准备好让您输入公式……宏中不需要对话框,因此您可以使用录音机编写它,甚至不需要手工编写。稍后用一行您可以在“互联网”上轻松找到的代码对其进行修饰,以便永远不会离开您或您的用户所在的页面。

因此,使用这种录音机类型的宏,它几乎就像我在开始时提到的更复杂的宏一样,而且非常轻松。没有那个宏,仍然非常快速和容易,因为它只增加了一些小的努力。

如果将来您真的可能有几千个名字,请在列表制作中使用五位数字,RANDBETWEEN()以减少列表大小匹配的可能性,并使名字保持标准化,而不是遍布整个地图。

相关内容