【问题标题】:User Defined Function to VLookup into Closed Workbook用户定义的函数来 VLookup 到已关闭的工作簿
【发布时间】:2015-08-03 08:41:15
【问题描述】:

我正在尝试将vlookup 的用户定义函数创建到我机器上一个已关闭的工作簿中。以下函数在 VBA 中测试时有效,但在尝试使用该函数时,我在 Excel 中收到 #VALUE 错误。对此有什么想法吗?我相信我也许可以使用 VBA Evaluate 函数来提供帮助,但到目前为止还没有运气。

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 中对此进行测试,该代码返回我期望的值:

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

不过,这在 Excel 本身中不起作用。我在网上找到了一个"pull" UDF,它似乎做了类似的事情,但为了我的目的修改它没有成功。

【问题讨论】:

  • 那些 Select Case 值是否是已关闭 CUSIP_Map 工作表第 1 行的列标题标签?
  • @Jeeped 是的,这些是列标题

标签: vba excel


【解决方案1】:

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

编辑#1:

  • 确保 UDF 在标准模块中。
  • 在模块的最顶部包括Public wbk as Workbook
  • 在工作簿代码区创建工作簿打开事件宏以打开辅助工作簿并初始化wbk

【讨论】:

  • 有一些解决方法吗?例如,我尝试修改此 pull UDF(发布 numbermonger.com/2012/02/11/…),该 UDF 旨在从已关闭的工作簿中访问数据,但至今未成功。
  • 我会在 UDF()外部打开工作簿
  • 对不起,你能举个例子吗?我对 VBA 有点陌生。
  • @nsw 查看我的EDIT#1
  • "在工作簿代码区域中创建工作簿打开事件宏以打开辅助工作簿并初始化 wbk" 这不是我对以下代码所做的吗?设置 wbk = Workbooks.Open("C:\CUSIP_Map.xlsx")
【解决方案2】:

好的,由于Gary's Student 已经提出了限制,您可能需要完全重新考虑UDF 的想法。使用已关闭 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 选择案例,而是由第一行列标题的 MATCH function 或硬编码的 LOOKUP function 确定文本和列号。请注意,LOOKUP 的值按升序排列,并且它可能没有 MATCH 那么多的错误控制,因为它会尝试部分匹配。 IFERROR function 作为包装器可以在 MATCH 错误时返回“Invalid DataField”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多