1

我在 VBA 中编写了一个函数,它查看某些附近单元格的内容,然后根据它们的值返回一个字符串。我希望这个函数在一整列单元格上运行。但是,当我填写时,每个单元格都显示相同的值,即我编辑并按下回车键的单元格的值。我尝试过设置Application.Volatile和重新计算工作表(都使用F9ActiveSheet.Calculate),但这些都没有奏效。我还尝试设置ActiveCell.Value为我想要返回的字符串,然后不从函数返回任何内容,但 excel 说这是一个循环引用。有什么建议么?

这是我的代码(的相关部分):

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 回答