【问题标题】:Excel - Generate Random Number based on 2 other columnsExcel - 根据其他 2 列生成随机数
【发布时间】:2016-01-18 23:45:58
【问题描述】:

我不确定如何完成以下任务: 在 A 列我有数字,在 B 列我有与这些数字相关联的名称。

我希望能够从 A 列生成一个随机数,但只能从 B 列上没有任何关联的数字生成。例如:如果我在 A1 中有一个数字,但我没有B1中的名称,A1中的数字应该是可以随机生成的数字之一。

如果 A2 有一个数字,并且 B2 不为空(它有一个名称),我不希望 A2 在随机范围内。

此外,能够重新生成随机数(也就是,如果我分配一个数字,比如说 321,我希望能够以某种方式再次生成随机数,但它不应该考虑到 321,因为它已经被分配)。

我很欣赏任何想法。

样本

【问题讨论】:

  • 这不是我的代码网站。本网站旨在提供特定的问题和答案。
  • 我在线程中添加了一些解释。 @Grade'Eh'Bacon 感谢您清除它。我希望有人提到这一点。基本上,使用 Python 或 JavaScript 不会有问题。我只是想看看是否有内置的excel方法。
  • 您描述了一个电子表格,其中 B 行中为空白的列在 A 行中具有对 =rand() (或类似)的引用,而 B 行中具有值的列在 A 行中具有数字以其他方式确定。按 F9 重新生成对 =rand() 的引用。祝你好运!
  • 请注意,任何使用 RAND 的工作表函数都会在数据输入到工作表时重新填充。您要么需要动态生成 ID [这意味着所有输入必须是唯一的且没有重复,如果您打算基于空白单元格生成“随机”数字,这可能是不可能的],或者您需要使用 VBA。
  • @Grade'Eh'Bacon 现在我确信 A 列中的所有数字都是唯一的,并且始终是手动输入的。这些不是随机生成的。现在很清楚 Excel 是如何做到这一点的。感谢您的帮助。

标签: excel vba


【解决方案1】:

您可以尝试以下方法:

根据您的示例数据/电子表格,执行以下操作:

1) 在单元格 C1 中:输入值“0”

2) 在 C2 单元格中:输入公式:

=IF(ISBLANK(B2), 1, 0)+OFFSET(C2,-1,0,1,1)

3) 将 C2 中的公式与所有数据一起复制。

4) 将此公式放在要显示 A 列随机 # 的任何位置:

=OFFSET(A1,MATCH(RANDBETWEEN(1,COUNTA(A:A)-COUNTA(B:B)),C:C,0)-1,0,1,1)

【讨论】:

  • 谢谢。它就像一个魅力。我也很欣赏这个演练,因为它更容易看到逻辑。
  • NP .. 这个家伙唯一真正的缺点是“帮助列”(有些人出于某种原因真的很讨厌);)大声笑任何时候我使用帮助列时,我都会尝试使用偏移量,所以当你插入/删除一行时它不会“中断”...... ;)
【解决方案2】:

我认为您将很难使用工作表函数。这是一种至少在某些时候有效的快速而肮脏的方法---

  1. 在两个(或更多)单元格中,添加公式=RANDBETWEEN(COLUMN(A1),COLUMN(D1)),将A1D1 替换为数字行中的第一个和最后一个单元格。这将选择随机列号。
  2. 为每个单元格指定一个唯一的名称,例如,therandtherand2、...。
  3. 在另一个单元格中,这将是您的答案,添加=IF(ISBLANK(INDIRECT(ADDRESS(2,therand))),INDIRECT(ADDRESS(1,therand)),INDIRECT(ADDRESS(1,therand2)))。这将检查第一个随机列号是否对应于空白标签 (ISBLANK(...)),如果是,则使用相应的 row-1 值。如果不是,它将使用第二个随机列号中的第 1 行值。
  4. 按 F9 重新计算。

这不会总是给你一个空白标签的单元格。添加更多的随机列号和对应的IF(...) 子句,以减少错误选择的可能性。

编辑:您在原始问题中说“A 行”,但我看到您的意思是“A 列”(而不是“第 1 行”)。您需要转置上述公式中的行和列以使其正常工作。

【讨论】:

  • 谢谢!我想我正在寻找这样的东西,一些简单的东西。让我快速检查一下,然后做出裁决。
  • 感谢编辑,确实,我的意思是列。最美好的祝愿
  • 我只是想到了另一种选择,结果@Ditto 击败了我 :) 。也试试这个答案。
  • 是的,确实,它看起来更简单而且效果很好。谢谢你们@Ditto
【解决方案3】:

这是一个 VBA 答案。可以直接作为工作表函数使用:

Function RandUnassigned(R As Range) As Variant
    Application.Volatile
    Dim A As Variant, i As Long, n As Long
    Dim num As Long
    n = R.Rows.Count

    ReDim A(1 To n)
    For i = 1 To n
        If Len(R.Cells(i, 2)) = 0 Then
            num = num + 1
            A(num) = R.Cells(i, 1)
        End If
    Next i
    RandUnassigned = A(Application.WorksheetFunction.RandBetween(1, num))
End Function

这样使用:

每次电子表格执行时都会重新计算。如果您希望它只绘制一次随机数,请从函数定义中删除 Application.Volatile 行。

【讨论】:

  • 谢谢约翰,这有助于我了解如何将 Python 代码转换为 VB 可以理解的内容。
  • 我写了很多 Python 和 VBA获得单个 Python 列表理解的功能。尽管如此——VBA 有它的魅力,并且已经完成了一些有趣的工作来使从 VBA 调用 Python 成为可能。有一个不错的博客定期讨论一些问题:newtonexcelbach.wordpress.com
  • 谢谢。在我问这个问题之前,我已经搜索了一个可以促进这一点的附加组件。你的博客推荐是正确的。我很感激。
猜你喜欢
  • 2020-08-20
  • 2020-10-13
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2011-03-31
  • 2012-12-19
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多