我一直在尝试为类似问题找到的解决方案,但似乎无法解决我的问题。
我有一个Access数据库(Access 2016),它将打开一个进行计算的Excel电子表格(Excel 2016)。我也有一个包含大量UDF的Excel加载项文件。默认情况下,我始终在Excel中安装此加载项,它是我的配置文件启动脚本的一部分。但是,当Access通过代码打开Excel时,它无法识别加载项(而打开Excel本身可以工作)。因此,我添加了代码(根据其他论坛建议)以在Excel打开后卸载并重新安装该加载项。参见下面的代码。
Dim appExcel As Object
Dim strpath As String
strpath = "H:\Folder\Calculator.xlsm"
Set appExcel = CreateObject("Excel.Application")
appExcel.Workbooks.Open FileName:=strpath, UpdateLinks:=1, ReadOnly:=True
Set wbk = appExcel.ActiveWorkbook
appExcel.AddIns.Add FileName:="H:\Folder\AddInFile.xlam"
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
Set appExcel = Nothing
要使UDF正常工作,唯一的方法是进入包含这些功能之一的每个单元格,并手动强制其重新计算(F2-Enter)。强制对整个工作表进行重新计算无济于事。它必须是一个接一个的单元格。在强制执行重新计算之前,公式“执行”但结果不正确。下面是一个此类功能的示例。
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
此功能在任何其他情况下均可完美运行。但是,当您以编程方式打开Excel时,它将停止返回正确的结果。如果您保存文件并重新打开,则所有内容都会正确更新。
我似乎找不到解决办法。我以前曾问过这个问题,但第一个答复要求提供示例代码并否决了我的问题,几周后没有人试图回答我。我真的需要找出解决方案,所以我想再尝试一个新问题。
答案 0 :(得分:0)
放入
application.volatile
作为函数代码的第一行。交替使用或配合使用,
application.calculatefull
在excel.application对象上。