在Excel中使用UDF更新工作表

Tim*_*ams 63 excel vba

这不是一个问题,而是发布此评论,因为我不记得以前看过这种方法.我回答了对之前回答的评论,并尝试了以前我没有尝过的事情:结果很有趣所以我虽然把它作为一个独立的问题发布,但我自己的回答.

在SO(以及许多其他论坛)上出现了许多关于"我的用户定义函数有什么问题"的问题,答案是"你无法从UDF更新工作表" - 这里的限制:

Excel中自定义函数的限制说明

有一些方法可以解决这个问题,例如,请参阅此处(https://sites.google.com/site/e90e50/excel-formula-to-change-the-value-of-another-cell)但我不要以为我的确切方法就在其中.

另请参阅:从UDF更改单元格注释

Tim*_*ams 54

发布回复,以便我可以将自己的"问题"标记为有答案.

我已经看到了其他的解决方法,但这似乎更简单,我很惊讶它的工作原理.

Sub ChangeIt(c1 As Range, c2 As Range)
    c1.Value = c2.Value
    c1.Interior.Color = IIf(c1.Value > 10, vbRed, vbYellow)
End Sub


'########  run as a UDF, this actually changes the sheet ##############
' changing value in c2 updates c1...
Function SetIt(src, dest)

    dest.Parent.Evaluate "Changeit(" & dest.Address(False, False) & "," _
                        & src.Address(False, False) & ")"

    SetIt = "Changed sheet!" 'or whatever return value is useful...

End Function
Run Code Online (Sandbox Code Playgroud)

如果您有想要分享的有趣应用程序,请发布其他答案.

注意:在任何类型的真实"生产"应用程序中未经测试.

  • 有谁知道*为什么*这有效?我的意思是认真,这是巫术. (8认同)
  • 我可以设想的一个警告是创建无限计算循环的可能性,其中此方法用于修改或创建单元格中的值或公式.这可以想象地重新启动计算周期等等.这可能不被系统识别(和停止)作为循环引用; 因此崩溃指出.类似于在自身上运行的事件宏(例如*Worksheet_Change*).故事的道德:如果你试图覆盖*'设计行为'*,接受随之而来的任何限制. (7认同)

Sid*_*out 15

MSDN KB不正确.

它说

由工作表单元格中的公式调用的用户定义函数无法更改Microsoft Excel的环境.这意味着这样的功能不能执行以下任何操作:

  1. 在电子表格中插入,删除或格式化单元格.
  2. 更改另一个单元格的值.
  3. 移动,重命名,删除或向工作簿添加工作表.
  4. 更改任何环境选项,例如计算模式或屏幕视图.
  5. 将名称添加到工作簿.
  6. 设置属性或执行大多数方法.

在下面的代码中,您可以轻松地看到第1,2,4和5点.

Function SetIt(RefCell)
    RefCell.Parent.Evaluate "SetColor(" & RefCell.Address(False, False) & ")"
    RefCell.Parent.Evaluate "SetValue(" & RefCell.Address(False, False) & ")"
    RefCell.Parent.Evaluate "AddName(" & RefCell.Address(False, False) & ")"

    MsgBox Application.EnableEvents
    RefCell.Parent.Evaluate "ChangeEvents(" & RefCell.Address(False, False) & ")"
    MsgBox Application.EnableEvents

    SetIt = ""
End Function

'~~> Format cells on the spreadsheet.
Sub SetColor(RefCell As Range)
    RefCell.Interior.ColorIndex = 3 '<~~ Change color to red
End Sub

'~~> Change another cell's value.
Sub SetValue(RefCell As Range)
   RefCell.Offset(, 1).Value = "Sid"
End Sub

'~~> Add names to a workbook.
Sub AddName(RefCell As Range)
   RefCell.Name = "Sid"
End Sub

'~~> Change events
Sub ChangeEvents(RefCell As Range)
    Application.EnableEvents = False
End Sub
Run Code Online (Sandbox Code Playgroud)

![在此处输入图像说明

  • 很好的回报;)显然MS的人没有为此做好准备.我也在为这些东西提出一个新的'vba-voodoo`标签 (5认同)
  • @MacroMan:"显然MS的人没有为此做好准备.虽然我能理解并接受这一点.我与这些人真正的关系是他们不认真对待MS Office的反馈意见.我不知道过去几年我在MSDN KB上留下了多少反馈,但没有一个被采取行动!就好像他们血腥不关心! (3认同)