1

特定の近くのセルの内容を確認し、その値に基づいて文字列を返す関数を VBA で作成しました。この関数をセルの列全体で実行したい。ただし、入力すると、すべてのセルに同じ値が表示されます。編集してEnterキーを押したセルの値です。シートの設定と再計算を試みましたが(とApplication.Volatileの両方を使用)、どれも機能しませんでした。また、返される文字列に設定して、関数から何も返さないようにしましたが、Excelはこれが循環参照であると言います。助言がありますか?F9ActiveSheet.CalculateActiveCell.Value

ここに私のコード(の関連部分)があります:

Function foginSpeechP()
Application.Volatile True
ActiveSheet.Calculate

'.....

If scenario = "SR-1A" Then
    first = "nofog"
    secnd = "fog"
ElseIf scenario = "SR-1B" Then
    first = "fog"
    secnd = "nofog"
Else: foginSpeechP = "NOT A REAL SCENARIO in foginSpeechP"
End If

If (IsNumeric(ActiveCell.Offset(0, 4)) And ActiveCell.Offset(0, 4) > 0) Then
    currTimeStamp = ActiveCell.Offset(0, 4)
Else: foginSpeechP = "NO TIME STAMP IN FOGINSPEECHP()"
End If


If currTimeStamp < speechFogChange Then
    foginSpeechP = first
    'ActiveCell.Value = first
Else: foginSpeechP = secnd
    'ActiveCell.Value = secnd
End If

End Function
4

3 に答える 3

2

問題は、アクティブなセルを参照していることです。これは、関数が評価された時点でカーソルによって選択されたセルである可能性があります。

これを行う方法は、関数への引数としてセル オフセットを受け入れることです。

Function foginSpeechP(A)

    If scenario = "SR-1A" Then
        first = "nofog"
        secnd = "fog"
    ElseIf scenario = "SR-1B" Then
        first = "fog"
        secnd = "nofog"
    Else: foginSpeechP = "NOT A REAL SCENARIO in foginSpeechP"
    End If

    If (IsNumeric(A) And A > 0) Then
        currTimeStamp = A
    Else: foginSpeechP = "NO TIME STAMP IN FOGINSPEECHP()"
    End If


    If currTimeStamp < speechFogChange Then
        foginSpeechP = first
        'ActiveCell.Value = first
    Else: foginSpeechP = secnd
        'ActiveCell.Value = secnd
    End If

End Function

次に、A1 から呼び出していると仮定して、次のようにワークシートから関数を呼び出します。

=foginSpeechP(E1)

基本的に、関数が戻り値を計算するために使用するセルからの値は、引数として関数に渡す必要があります。詳細については、次を参照してください。

http://www.cpearson.com/excel/writingfunctionsinvba.aspx

于 2012-07-18T21:10:39.267 に答える
0

Application.Callerではなく、数式が入力されているセルを取得するために使用する必要がありますActivecell

于 2012-07-18T21:11:31.960 に答える
0

ActiveSheet.Calculateワークシート関数から呼び出すことはできず、使用してActiveCellも意味がありません。

おそらく に置き換えたいと思うでしょActiveCellApplication.Caller

さらに良いことに、関連する範囲をパラメーターとして関数に渡します。

于 2012-07-18T21:12:15.300 に答える