在Excel中使用UDF来更新工作表

不是一个真正的问题,而是张贴这个评论,因为我不记得以前看到这种方法。 我回应了对先前答案的评论,并尝试了一些我以前没有尝试过的方式:结果很有意思,所以我尽pipe将其作为一个独立的问题发布,还有我自己的答案。

在SO(和许多其他论坛)上,有许多关于“我的用户定义的函数出了什么问题”的问题,答案是“你不能从UDF更新工作表” – 这里概述了这个限制:

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

有几种方法可以解决这个问题,例如https://sites.google.com/site/e90e50/excel-formula-to-change-the-value-of-another-cell ),但是我不要以为我的确切方法就是其中之一。

另请参阅: 更改来自UDF的单元格注释

张贴回应,所以我可以标记自己的“问题”有一个答案。

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

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 

如果您想要分享这个有趣的应用程序,请发布额外的答案。

注:未经任何真正的“生产”应用程序testing。

MSDN KB不正确。

它说

由工作表单元格中的公式调用的用户定义的函数不能更改Microsoft Excel的环境。 这意味着这样的function不能做到以下任何一项:

  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 

![在这里输入图片描述