2

私は VBA を初めて使用し、単純なマクロを作成しようとしています。以下にコードを貼り付けました。基本的に、セル B5 から B15 に 11 個の乱数があります。この数値が 0.65 未満の場合、その隣の列に TRUE を出力したいと思います。0.65 より大きい場合は、その横の列に FALSE を出力したいと思います。基本的にコードはダウンしていると思いますが、Sub PrintandRead の「次の t」では、t の値は 5 ~ 15 になります (これは正しいです)。 . 「次の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

関数で呼び出される変数がありますがtmarkovこれは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 Double関数からも削除する必要がありmarkovます。

于 2013-01-14T16:20:43.223 に答える
0

次の 2 つのオプションがあります。

  • 非常に簡単なのは次のとおりです。

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 に答える