打开两个工作簿时引用工作簿中的公式会错误地填充数据
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
现在每个函数都会引用它自己的模块。
在 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
现在每个函数都会引用它自己的模块。