Vba 通过代码打开Excel时,自定义项不更新值

Vba 通过代码打开Excel时,自定义项不更新值,vba,excel,user-defined-functions,Vba,Excel,User Defined Functions,我一直在尝试我为类似问题找到的解决方案,但似乎无法解决我的问题 我有一个Access数据库(Access 2016),它打开一个Excel电子表格(Excel 2016),进行计算。我还有一个Excel加载项文件,其中包含大量UDF。默认情况下,我总是在Excel中安装此加载项,它是我的配置文件启动脚本的一部分。但是,当Access通过代码打开Excel时,它无法识别外接程序(而自己打开Excel则可以)。因此,我添加了代码(根据其他论坛建议)在Excel打开后卸载并重新安装加载项。请参阅下面的

我一直在尝试我为类似问题找到的解决方案,但似乎无法解决我的问题

我有一个Access数据库(Access 2016),它打开一个Excel电子表格(Excel 2016),进行计算。我还有一个Excel加载项文件,其中包含大量UDF。默认情况下,我总是在Excel中安装此加载项,它是我的配置文件启动脚本的一部分。但是,当Access通过代码打开Excel时,它无法识别外接程序(而自己打开Excel则可以)。因此,我添加了代码(根据其他论坛建议)在Excel打开后卸载并重新安装加载项。请参阅下面的代码


Dim appExcel作为对象
作为字符串的Dim strpath
strpath=“H:\Folder\Calculator.xlsm”
设置appExcel=CreateObject(“Excel.Application”) appExcel.Workbooks.Open文件名:=strpath,UpdateLinks:=1,只读:=True
设置wbk=appExcel.ActiveWorkbook appExcel.AddIns.Add文件名:=“H:\Folder\AddInFile.xlam”
如果appExcel.AddIns(“AddInFile”).Installed=False,则 appExcel.AddIns(“AddInFile”).Installed=True 其他的 appExcel.AddIns(“AddInFile”).Installed=False appExcel.AddIns(“AddInFile”).Installed=True 如果
设置appExcel=Nothing
让我的UDF正常工作的唯一方法要求我进入包含这些函数之一的每个单元格并手动强制其重新计算(F2回车)。强制对整个工作表重新计算没有帮助。它必须是一个细胞一个细胞。公式“执行”,但结果不正确,直到我强制它们重新计算。下面是这样一个函数的示例。

    Function Nx(Age, table, Interest)
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
If Age > 120 Then NAge = 120 Else NAge = Age End If
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
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
N1(0) = Nn
For j = 1 To 120 N1(j) = N1(j - 1) - D1(j - 1) Next j
Na = N1(x1) - D1(x1) * (11 / 24) Nb = N1(x2) - D1(x2) * (11 / 24) Nx = ((1 - Fract) * Na) + (Fract * Nb)
End Function

函数Nx(年龄、表格、兴趣)
尺寸l(0至121)为双精度 尺寸D1(0至121)为双精度 尺寸N1(0至121)为双精度 双倍调暗v Dim NAge为双精度
如果年龄>120,则 NAge=120 其他的 NAge=年龄 如果
l(0)=9999.9999 v=1/(1+利息) D1(0)=l(0) Nn=D1(0) x1=Int(NAge) x2=Int(NAge)+1 分形=NAge-x1
对于j=1到120 l(j)=l(j-1)*(1-q(表,j-1)) D1(j)=l(j)*(v^j) Nn=Nn+D1(j) 下一个j
N1(0)=Nn
对于j=1到120 N1(j)=N1(j-1)-D1(j-1) 下一个j
Na=N1(x1)-D1(x1)*(11/24) Nb=N1(x2)-D1(x2)*(11/24) Nx=((1-分形)*Na)+(分形*Nb)
结束功能
此功能在任何其他情况下都能正常工作。但是,当您以编程方式打开Excel时,它将停止返回正确的结果。如果保存文件并重新打开,则所有内容都会正确更新

我似乎想不出一个解决办法。我以前问过这个问题,但第一次回答要求提供一个代码样本,然后否决了我的问题,几周后没有人试图回答我。我真的需要想出一个解决办法,所以我想我会用一个新问题再试一次。

Put

application.volatile 
作为函数代码的第一行。交替地或一致地使用

application.calculatefull 

在excel.application对象上。

尝试使其不稳定。使用UDF中的
Application.Volatile
作为第一行。在打开所需工作簿之前,请尝试加载加载项。在添加外接程序之前,您可能需要加载新的空白工作簿。如果以编程方式打开它,请在excel.application对象上使用application.calculatefull。通过自动化打开excel时,不会加载外接程序。您需要通过您的代码加载它们。顺便说一句,您不需要卸载和重新安装加载项:只需打开它,就像在access代码中启动Excel的普通工作簿一样。
application.calculatefull