2012-07-17 66 views
0

我试图建立定义函数VLOOKUP_NAME(value, table, column_name)的Excel用户将实现:Excel的UDF的VLOOKUP(MATCH()),其使用结构化表引用

VLOOKUP(value, table, MATCH(column_name, table[#Headers], FALSE), FALSE) 

如何在VBA做到这一点? VBA似乎不接受像table[#Headers]这样的结构化参考。

另外,我也有兴趣了解将UDF作为UDF实现的性能结果。

此外,我这样做的原因是用更具可读性的公式替换一吨丑陋的公式。其他更好的建议,以实现这一目标,欢迎。

+0

你可以发布你正在使用的代码,具体在哪里,解释你卡住了? – JimmyPena 2012-07-17 13:57:00

+0

'table [#headers]'可能是'Array(“headerA”,“headerB”,“headerC”)'VBA – 2012-07-17 14:59:29

+0

@JimmyPena:在函数VLookup_Name(value,table,column_name)下,我尝试过:VLookup_Name = WorksheetFunction。 VLOOKUP(value,table,WorksheetFunction.MATCH(column_name,table [#Headers],FALSE),FALSE) – PonyEars 2012-07-17 18:08:23

回答

2

我不熟悉那种结构化的参考语法,但是您是否尝试过构建公式并使用工作表Evaluate()方法?

这里有一个简单的例子:

Function TestEval(s1 As String, s2 As String) 
    TestEval = Application.Caller.Parent.Evaluate(s1 & "/" & s2) 
End Function 

编辑:检查出整个结构表的事情之后,这似乎工作:

Function TableLookup(val, tbl As Range, colName As String) 
    Dim indx, rv 
    indx = Application.Match(colName, tbl.Rows(1).Offset(-1, 0), 0) 

    If Not IsError(indx) Then 
     rv = Application.VLookup(val, tbl, indx, False) 
     TableLookup = IIf(IsError(rv), "Not found", rv) 
    Else 
     TableLookup = "Col??" 
    End If 
End Function 
+0

“Application.FOO”将非常方便,没有知道这一点。并感谢完整的例子,与行()。偏移,很好! – PonyEars 2012-07-19 00:41:49