Vba &引用;下一个t“;sub中的值未传递到函数
我是VBA新手,正在尝试编写一个简单的宏。我已将代码粘贴到下面。基本上,我在单元格B5到B15中有11个随机数。如果这个数字小于0.65,我希望它在它旁边的列中打印为TRUE。如果它大于0.65,我希望它在它旁边的列中打印FALSE。我想我基本上已经把代码写下来了,但是子打印中的一个“下一个t”,t将有一个值5到15(这是正确的),但是它会上升到马尔可夫函数,其中t然后返回到t=0。为什么它不将“下一个t”值带到函数中Vba &引用;下一个t“;sub中的值未传递到函数,vba,Vba,我是VBA新手,正在尝试编写一个简单的宏。我已将代码粘贴到下面。基本上,我在单元格B5到B15中有11个随机数。如果这个数字小于0.65,我希望它在它旁边的列中打印为TRUE。如果它大于0.65,我希望它在它旁边的列中打印FALSE。我想我基本上已经把代码写下来了,但是子打印中的一个“下一个t”,t将有一个值5到15(这是正确的),但是它会上升到马尔可夫函数,其中t然后返回到t=0。为什么它不将“下一个t”值带到函数中 Option Explicit Function markov(pwd A
Option Explicit
Function markov(pwd As Double, pww As Double) As Boolean
Static wetYesterday As Boolean
pwd = 0.4
pww = 0.65
Dim c As Double
Dim t As Double
If wetYesterday Then c = t - pww Else c = t - pwd
If c <= 0 Then
wetYesterday = True: markov = True
Else
wetYesterday = False: markov = False
End If
End Function
Sub ReadAndPrint()
Dim t As Double
Dim p As Double
Dim z(11) As Double
Application.ScreenUpdating = False
Worksheets("Sheet1").Activate
p = 2
For t = 5 To 15
z(t - 4) = Cells(t, p)
Next t
p = p + 1
For t = 5 To 15
Cells(t, p) = markov(0.4, 0.65)
'z(t - 4)
Next t
End Sub
选项显式
函数markov(pwd为Double,pww为Double)为布尔函数
作为布尔值的静态变量
pwd=0.4
pww=0.65
双精度c
调暗t为双色
如果是,则c=t-pww,否则c=t-pwd
如果c在markov
函数中有一个名为t
的变量,则该变量与主ReadAndPrint
方法中的变量不同。这称为作用域——当您在每个方法中声明每个变量时,它的作用域就是该方法。您可以在其他地方再次使用相同的名称,但它是一个完全不同的变量(并且可能具有不同的类型等)
您可以做的最好的事情是通过更改声明将t
作为参数传递到markov
方法中:
Function markov(pwd As Double, pww As Double,t as Double) As Boolean
并称之为
Cells(t, p) = markov(0.4, 0.65, z(t - 4))
您还应该从markov
函数中删除Dim t As Double
。您有两个选项:
- 超级易赛将是:
在C列中执行此操作:=IF(B5>0.65,“真”、“假”)
- 下面是一个简单的VBA版本,可以实现同样的功能
代码:
选项显式
副主席()
变暗输入范围
作为变量的输入
作为整数的Dim i
“--获取用户输入
设置inputng=Application.InputBox(“请输入列范围”,“输入范围”、、8)
如果输入什么都不是,那么
出口接头
如果结束
“--用该范围填充数组
arrInput=工作表函数.Transpose(inputng.Value)
对于i=LBound(arrInput)到UBound(arrInput)
如果为空(输入(i)),则
ARR输入(i)=“新值”
埃尔塞夫圆(arrInput(i),2)<0.65
输入(i)=“真”
其他的
输入(i)=“假”
如果结束
接下来我
'--输出到下一列
输入偏移量(0,1).Resize(UBound(arrInput),1)=应用程序转置(arrInput)
端接头
输出:
它使用t的值“5”,t应该是第5行的值,而不是5。我如何解决这个问题?您已经从单元格中读取了值,并将其放入z(t-4)
,因此将其传递到函数中,而不仅仅是t
。像这样?它似乎不起作用。对不起,我很迷路,已经为此工作了很长时间。函数markov(pwd为Double,pww为Double,z(t-4)为Double)为布尔静态wetdeed为布尔pwd=0.4 pww=0.65 Dim c为Double如果wetdeed则c=z(t-4)-pww Else c=t-pwd如果c否,则在调用中-这就是可用的z(t-4)
(范围内!)查看我编辑的行。@user1977802如果您感兴趣,可以查看此行。将其转换为函数:)
Option Explicit
Sub checkGreatness()
Dim inputRng As Range
Dim arrInput As Variant
Dim i As Integer
'--get user input
Set inputRng = Application.InputBox("Please enter Column Range", "Enter the Range", , , , , , 8)
If inputRng Is Nothing Then
Exit Sub
End If
'--populate array with that range
arrInput = WorksheetFunction.Transpose(inputRng.Value)
For i = LBound(arrInput) To UBound(arrInput)
If IsEmpty(arrInput(i)) Then
arrInput(i) = "NoValue"
ElseIf Round(arrInput(i), 2) < 0.65 Then
arrInput(i) = "True"
Else
arrInput(i) = "False"
End If
Next i
'--output to next column
inputRng.Offset(0, 1).Resize(UBound(arrInput), 1) = Application.Transpose(arrInput)
End Sub