我在 VBA 中有一个 UDF(用户定义函数),需要修改 Excel 上的单元格范围。
由于 UDF 无法做到这一点,我尝试使用事件调用。
当我引发自定义事件并尝试写入单元格时,我收到 #Value 错误。另一方面,诸如
Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
可以写入单元的应用程序事件。
我的问题是如何通过调用 UDF 来更新其他单元格?
这是一种可以规避约束的方法,你必须间接地做到这一点。从 Excel 复制的方法- 如何从用户定义的函数中填充单元格?:
在标准模块中:
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 运行它。但是,我上面列出的方法要可靠得多。
如果使用 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