在Excel中使用自定义项的单元格不会重新计算

在Excel中使用自定义项的单元格不会重新计算,excel,vba,udf,Excel,Vba,Udf,我编写了这个简单的UDF,以便在Excel电子表格中进行计算。代码似乎工作正常,但只有一次。但是,如果我更改表(SharePriceGrowthTable)中的值,则单元格中的结果不会更新。即使我点击F9重新计算工作表,使用函数的单元格中的值也不会更新。我已验证计算选项是否设置为自动 关于正在发生的事情或我需要做什么不同的想法 'Compute Stock Growth Score Function StockGrowthScore(GrowthPercent As Double) As Dou

我编写了这个简单的UDF,以便在Excel电子表格中进行计算。代码似乎工作正常,但只有一次。但是,如果我更改表(SharePriceGrowthTable)中的值,则单元格中的结果不会更新。即使我点击F9重新计算工作表,使用函数的单元格中的值也不会更新。我已验证计算选项是否设置为自动

关于正在发生的事情或我需要做什么不同的想法

'Compute Stock Growth Score
Function StockGrowthScore(GrowthPercent As Double) As Double

 Dim ScoreTable As Range

 Set ScoreTable = Range("SharePriceGrowthTable")

 If GrowthPercent >= 0 Then
   StockGrowthScore = WorksheetFunction.VLookup(GrowthPercent, ScoreTable, 2)
 Else
   StockGrowthScore = -WorksheetFunction.VLookup(-GrowthPercent, ScoreTable, 2)
 End If

 StockGrowthScore = Application.Round(StockGrowthScore, 3)

End Function

在自动计算模式下,当UDF公式在公式中明确引用的范围内发生更改时,将重新计算UDF公式。在您的例子中,
范围(“SharePriceGrowthTable”)
在代码中引用,但在公式中没有引用

一种可能的解决方法是将范围本身作为UDF的参数:

Function StockGrowthScore(GrowthPercent As Double, tbl as Range) As Double

现在,在公式中显式地传递范围
SharePriceGrowthTable
第二个参数。

问题在于在函数中设置范围。一种解决方案是将范围作为参数传递:

Function StockGrowthScore(GrowthPercent As Double, ScoreTable As Range) As Double
    If GrowthPercent >= 0 Then
        StockGrowthScore = WorksheetFunction.VLookup(GrowthPercent, ScoreTable, 2)
    Else
        StockGrowthScore = -WorksheetFunction.VLookup(-GrowthPercent, ScoreTable, 2)
    End If

    StockGrowthScore = Application.Round(StockGrowthScore, 3)
End Function
(称为like
=StockGrowthScore(1,SharePriceGrowthTable)

如果所有内容都在同一个工作表中,另一个解决方案是生成函数,尽管由于使用应用程序的开销,第一个选项可能更好。Volatile:

Function StockGrowthScore(GrowthPercent As Double) As Double
    Application.Volatile
    Dim ScoreTable As Range
    Set ScoreTable = Range("SharePriceGrowthTable")

    If GrowthPercent >= 0 Then
        StockGrowthScore = WorksheetFunction.VLookup(GrowthPercent, ScoreTable, 2)
    Else
        StockGrowthScore = -WorksheetFunction.VLookup(-GrowthPercent, ScoreTable, 2)
    End If

    StockGrowthScore = Application.Round(StockGrowthScore, 3)
End Function

是否从“SharePriceGrowthTable”范围内调用该函数?否,该范围位于名为“Tools”的工作表中,该函数是从同一工作簿中的多个其他工作表调用的。fwiw-该方法仅适用于单个工作表计算;如果没有更大的evenet处理代码,就不能进行工作簿范围的计算处理。@Jeeped-很好(我很少跨多个工作表工作)。编辑,嗯?Application.Volatile与多个工作表有什么关系?对我来说,引用不同的工作表很好。@charleswillams-很有趣。我相信链接的MSDN文档中说的“只要在工作表的任何单元格中出现此函数,就会重新计算该函数。”MSDN有时在表示工作簿时会说“工作表”。可能是Excel版本3的遗留问题,或者只有一个工作表时。