VBA宏嵌套调用及随机数生成后值粘贴问题求助
解决VB宏生成多个静态随机数的问题
嘿,作为Visual Basic新手遇到这种循环执行的问题太正常了,我来帮你捋清楚怎么搞定!
首先得说清楚你之前的问题出在哪:你的BINGO宏每次生成随机数后都只写到G5单元格,就算你用Call调用三次,后面的结果会直接覆盖前面的,所以看起来好像只执行了一次。而且你需要把每次生成的结果保存到不同的位置,还要确保这些数值是静态的——其实直接给单元格赋值就是静态的,不会跟着后续生成的新数变化,不用特意复制粘贴值(当然复制粘贴值也能实现)。
下面给你两种解决方案,选哪个都可以:
方案一:修改原宏,让它支持指定输出位置(更高效)
先把你的BINGO宏改成可以接受目标单元格参数的版本,这样每次调用时就能指定把结果写到不同地方:
Sub BINGO(targetCell As Range) Dim linenumber As Integer, numpick As Integer Dim bingonum As String linenumber = Range("E1").Value numpick = Range("B" & linenumber).Value Range("B" & linenumber).ClearContents ' 原来的分类逻辑保持不变 If numpick > 90 Then bingonum = "W " & numpick ElseIf numpick > 80 Then bingonum = "A " & numpick ElseIf numpick > 70 Then bingonum = "R " & numpick ElseIf numpick > 60 Then bingonum = "D " & numpick ElseIf numpick > 50 Then bingonum = "* " & numpick ElseIf numpick > 40 Then bingonum = "3 " & numpick ElseIf numpick > 30 Then bingonum = "5 " & numpick ElseIf numpick > 20 Then bingonum = "8 " & numpick ElseIf numpick > 10 Then bingonum = "1 " & numpick Else bingonum = "HCC " & numpick End If ' 直接把结果写入指定的目标单元格,自动就是静态值 targetCell.Value = bingonum End Sub
然后写一个主宏,调用三次BINGO,分别指定不同的输出位置(比如我用J5、J6、J7,你可以改成你需要的单元格):
Sub GenerateThreeBingoNumbers() ' 生成第1个随机数,放到J5 Call BINGO(Range("J5")) ' 生成第2个随机数,放到J6 Call BINGO(Range("J6")) ' 生成第3个随机数,放到J7 Call BINGO(Range("J7")) End Sub
方案二:保留原宏,通过主宏处理复制粘贴值
如果你不想修改原来的BINGO宏,就在主宏里完成“生成→复制→粘贴值”的循环:
Sub GenerateThreeBingoNumbers() ' 生成第1个随机数并保存 Call BINGO Range("G5").Copy Range("J5").PasteSpecial Paste:=xlPasteValues ' 只粘贴值,确保静态 Application.CutCopyMode = False ' 清除复制状态,避免弹窗 ' 生成第2个随机数并保存 Call BINGO Range("G5").Copy Range("J6").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False ' 生成第3个随机数并保存 Call BINGO Range("G5").Copy Range("J7").PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub
额外小技巧:用循环生成任意数量的随机数
如果以后你需要生成更多个随机数,不用一次次写重复代码,用循环就行:
Sub GenerateNBingoNumbers(count As Integer, startCell As Range) Dim i As Integer For i = 1 To count Call BINGO ' 从起始单元格开始,依次往下写结果 startCell.Offset(i - 1, 0).Value = Range("G5").Value Next i End Sub
调用的时候只要写Call GenerateNBingoNumbers(3, Range("J5")),就能生成3个随机数从J5开始往下排列啦。
内容的提问来源于stack exchange,提问作者lfc2001
相关产品推荐
相关产品推荐

