为什么 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
)。这可能会让您的用户感到困惑。
我想通过 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
)。这可能会让您的用户感到困惑。