2012-07-17 63 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