Я пробовал решения, которые нашел для похожих вопросов, но, похоже, не помогло решить мою проблему.
У меня есть база данных 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 программно, он перестает возвращать правильные результаты. Если вы сохраните файл и снова откроете его, все обновится правильно.
Я не могу найти решение. Ранее я задавал этот вопрос, но в первом ответе был запрошен образец кода, и я проголосовал за мой вопрос, и через несколько недель никто не попытался ответить мне. Мне действительно нужно найти решение этой проблемы, поэтому я решил попробовать еще раз с новым вопросом.