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