另一个工作簿中的更改会影响主工作簿中的 UDF
Posted
技术标签:
【中文标题】另一个工作簿中的更改会影响主工作簿中的 UDF【英文标题】:Change in another Workbook impacts UDF in main Workbook 【发布时间】:2020-06-22 09:24:18 【问题描述】:我在 VBA 模块中开发了一个用户定义函数 (UDF),它可以用于其目的。 但是,当我在另一个打开的工作簿中更改与主工作簿完全无关的任何内容时,我的 mai 工作簿中使用此 UDF 的所有单元格值都将被删除。然后我必须让 Excel 再次计算这些单元格。
为什么会这样?我可以防止吗?我需要在该工作簿中进行这种“实时”计算。任何提示表示赞赏。
如果有帮助,请查看以下代码:
Private Function CalculateAcrossAmounts(iHeaderRow As Integer, rngRow As Range, Optional VolatileParameter As Variant) As Double
Call declareVariables
Application.Volatile
CalculateAcrossAmounts = 0
For i = iColStart To lngLastCol
If wsScopingMatrix.Cells(rngRow.Row, i) <> "" And wsScopingMatrix.Cells(rngRow.Row, i) <> 0 Then
CalculateAcrossAmounts = CalculateAcrossAmounts + 1
End If
Next i
End Function
编辑:子 DeclareVariables 的代码
Sub declareVariables()
Set wb = ThisWorkbook
Set wsScopingMatrix = wb.Sheets("GA_Scoping_Matrix")
Set wsMasterData = wb.Sheets("MasterData")
iColLabel = 1 'Spalte, wo TA/TR eingetragen wird
iRowCategory = 12 'Reihe, wo die Kategorien ausgewählt werden
iRowHeader = 13 'Reihe wo die Header (Entities) sind
iColStart = 11 '9
iColxGroupMateriality = 6
dblGroupMateriality = wsScopingMatrix.Range("rngGroupMateriality")
lngLastRow = getLastRow(wsScopingMatrix, 2)
lngLastCol = getLastCol(wsScopingMatrix, iRowHeader)
For i = 1 To lngLastRow
If wsScopingMatrix.Cells(i, iColLabel) = "TA" Then iRowTA = i
If wsScopingMatrix.Cells(i, iColLabel) = "TR" Then iRowTR = i
If wsScopingMatrix.Cells(i, iColLabel) = "OB" Then iRowOB = i
Next i
clrZentralGepruefterAccount = wsMasterData.Range("A3").Interior.Color
clrFullScopeAudit = wsMasterData.Range("A4").Interior.Color
clrAuditOfAccountBalance = wsMasterData.Range("A5").Interior.Color
clrSpecifiedAuditProcedures = wsMasterData.Range("A6").Interior.Color
clrHighlightBenchmarkAccount = wsMasterData.Range("A11").Font.Color
End Sub
在另一个工作簿中更改之前:
在另一个工作簿中更改后:
【问题讨论】:
declareVariables
的代码是什么?
@Rory 在我的帖子中查看编辑。
我看不到那里的代码有任何明显的问题。当函数重新计算时,您是否已调试检查 source 单元格的值是什么?
我想到了你的问题,还有另一个 UDF 会影响那个 UDF,我没有明确指定单元格的工作表。我找到了问题!
【参考方案1】:
每次Excel计算都会计算UDF函数。
如果the other workbook
中还有其他函数具有Application.Volatile
行,则这将是更改某些内容时的结果。
根据你的需要,你可以在需要避免这种行为的时候,使Application.Calculation = xlCalculationAutomatic
后跟Application.Calculation = xlCalculationAutomatic
...
【讨论】:
Application.Calculation = xlCalculationAutomatic 后跟一样吗? @smartini:不!仅在您需要摆脱计算中的“中断”之后... :) 但是,如果您的 UDF 函数针对的单元格已更改,则当计算再次变为自动时,结果将是相同的。该建议仅在必须临时进行一些更改并最终保留初始值的情况下才有效……但是我的回答不太合适。我没有注意到你的函数返回被修改的事实。我只是尝试解释一下重新计算的原因。以上是关于另一个工作簿中的更改会影响主工作簿中的 UDF的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python(和 DataNitro)将单元格从一个 Excel 工作簿中的特定工作表复制到另一个 Excel 工作簿中的特定工作表
VBA:如果工作簿中的工作表名称等于从用户窗体中选择的组合框值,则复制该工作表并将其粘贴到另一个工作簿中