另一个工作簿中的更改会影响主工作簿中的 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 把一个工作簿中的表的数据传递到另一个工作簿中

Excel UDF 在已关闭的工作簿中引用表以进行查找

VBA:如果工作簿中的工作表名称等于从用户窗体中选择的组合框值,则复制该工作表并将其粘贴到另一个工作簿中

将单元格从一个工作表保存到另一个工作簿中的工作表 - 无需提示即可保存

将多个工作簿中的数据复制并自动化到现有的主工作簿中,而不会丢失使用 python 的格式