Excel自定义项按名称指定表格行和列
给定一个Excel表格,如下图所示 我知道如何使用VLOOKUP和MATCH访问数据元素,使用行和列的“符号名”——后者的列名,前者的搜索键 至少,我知道如何在Excel公式中实现这一点Excel自定义项按名称指定表格行和列,excel,vba,user-defined-functions,Excel,Vba,User Defined Functions,给定一个Excel表格,如下图所示 我知道如何使用VLOOKUP和MATCH访问数据元素,使用行和列的“符号名”——后者的列名,前者的搜索键 至少,我知道如何在Excel公式中实现这一点 =VLOOKUP("RowA",Table2,MATCH("ColA",Table2[#Headers],0)) 但这是相当冗长的 我想把它缩写为UDF(用户定义函数) (TRC代表“表格行-列”) 骷髅 Function TRC(tbl As Range, rowName, colName) 'in
=VLOOKUP("RowA",Table2,MATCH("ColA",Table2[#Headers],0))
但这是相当冗长的
我想把它缩写为UDF(用户定义函数)
(TRC代表“表格行-列”)
骷髅
Function TRC(tbl As Range, rowName, colName)
'in Table tbl,
'looks up value whose row key is rowVal,
'and whose column heading is colVal
...
End Function
对于一个半现实的示例,可以这样调用,其中列是特定的CPU模型,行是uarch参数
Cache_Size_in_Bytes = TRC(Cache_Param_Table,"Line_Size","Pentium4")
或者把它放在一个像
= TRC(Cache_Param_Table,"Line_Size","Pentium4")
不幸的是,我还没有设法使任何工作
帮助?这应该可以
Function TRC(tbl As Range, rowName, colName)
aRow = -1
aColumn = -1
For j = 1 To tbl.Rows.Count
If tbl.Cells(j, 1) = rowName Then aRow = j
Next j
For k = 1 To tbl.Columns.Count
If tbl.Cells(1, k) = colName Then aColumn = k
Next k
If (aRow = -1) Or (aColumn = -1) Then
TRC = "Error"
Else
TRC = tbl.Cells(aRow, aColumn)
End If
End Function
这应该行得通
Function TRC(tbl As Range, rowName, colName)
aRow = -1
aColumn = -1
For j = 1 To tbl.Rows.Count
If tbl.Cells(j, 1) = rowName Then aRow = j
Next j
For k = 1 To tbl.Columns.Count
If tbl.Cells(1, k) = colName Then aColumn = k
Next k
If (aRow = -1) Or (aColumn = -1) Then
TRC = "Error"
Else
TRC = tbl.Cells(aRow, aColumn)
End If
End Function
你是说像这样的?我建议使用更具描述性的函数名
Option Explicit
Public Sub test()
Dim table As ListObject
Set table = ThisWorkbook.Worksheets("Sheet2").ListObjects("table2")
Debug.Print TRC(table.Range, "RowA", "ColB")
End Sub
Public Function TRC(ByVal table As Range, ByVal rowName As String, ByVal colName As String) As Variant
TRC = Application.Index(table, Application.Match(rowName, table.Columns(1), 0), Application.Match(colName, table.Rows(1), 0))
End Function
您可以使用错误处理/可选返回值自定义函数,例如
Public Function TRC(ByVal table As Range, ByVal rowName As String, ByVal colName As String) As Variant
Dim ret As Variant
ret = Application.Index(table, Application.Match(rowName, table.Columns(1), 0), Application.Match(colName, table.Rows(1), 0))
If Not IsError(ret) Then
TRC = ret
Else
TRC = "Not found"
End If
End Function
在图纸使用中:
=TRC(Table2[#All],"RowA","ColB")
你的意思是这样的?我建议使用更具描述性的函数名
Option Explicit
Public Sub test()
Dim table As ListObject
Set table = ThisWorkbook.Worksheets("Sheet2").ListObjects("table2")
Debug.Print TRC(table.Range, "RowA", "ColB")
End Sub
Public Function TRC(ByVal table As Range, ByVal rowName As String, ByVal colName As String) As Variant
TRC = Application.Index(table, Application.Match(rowName, table.Columns(1), 0), Application.Match(colName, table.Rows(1), 0))
End Function
您可以使用错误处理/可选返回值自定义函数,例如
Public Function TRC(ByVal table As Range, ByVal rowName As String, ByVal colName As String) As Variant
Dim ret As Variant
ret = Application.Index(table, Application.Match(rowName, table.Columns(1), 0), Application.Match(colName, table.Rows(1), 0))
If Not IsError(ret) Then
TRC = ret
Else
TRC = "Not found"
End If
End Function
在图纸使用中:
=TRC(Table2[#All],"RowA","ColB")
您的意思是谁的值是rowName和colName?“谁的值是rowName和colName?”-是的。更准确地说,我指的是表的单元格(作为参数tbl传递),。其列是在#Headers行中具有字符串colName值的列,其行具有参数rowName的值,在本例中为标题为“RowKey”的列的值扩展版本可能会传入要用于行键的列标题名。听起来您可以在tbl上使用索引,并对rowName和colName使用match和match。这将返回您需要的行和列,从而返回值。@QHarr-是的,我在公式中使用了VLOOKUP/MATCH和INDEX-MATCH。我只是无法将这些公式转换为VBA。你的意思是谁的值是rowName和colName?“谁的值是rowName和colName?”-是的。更准确地说,我指的是表的单元格(作为参数tbl传递),。其列是在#Headers行中具有字符串colName值的列,其行具有参数rowName的值,在本例中为标题为“RowKey”的列的值扩展版本可能会传入要用于行键的列标题名。听起来您可以在tbl上使用索引,并对rowName和colName使用match和match。这将返回您需要的行和列,从而返回值。@QHarr-是的,我在公式中使用了VLOOKUP/MATCH和INDEX-MATCH。我只是无法将这些公式转换成VBA。啊!是否无法直接从UDF调用INDEX或VLOOKUP,从而使代码对应于公式?//无论如何,不要抱怨,我能理解你在做什么,尽管我还没有测试过。谢谢这可能成为公认的答案,但仍然!!!啊!是否无法直接从UDF调用INDEX或VLOOKUP,从而使代码对应于公式?//无论如何,不要抱怨,我能理解你在做什么,尽管我还没有测试过。谢谢这可能成为公认的答案,但仍然!!!