暂存功能并将结果打印到单元格 VBA
Posted
技术标签:
【中文标题】暂存功能并将结果打印到单元格 VBA【英文标题】:Staging function and printing results to cells VBA 【发布时间】:2013-05-27 02:29:16 【问题描述】:基本上我有一个数组A = Array(1, 2, 3, 4, 5)
,我想做的是,使用Rnd()
,根据随机数的值围绕这个循环。
基本上从0 Mod 5
开始获取一个随机数。如果随机数小于 0.5,那么我留在0 Mod 5
,但是如果随机数大于或等于 0.5,那么我移动到1 Mod 5
,然后因为它被传递到下一个阶段'它会再次滚动',所以我给它传递了一个新的随机数,看看它是否可以到达2 Mod 5
。
我的目标是运行 10,000 次并将结果收集到电子表格的 A 列中,然后绘制散点图以查看其工作原理。
现在我创建了一个函数
Function looper(R, i)
If R < 0.5 Then
j = i
Else
j = i + 1
End If
If j = i Then
Exit Function
Else
newR = Rnd()
j = looper(newR, j)
End If
End Function
加上子
Sub loopy()
A = Array(1, 2, 3, 4, 5)
Randomize
R = Rnd()
k = looper(R, 1)
Cells(1, 1).Value = A(k Mod 5)
但是它只返回值 1。
我很确定我在做一些根本错误的事情,无论是我的逻辑,还是我试图将我的逻辑放入 VBA 代码的方式。
【问题讨论】:
【参考方案1】:您是否正在尝试分析和/或破解在线轮盘赌逻辑? ;)
您的
looper
函数旨在始终返回1
。
即使随机数大于0.5
,您也在递归调用该函数——所以,简单来说,它会重复直到新的随机数小于0.5
,如果是,则返回1
。
因此,我为您重写了此代码,此代码将打印出 how many random numbers greater than 0.5 can I get in a row
的结果 - 在 A 列中。
它会打印它通过的阶段数Option Explicit
Sub roulette()
Dim ws As Worksheet, nextRow&, i&, max&
Set ws = Sheets(1): ws.Cells.ClearContents
For max = 1 To 10001
nextRow = ws.Range("A" & Rows.Count).End(xlUp).Row + 1
ws.Range("A" & max).Value = getStage
Next max
End Sub
Function crack() As Boolean
Dim x#: Randomize: x = Rnd()
If x >= 0.5 Then crack = True
End Function
Function getStage() As Long
Dim cnt&
While crack: cnt = cnt + 1: Wend: getStage = cnt
End Function
【讨论】:
【参考方案2】:好的,所以我改变了我的功能
Function looper(i)
R = Rnd()
If R < 0.5 Then
looper = i
Else
looper = i + 1
End If
End Function
并改变了我的子
Sub loopy()
A = Array(1, 2, 3, 4, 5)
Cells(1, 1).Value = "Number"
For i = 2 To 10001
k = 1
j = 1
While k = j
j = looper(k)
k = k + 1
Wend
Cells(i, 1).Value = A(j Mod 5)
Next i
End Sub
这给了我想要的。然而,我现在希望,一些明亮的火花可以构想出一种更好的方法,它不涉及我一直被教导的 While
循环,应尽可能避免。
【讨论】:
以上是关于暂存功能并将结果打印到单元格 VBA的主要内容,如果未能解决你的问题,请参考以下文章
Vba找到第一个空单元格并平均它上面的4个单元格并将值粘贴到另一个单元格中
需要 VBA 代码才能单击将内容从一个单元格移动到另一个单元格的按钮