首页 > 解决方案 > 引用另一个工作表的 VBA 自定义函数在编辑器中正确运行,但从工作表调用时不会执行

问题描述

我有一个自定义函数来执行一些任务,但它似乎在设置引用的工作簿的开始处停止。当我从 VBA 编辑器调用该函数时,它工作得很好。当我从工作表中调用该函数时,它不起作用。真实代码如下:

Function getAF(MCID As Variant) As String

Dim wb As Workbook
Dim ws As Worksheet

Set wb = Workbooks.Open(CreateObject("Scripting.FileSystemObject").GetParentFolderName(ActiveWorkbook.Path) & "\Investment_Prioritisation_Utility.xlsm")
Set ws = wb.Worksheets("assetHierachy")

lastrow = ws.Cells(Rows.Count, "F").End(xlUp).Row
inarr = Range(ws.Cells(5, Columns("D").Column), ws.Cells(lastrow, Columns("F").Column))
Searchfor = MCID

On Error GoTo eh
For i = 1 To lastrow
 If inarr(i, UBound(inarr, 2)) = Searchfor Then
  getAF = inarr(i, 2)
  Exit For
 End If
Next i

If IsNumeric(getAF) Then
    getAF = "AF" & getAF
Else
End If
Done:
    Exit Function
eh:
    getAF = "-"
End Function

在调试过程中,我将问题简化为以下代码示例,但输入和输出声明保持不变:

Function getAF(MCID As Variant) As String
Dim wb As Workbook
Dim ws As Worksheet

Set wb = Workbooks.Open(CreateObject("Scripting.FileSystemObject").GetParentFolderName(ActiveWorkbook.Path) & "\Investment_Prioritisation_Utility.xlsm")
Set ws = wb.Worksheets("assetHierachy")

return ws.Cells(1, 1)

任何帮助将不胜感激!

标签: excelvbaexcel-formula

解决方案


Caller当它是一个单元格时,您无法从 UDF 打开工作簿。从 VBA 中调用时,它可以工作。

不允许在工作表单元格中使用的 UDF 更改工作表的结构。这意味着 UDF 不能将值返回给使用它的单元格以外的任何其他单元格,并且它不能更改单元格的物理特征,例如字体颜色或背景图案。此外,UDF 不能执行复制或移动电子表格单元格等操作。他们甚至不能执行一些暗示光标位置改变的动作,例如编辑 -> 查找。UDF 可以调用另一个函数,甚至是子例程,但该过程将受到与 UDF 相同的限制。仍然不允许更改工作表的结构

(Excel 2003 VBA 程序员参考,第 22 页,Wiley Publishing, Inc)

作为一种解决方法,您可以使用事件回调从 VBA 中触发此函数,例如Worksheet_Change(例如)


推荐阅读