为什么 VBA UDF "Range.Formula =" 不起作用?

Why the VBA UDF "Range.Formula =" don't work?

我想通过 Range.Formula = 将公式从一个 cell/cells 复制到另一个 cell/cells。 但它并没有像预期的那样工作。

如果我 运行 一步一步地 VBA ,函数将在 Range.Formula = 结束而不会出错。

Function test1(sOURCE As Range, tARGET As Range)
    tARGET.Formula = sOURCE.Formula
    test1 = tARGET.Formula
End Function

这是设计限制。

因为 UDF 无法更改任何其他 cells/formulas。 UDF 只能 return 一个 到使用 UDF 的单元格。因此 tARGET.Formula = sOURCE.Formula 是不可能的。

test1 = tARGET.Formula将returntARGET的公式作为文本。它不会替换单元格中使用的公式,也不会计算公式。

您正在尝试使用 UDF 更改另一个单元格的公式。根据 Microsoft documentation this cannot be done, but Ryan Wells has actually found a nice workaround. See: How to change another cell with a VBA function UDF. Compare also: VBA: How to change the value of another cell via a function?

我们需要 Evaluate 对“辅助”潜艇使用。我对 Wells 提供的第一个示例进行了微调以适应您的需要:

Function copyFormula(copyFrom As Range, copyTo As Range)

copyFrom.Parent.Evaluate "copyOver(" & copyFrom.Address() _
                        & "," & copyTo.Address() & ")"
                        
copyFormula = "Formula " & copyFrom.Address() & " -> " & copyTo.Address()

End Function

Private Sub copyOver(copyFrom As Range, copyTo As Range)

copyTo.Formula = copyFrom.Formula
    
End Sub

这行得通,但请记住(有趣的是)插入后公式不会自动计算,即使计算设置为自动。实施:

结果:

解决此问题的一种方法是在您使用公式的作业sheet 中包含一个Worksheet_Change 子项。例如。简单地:

Private Sub Worksheet_Change(ByVal Target As Range)

Calculate

End Sub

但是 sheet 中的任何后续操作似乎都会触发计算。另外,请注意,当您使用此单元格时 copyFormula 将无法覆盖目标单元格。因为它会立即用公式覆盖它(如果不应用上述技巧,则输出 0 )。这可能会让您的用户感到困惑。