Vba &引用;下一个t“;sub中的值未传递到函数

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

我是VBA新手,正在尝试编写一个简单的宏。我已将代码粘贴到下面。基本上,我在单元格B5到B15中有11个随机数。如果这个数字小于0.65,我希望它在它旁边的列中打印为TRUE。如果它大于0.65,我希望它在它旁边的列中打印FALSE。我想我基本上已经把代码写下来了,但是子打印中的一个“下一个t”,t将有一个值5到15(这是正确的),但是它会上升到马尔可夫函数,其中t然后返回到t=0。为什么它不将“下一个t”值带到函数中

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