Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel自定义项按名称指定表格行和列_Excel_Vba_User Defined Functions - Fatal编程技术网

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

给定一个Excel表格,如下图所示

我知道如何使用VLOOKUP和MATCH访问数据元素,使用行和列的“符号名”——后者的列名,前者的搜索键

至少,我知道如何在Excel公式中实现这一点

=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,从而使代码对应于公式?//无论如何,不要抱怨,我能理解你在做什么,尽管我还没有测试过。谢谢这可能成为公认的答案,但仍然!!!