用户定义的functionVLOOKUP到closures的工作簿

我正在尝试创build一个用户定义的函数来vlookup我的机器上closures的工作簿。 下面的函数在VBA中testing时可以工作,但是当我尝试使用函数的时候,我在Excel中得到了#VALUE错误。 任何想法呢? 我相信我可以使用VBA Evaluatefunction来帮助,但到目前为止没有运气。

 Function CUSIP_Deal_Map(CUSIP As String, DataField As String) As Variant Dim colIndex As Integer ' for vlookup Dim invalidDataField As Boolean invalidDataField = False ' Switch statement, to transform from a "DataField" into a column number to be used in VLookUp Select Case DataField Case "Deal" colIndex = 2 Case "Class" colIndex = 5 Case "DealNum" colIndex = 6 Case "Vintage" colIndex = 11 Case "Pool" colIndex = 12 Case "Index" colIndex = 13 Case Else invalidDataField = True End Select 'Dim wbk As Workbook Set wbk = Workbooks.Open("C:\CUSIP_Map.xlsx") 'hard code location Dim VLU_data As Variant VLU_data = wbk.Application.WorksheetFunction.VLookup(CUSIP, Worksheets("CUSIP_Map").Range("A:M"), colIndex, False) 'vlookup data from "database" Call wbk.Close(False) 'close connection ' Return data If invalidDataField Then CUSIP_Deal_Map = "Invalid DataField" Else CUSIP_Deal_Map = VLU_data End If End Function 

在Excel中的预期用途是使用像=CUSIP_Deal_Map("123ABC","Deal")的公式

我可以在VBA中testing这个,使用这个代码,它返回我期待的值:

 Sub test() MsgBox CUSIP_Deal_Map("123ABC", "Deal") End Sub 

不过,这在Excel本身中不起作用。 我发现了一个“拉”UDF在线,似乎做了类似的事情,但没有成功修改它为我的目的。

这是因为从一个Sub中的UDF()调用可以打开一个文件,但是从工作表单元中调用的同一个UDF()不能。

编辑#1:

  • 确保UDF处于标准模块中。
  • 在这个模块的最顶端,包括Public wbk as Workbook
  • 创build工作簿打开工作簿代码区域中的事件macros以打开辅助工作簿并初始化wbk

好吧,由于Gary的学生已经有了这个限制,你可能想重新考虑UDF的想法。 使用closures的CUSIP_Map工作表的第一行中的Select Case语句中的值,这些标准工作表公式中的任何一个都可以执行。

 =VLOOKUP(A1, 'C:\[CUSIP_Map.xlsx]CUSIP_Map'!$A:$M, MATCH("Vintage", 'C:\[CUSIP_Map.xlsx]CUSIP_Map'!$1:$1, 0), FALSE) =VLOOKUP(A1, 'C:\[CUSIP_Map.xlsx]CUSIP_Map'!$A:$M, LOOKUP("Class", {"Class","Deal","DealNum","Index","Pool","Vintage"}, {5,2,6,13,12,11}), FALSE) 

A1的值将在CUSIP_Map的列A中查找。而不是VBA select的情况下,要返回的列由第一行列标题的MATCH函数或文本和列编号的硬编码的LOOKUP函数确定。 请注意,LOOKUP的值按升序排列,并且可能没有像MATCH那样多的错误控制,因为它会尝试部分匹配。 IFERROR函数作为包装可以在MATCH错误上返回“无效DataField”。