UDF не обновляет значение, когда Excel открывается через код - PullRequest
0 голосов
/ 29 июня 2018

Я пробовал решения, которые нашел для похожих вопросов, но, похоже, не помогло решить мою проблему.

У меня есть база данных Access (Access 2016), которая открывает электронную таблицу Excel (Excel 2016), которая выполняет расчеты. У меня также есть файл надстройки Excel, который содержит массу пользовательских функций. По умолчанию у меня всегда установлена ​​эта надстройка в Excel, и она является частью моего загрузочного скрипта профиля. Однако, когда Access открывает Excel через код, он не распознает надстройку (тогда как открытие Excel само работает). Поэтому я добавил код (в соответствии с другими предложениями на форуме) для удаления и переустановки надстройки после открытия Excel. См. Код ниже.

<code>
    Dim appExcel As Object
    Dim strpath As String<br>
    strpath = "H:\Folder\Calculator.xlsm"<br>
    Set appExcel = CreateObject("Excel.Application")
        appExcel.Workbooks.Open FileName:=strpath, UpdateLinks:=1, ReadOnly:=True<br>
    Set wbk = appExcel.ActiveWorkbook
        appExcel.AddIns.Add FileName:="H:\Folder\AddInFile.xlam"<br>
    If appExcel.AddIns("AddInFile").Installed = False Then
        appExcel.AddIns("AddInFile").Installed = True
    Else
        appExcel.AddIns("AddInFile").Installed = False
        appExcel.AddIns("AddInFile").Installed = True
    End If<br>
    Set appExcel = Nothing
Единственный способ заставить мои пользовательские функции работать правильно, требует, чтобы я вошел в каждую ячейку, содержащую одну из этих функций, и вручную заставил ее пересчитать (F2-Enter). Принудительный пересчет на весь лист не помогает. Это должно быть клетка за клеткой. Формулы «выполняются», но имеют неверные результаты, пока я не заставлю их пересчитать. Ниже приведен пример одной такой функции.
<code>
    Function Nx(Age, table, Interest)<br>
    Dim l(0 To 121) As Double
    Dim D1(0 To 121) As Double
    Dim N1(0 To 121) As Double
    Dim v As Double
    Dim NAge As Double<br>
    If Age > 120 Then
            NAge = 120
    Else
        NAge = Age
    End If<br>
    l(0) = 9999.9999
    v = 1 / (1 + Interest)
    D1(0) = l(0)
    Nn = D1(0)
    x1 = Int(NAge)
    x2 = Int(NAge) + 1
    Fract = NAge - x1<br>
    For j = 1 To 120
        l(j) = l(j - 1) * (1 - q(table, j - 1))
        D1(j) = l(j) * (v ^ j)
        Nn = Nn + D1(j)
    Next j<br>
    N1(0) = Nn<br>
    For j = 1 To 120
        N1(j) = N1(j - 1) - D1(j - 1)
    Next j<br>
    Na = N1(x1) - D1(x1) * (11 / 24)
    Nb = N1(x2) - D1(x2) * (11 / 24)
    Nx = ((1 - Fract) * Na) + (Fract * Nb)<br>
    End Function 
Эта функция отлично работает при любых других обстоятельствах. Однако, когда вы открываете Excel программно, он перестает возвращать правильные результаты. Если вы сохраните файл и снова откроете его, все обновится правильно.

Я не могу найти решение. Ранее я задавал этот вопрос, но в первом ответе был запрошен образец кода, и я проголосовал за мой вопрос, и через несколько недель никто не попытался ответить мне. Мне действительно нужно найти решение этой проблемы, поэтому я решил попробовать еще раз с новым вопросом.

1 Ответ

0 голосов
/ 29 июня 2018

Put,

application.volatile 

как первая строка кода вашей функции. Альтернативно или по согласованию, используйте,

application.calculatefull 

для объекта excel.application.

...