从单元格中引用不同文件中的范围的自定义Excel VBA函数(已修改的VLOOKUP)会导致错误

第一次我正在写一个stackoverflow问题,所以请让我知道如果我做错了什么。

我search了几个小时了,一直没有find解决我的问题(通常我find答案,为什么这是我使用stackoverflow几年后,作为一个潜伏者我的第一个问题)。

基本上我试图写一个VLOOKUP函数,其function类似于VLOOKUP,除了它返回的是“下一个最小的大”值而不是默认的“前一个最小的”值。 我意识到索引/匹配的方法,不幸的是我需要仔细地手动replace数千个VLOOKUPs,这些VLOOKUPs已经存在于我目前正在清理的工作簿中。 所以我决定编写一个VLOOKUPnew函数,这样我就可以用VLOOKUPnew“查找/replace”所有的VLOOKUP。

Function VLOOKUPnew(lookup_value As Variant, table_array As Range, _ col_index_num As Integer, Optional exactMatch As Boolean) As Variant Dim row As Integer Debug.Print table_array.Address With Application On Error GoTo NO_ROW row = .Match(lookup_value, table_array.Columns(1), 0) On Error GoTo 0 If row = -1 And Not exactMatch Then row = .Match(lookup_value, table_array.Columns(1), 1) row = row + 1 End If VLOOKUPnew = .index(table_array.Columns(col_index_num), row, 0) End With Exit Function NO_ROW: row = -1 Resume Next End Function 

而且我成功地写了这个函数,但遇到了一个麻烦。 因为我将“table_array”声明为Range,所以vba无法识别对其他工作簿的范围引用

例如“= VLOOKUPnew($ A432,'reallyLongFilepath / [filename.xlsx] tablename'!$ B $ 6:$ N $ 35,columnNumber,0),FALSE)”parsing为#VALUE错误

真正奇怪的是,如果我打开文件,那么文件path将退出公式(变成“= VLOOKUPnew($ A432,'[filename.xlsx] tablename'!$ B $ 6:$ N $ 35,columnNumber,0 ),FALSE)“),然后我的自定义函数工作正常返回正确的值。

所以我的问题是如何解决不必打开其他文件来使用此工作簿。 我甚至不知道Excel如何将地址或范围传递给自定义公式,所以当文件path包含在范围参考中时,我怀疑它是中断的。 有没有办法分割文件path,文件名,表单和地址(传入后)? 或者可能将其作为string传入,然后轻松分割? 或者将其作为能够正确识别不同工作簿中的范围的东西来传递它?

请记住,我试图避免改变函数的参数,因为我想要做查找/replace的技巧,这是为了工作,所以在数据布局上有太多的改变是克制的。 此外,该工作簿是为其他员工使用,我只是设置它的使用。

提前致谢!

安德鲁

你在这里面临相当的困境!

根本问题是,虽然VLOOKUP可以查看封闭的工作簿,但UDFRange参数不能。 范围参考parsing为一个错误,所以函数调用失败,types不匹配。 如果将table_array参数types更改为Variant并在函数头上放置一个中断,则会看到参数值为Error 2036

虽然有办法查看封闭的工作簿,但他们(AFAIK)都很慢。 既然你提到... I would need to carefully replace literally thousands of VLOOKUPs ...我怀疑沿着这些线路的任何解决scheme将是无法接受的缓慢。

我的build议是去INDEX/MATCH路线,写一个VBAmacros来为你做公式更新。