通过代码打开Excel时UDF不更新值

时间:2018-06-29 13:27:29

标签: excel vba excel-vba user-defined-functions

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

我有一个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时,它将停止返回正确的结果。如果您保存文件并重新打开,则所有内容都会正确更新。

我似乎找不到解决办法。我以前曾问过这个问题,但第一个答复要求提供示例代码并否决了我的问题,几周后没有人试图回答我。我真的需要找出解决方案,所以我想再尝试一个新问题。

1 个答案:

答案 0 :(得分:0)

放入

application.volatile 

作为函数代码的第一行。交替使用或配合使用,

application.calculatefull 

在excel.application对象上。