Events VBA-通过用户定义的函数更新其他单元格

Events VBA-通过用户定义的函数更新其他单元格,events,vba,excel,handlers,Events,Vba,Excel,Handlers,我在VBA中有一个UDF(用户定义函数),需要在Excel中修改单元格范围 由于UDF无法做到这一点,我尝试使用事件调用 当我引发一个自定义事件并尝试写入单元格时,我得到#Value error。另一方面,应用程序事件,例如 Private Sub-App\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)可以写入单元格 我的问题是如何通过调用UDF来更新其他单元格?这里有一种方法可以绕过限制,您必须间接地这样做。方法复制自: 在标准模块中: Public

我在VBA中有一个UDF(用户定义函数),需要在Excel中修改单元格范围

由于UDF无法做到这一点,我尝试使用事件调用

当我引发一个自定义事件并尝试写入单元格时,我得到#Value error。另一方面,应用程序事件,例如
Private Sub-App\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)
可以写入单元格


我的问题是如何通过调用UDF来更新其他单元格?

这里有一种方法可以绕过限制,您必须间接地这样做。方法复制自:

在标准模块中:

Public triggger As Boolean
Public carryover As Variant
Function reallysimple(r As Range) As Variant
    triggger = True
    reallysimple = r.Value
    carryover = r.Value / 99
End Function
在工作表代码中:

Private Sub Worksheet_Calculate()
    If Not triggger Then Exit Sub
    triggger = False
    Range("C1").Value = carryover
End Sub
这可以扩展为您的目的。基本上,UDF会更新公共变量,然后从
工作表\u Calculate
事件中读取这些变量来执行。。。你喜欢什么都行


另一个更复杂的方法是从函数中编写一个vbscript文件,该文件将尝试自动化Excel并通过Shell运行它。但是,我上面列出的方法更可靠。

如果使用
应用程序调用其他函数,请在UDF函数中评估
方法
您可以更改图纸上的所有内容(值、钢等),因为VBA不知道调用哪个函数

例如:

Sub UDFfunction()
  Evaluate "otherfunc(""abc"")"
End Sub

Public Function otherfunc(ByVal str As String)
  ActiveSheet.Cells(1, 1).Value = str
End Function

修改单元格范围是什么意思?你到底想做什么?函数不能做什么?函数不能修改单元格,对吗?它们只能返回值,但当我们希望函数执行实际修改单元格时,我们会通过从应用程序事件(如可以写入单元格的App_SheetChange)中获取帮助来耍把戏。现在,我想使用我自己的事件(比如PrintGrid),而不是使用应用程序事件,我使用Event关键字创建了这些事件,但是我的测试表明,自定义事件处理程序在尝试修改excel单元格时会抛出错误。所以我的问题是,是否可以从自定义事件处理程序中修改excel单元格,这些自定义事件处理程序是使用RaiseEvent从函数手动触发的?我会说VBA函数可以以任何方式修改单元格。同样,在Excel上修改单元格范围是什么意思?您想对单元格范围做什么?请描述你想做什么,如果你真的需要,我们会去参加活动(听起来太复杂了)。@DanielCook从工作表中调用UDF可以修改工作表,但它很复杂。谢谢丹尼尔和大家。我使用了类似的方法,但没有使用Workeet_calculate,而是使用App_SheetChange,它将查找函数完成事件(单元格A4变为True),然后读取全局变量并显示在Excel网格上。这非常好用,但我希望有自己的事件,比如PrintGrid(通过使用event关键字和RaiseEvent引发)但是,事件处理程序在写入单元格区域时出错..因此,我的questin-我的问题-是否可以从自定义事件处理程序中修改excel单元格,这些自定义事件处理程序是使用RaiseEvent从UDF手动触发的?您是否可以再解释一点?例如:Sub udfffunction()Dim s As string s=“Text”Evaluate”otherfunc(“&s&”)结束子函数c()结束函数------------------公共函数otherfunc(ByVal str作为字符串)ActiveSheet.Cells(1,1)。Value=str结束函数--------活动工作表单元格“A1”的值将是“Text”,这是最好的答案,因为它不依赖于由其他事件触发的延迟操作来完成任务。