【问题标题】:output random numbers in three different rows在三个不同的行中输出随机数
【发布时间】:2018-01-02 05:41:09
【问题描述】:

我正在研究随机数 VBA,下面的代码从 sheet2 中选择一个名称并复制到表 1,我可以重复这些步骤从该列表中选择 3 个不同的名称。当所有三个名称都在三个连续行中时,此代码做得非常好,但是当它们在第 5 行、第 10 行和第 15 行时未能选择 3 个不同的名称。有人可以帮我挑选三个不同的名字并将它们放在相隔 5 行的行中吗? (第 1 行第 1 个名称,第 5 行第 2 个名称和第 15 行第 3 个名称)我是 VBA 新手!

Sub DDQ1()
Application.ScreenUpdating = False
Dim source, destination As Range
Set source = Sheets("sheet2").Range("A60:A81")
Sheets("sheet1").Activate
Set destination = ActiveSheet.Range("B53")
ReDim randoms(1 To source.Rows.Count)
destrow = 0
For i = 1 To destination.Rows.Count
 If destination(i) = "" Then: destrow = i: Exit For
Next i
If destrow = 0 Then: MsgBox "no more room in destination range": Exit Sub
For i = 1 To UBound(randoms): randoms(i) = Rnd(): Next i
ipick = 0: tries = 0
Do While ipick = 0 And tries < UBound(randoms)
tries = tries + 1
minrnd = WorksheetFunction.Min(randoms)
For i = 1 To UBound(randoms)
If randoms(i) = minrnd Then
  picked_before = False
  For j = 1 To destrow - 1
    If source(i) = destination(j) Then: picked_before = True: randoms(i) =        2: Exit For
  Next j
  If Not picked_before Then: ipick = i
  Exit For
End If
Next i
Loop
If ipick = 0 Then: MsgBox "no more unique name possible to pick": Exit Sub
destination(destrow) = source(ipick)
Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 不是您问题的答案,但Dim source, destination As Range 将使目标成为一个范围,但源作为变体。你需要Dim source as Range, destination As Range
  • 稍微格式化一下会有很大帮助。

标签: vba excel random


【解决方案1】:

如果我理解正确,如果你换行

For i = 1 To destination.Rows.Count

For i = 1 To destination.Rows.Count Step 5

这应该可以。虽然当我尝试它时,我还必须使目标范围大于“B53”。我输入“B53:B99”

【讨论】:

  • 嗨 Rob.. 感谢您的回复。我试图提出你的建议,但它不起作用。问题是范围不能变大。我有一定的限制来获得更大的范围。要重新迭代,宏应该从一个范围中提取三个不同的名称(互斥),并将这三个名称放在相隔 5 行的三个不同行中。
  • 当我尝试运行您的代码(如给定)时,我在单元格 B53 中得到一个值,然后错误消息“目标范围内没有更多空间。这是因为您的范围是一个单元格,所以一个它复制了一件事,没有更多空间了。至少范围必须是 B53:B63 才能容纳三个数据项,相隔五个单元格。
  • 好的!我在一个单独的宏中使用“调用”函数来三次调用这个宏,这样我就得到了三个不同的名称。我是 VBA 新手,我使用的方法可能非常原始。现在我意识到它不适用于这种方法。有没有更好的办法?
  • 我知道你调用了它三次,但是当我第二次调用它时,如果范围只是“B53”,它就不会再添加任何数据了。我真的看不出将范围设为“B53:B63”的问题,它只会更改您希望更改的三个单元格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2020-12-28
  • 2016-09-27
相关资源
最近更新 更多