打开两个工作簿时引用工作簿中的公式会错误地填充数据

Refereshing formula in workbook when two workbooks are open fills data in incorrectly

excel 2016/excel 365 中共享用户公式名称的工作簿存在问题。 我打开了两个工作簿,它们都指定了一个用户函数 GetData。 此函数在两个工作簿中都有定义,而不是 public。 让我们使用工作簿 1 和工作簿 2。

我使用 ctrl-shift-alt-F9 刷新工作簿 1 中的所有公式 工作簿 1 中使用用户定义函数的所有单元格都会正确更新。 使用工作簿 2 中的自定义函数的所有单元格都使用工作簿 1 中的数据进行更新。

如果在工作簿 2 中使用 ctrl-shift-alt-F9,问题就会逆转。

如果我通过选择并按回车键分别更新每个单元格,那么该单元格将使用正确的数据。只有当我强制 excel 更新公式时才会出现问题,这是获取多个公式更新的唯一方法。

我已确保 none 我的数据表已定义 public,我的函数未定义 public。

两张表完全相同,使用相同的代码,但数据不同。

这是 ThisWorkBook 中的代码

Sub workbook_Open()
    If Worksheets("Background").Cells(1, 1).Value = 1 Then
        'Define worksheets for use in workbook'

Dim PersonData As Worksheet:

Set PersonData = Worksheets("Person")

CreateTableReference PersonData, "PersonDataTable"


    End If
End Sub

这是模块中的代码

Function TableExistsOnSheet(ws As Worksheet, sTableName As String) As Boolean
    TableExistsOnSheet = ws.Evaluate("ISREF(" & sTableName & ")")
End Function

Sub CreateTableReference(ws As Worksheet, sTableName As String)
    If TableExistsOnSheet(ws, sTableName) Then
        ws.ListObjects(sTableName).Unlist
    End If

    If ws.Cells(1, 1).Value <> "" Then
        xLastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
        xLastRow = ws.Cells(ws.Columns.Count, 1).End(xlUp).Row
        ws.ListObjects.Add(xlSrcRange, ws.Range(ws.Cells(1, 1), ws.Cells(xLastRow, xLastCol)), , xlYes).Name = sTableName
    End If

End Sub

Function GetData(dataType As String, fieldName As String) As String
Application.Volatile
    Select Case dataType
    Case "PersonData"
            GetData = WorksheetFunction.VLookup(fieldName, Range("PersonDataTable"), 3, False)
    End Select

End Function

使用示例

=GetData("PersonData","Surname")

预期的结果是当按下 ctrl-shift-alt-F9 时,每个工作簿都使用其自身工作簿中的数据使用公式的结果正确更新。

Worksheet Person 有示例数据

Data    Desription  Value
Surname Surname Thomas

my functions are not defined publicly

即使您没有使用 Public 这个词,您在模块中的功能仍然是 public。也就是说,它们在包含该模块的项目中可用,也可用于其他应用程序或项目。

你可能想看看这个Function statement

在其他 Excel Applications/Projects 中有相同函数名称的情况下,我建议使用 Option Private Module

你可能想看看Option Private statement

因此第一个文件中的代码将是

Option Private Module

Function Sample()
    MsgBox "Blah"
End Function

而另一个是

Option Private Module

Function Sample()
    MsgBox "Blah Blah"
End Function

现在每个函数都会引用它自己的模块。