2016-01-01 4 views
0

Я написал этот простой UDF для расчета в электронных таблицах Excel. Код работает нормально, но только один раз. Однако, если я изменяю значения в таблице (SharePriceGrowthTable), результаты в ячейках не обновляются. Даже когда я нажимаю F9 для пересчета листа, значения в ячейках, где используется функция, не обновляются. Я подтвердил, что для параметра «Расчет» установлено значение «Автоматически».Ячейки, использующие UDF в Excel, не перерасчитываются

Любые идеи о том, что происходит или что мне нужно делать другим?

'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 
+0

Является ли функция вызываемой изнутри диапазона «SharePriceGrowthTable»? – Comintern

+0

Нет, диапазон находится в листе с именем «Инструменты», и функция вызывается из нескольких других листов в одной книге. –

ответ

0

В автоматическом режиме вычисления, А ОДС формула пересчитывается, когда изменение происходит в диапазоне, который он ссылается явно в формуле. В вашем случае ссылка Range("SharePriceGrowthTable") указана в коде, но не в формуле.

Возможный обходной путь, чтобы сделать сам по себе диапазон параметра в ОДС:

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

и теперь передать диапазон SharePriceGrowthTable явно второй параметр в формулах.

0

Проблема заключается в установке диапазона внутри функции. Одним из решений является передать диапазон в качестве параметра:

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 

(Called как =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 
+1

fwiw - Свойство [Application.CutCopyMode] (https://msdn.microsoft.com/en-us/library/office/ff839532.aspx) [Application.Volatile] (https://msdn.microsoft.com/ en-us/library/office/ff195441.aspx) метод применим только к единому расчету листа; а не простое управление калькуляцией без большого кода обработки штриховки. – Jeeped

+0

@ Jeeped - Хорошая точка (я редко работаю с несколькими листами). Ред. – Comintern

+0

А? Что Application.Volatile имеет отношение к нескольким листам? Хорошо работает со ссылками на разные рабочие листы для меня. –

Смежные вопросы