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

Posted

技术标签:

【中文标题】VBA - 通过用户定义的函数更新其他单元格【英文标题】:VBA - Update Other Cells via User-Defined Function 【发布时间】:2012-09-19 19:43:46 【问题描述】:

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

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

当我引发自定义事件并尝试写入单元格时,我收到 #Value 错误。另一方面,应用程序事件,例如 Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range) 可以写入单元格。

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

【问题讨论】:

修改单元格范围是什么意思?你到底想做什么? 你说的函数不能做到这一点是什么意思 函数不能修改单元格,对吗?它们只能返回值,但是当我们希望函数执行实际修改单元格时,我们通过从可以写入单元格的 App_SheetChange 之类的应用程序事件中获得帮助来发挥作用。现在,我想使用我自己的事件(比如 PrintGrid)而不是使用应用程序事件,但我的测试显示自定义事件处理程序在尝试修改 Excel 单元格时会引发错误。所以我的问题 - 是否可以从使用 RaiseEvent 的函数手动触发的自定义事件处理程序修改 excel 单元格 我想说 VBA 函数可以以任何你想要的方式修改单元格。同样,modify cell range on Excel 是什么意思?您想对单元格范围做什么?请描述您想做什么,如果您真的需要,我们会处理这些事件(听起来过于复杂)。 @DanielCook 从工作表调用的 UDF 可以修改工作表 - 但它很复杂。 ***.com/a/8711582/641067 【参考方案1】:

这是一种可以绕过约束的方法,你必须间接地做到这一点。方法复制自Excel - How to fill cells from User Defined Function?:

在标准模块中:

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 会更新公共变量,然后从 Worksheet_Calculate 事件中读取这些变量以执行...任何您喜欢的操作。

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

【讨论】:

感谢丹尼尔和大家。我使用了类似的方法,但没有使用 Workseet_calculate,而是使用了 App_SheetChange,它将查找函数完成事件(单元格 A4 为 True),然后读取全局变量并显示在 Excel 网格上。这很好用,但我想拥有我自己的事件,比如 PrintGrid(通过使用 Event 关键字并由 RaiseEvent 引发),但事件处理程序在写入单元格范围时出错......所以我的任务 - 所以我的问题 - 是可以使用 RaiseEvent 从 UDF 手动触发的自定义事件处理程序修改 excel 单元格?【参考方案2】:

如果在您的 UDF 函数中使用 Application.Evaluate 方法调用其他函数 您可以更改工作表上的所有内容(值、钢等),因为 VBA 不知道调用了哪个函数。

例子:

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

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

【讨论】:

你能再解释一下吗? 示例:Sub UDFfunction() Dim s As string s="Text" Evaluate "otherfunc(""" & s & """)" End Sub Function c() End Function ---- ------------ Public Function otherfunc(ByVal str As String) ActiveSheet.Cells(1, 1).Value = str End Function ---------------活动表单元格“A1”值将是“文本” 这是最好的答案,因为它可以在不依赖其他事件触发的延迟操作的情况下完成这项工作。

以上是关于VBA - 通过用户定义的函数更新其他单元格的主要内容,如果未能解决你的问题,请参考以下文章

VBA用户定义函数中的复制/过去特殊单元格格式

VBA:在用户定义的函数中创建单元格注释

VBA用户定义的函数来复制单元格的值,文本形成和超链接?

Excel VBA 用户定义函数,用于计算具有条件格式的单元格

Excel VBA 用户定义函数:在工作表函数中获取单元格被调用

excel vba如何将选中的不连续单元格赋值到数组