为了账号安全,请及时绑定邮箱和手机立即绑定

在Excel中使用UDF更新工作表

/ 猿问

在Excel中使用UDF更新工作表

在Excel中使用UDF更新工作表

这并不是一个问题,而是将此作为评论发布,因为我不记得以前见过这种方法。我对之前的一个答案做出了回应,并尝试了一些我以前从未尝试过的东西:结果很有趣,所以我想把它作为一个独立的问题,连同我自己的答案一起发布。

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

Excel中自定义函数的局限性描述

为了克服这一问题,已经描述了几种方法,例如,请参阅这里(https:/sites.google.com/site/e90e50/excel-公式-更改另一个单元格的值但我不认为我的确切方法就是其中之一。

另见:更改UDF中的单元格注释


查看完整描述

3 回答

?
一只斗牛犬

张贴一个回复,这样我就可以把我自己的“问题”标记为有答案了。


我已经看到了其他的解决办法,但这似乎更简单,我很惊讶它能起作用。


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

请张贴更多的答案,如果您有趣的申请,这是您想要分享的。


注:未经测试的任何一种真正的“生产”应用程序。


查看完整回答
反对 2019-06-19
?
翻过高山走不出你

这个MSDN KB是不正确的。

上面写着

由工作表单元格中的公式调用的用户定义函数无法更改MicrosoftExcel的环境。这意味着这种职能不能执行下列任何一项任务:

  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 redEnd 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 eventsSub ChangeEvents(RefCell As Range)
    Application.EnableEvents = FalseEnd Sub



查看完整回答
反对 2019-06-19
  • 3 回答
  • 0 关注
  • 285 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信