2

我是 VBA 新手,正在尝试编写一个简单的宏。我在下面粘贴了我的代码。基本上,我在单元格 B5 到 B15 中有 11 个随机数。如果这个数字小于 0.65,我希望它在旁边的列中打印 TRUE。如果它大于 0.65,我希望它在旁边的列中打印 FALSE。我想我基本上已经把代码写下来了,但是 Sub PrintandRead 中的“Next t”,t 的值将是 5 到 15(这是正确的)但是它会上升到 markov 函数,其中 t 然后返回 t=0 . 为什么它没有将“Next 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
4

2 回答 2

1

虽然您在函数中调用t了一个变量markov,但这是与 mainReadAndPrint方法中的变量不同的变量。这称为作用域——当您在每个方法中声明每个变量时,它的作用域就是该方法。您可以在其他地方再次使用相同的名称,但它是一个完全不同的变量(并且可能具有不同的类型等)。

您可以做的最好的事情是通过更改声明作为参数传递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))

您还应该Dim t As Doublemarkov函数中删除 。

于 2013-01-14T16:20:43.223 回答
0

你有两个选择:

  • 超级简单的是:

在 C 列中执行以下操作:=IF(B5 > 0.65, "TRUE", "FALSE")

  • 这是一个更简单的 VBA 版本来做同样的事情。

代码:

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

输出:

在此处输入图像描述

于 2013-01-14T18:03:19.047 回答