【问题标题】:Excel UDF to specify Table Row and Col by NameExcel UDF 按名称指定表格行和列
【发布时间】:2018-11-08 07:08:58
【问题描述】:

给定一个如下图所示的 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")

不幸的是,我没有设法让任何工作。

帮助?

【问题讨论】:

  • 你的意思是rowName和colName是谁的值?
  • "rowName 和 colName 谁的值?" - 是的。更准确地说,我的意思是表格的单元格(作为参数 tbl 传递)。其列是 #Headers 行中具有字符串 colName 值的列,并且其行具有参数 rowName 的值作为 - 在本示例中 - 标题为“RowKey”的列的值。 // 扩展版本可能会传入要用于 RowKey 的列标题名称。
  • 听起来你可以在 tbl 上使用 index 并匹配 rowName 和 colName。这将返回您需要的行和列,从而返回值。
  • @QHarr - 是的,我在公式中同时使用了 VLOOKUP/MATCH 和 INDEX-MATCH。我只是无法将这些公式转换为 VBA。

标签: excel vba user-defined-functions


【解决方案1】:

你的意思是这样的?我建议使用更具描述性的函数名称。

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")

【讨论】:

    【解决方案2】:

    这应该可以工作

    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
    

    【讨论】:

    • 呃!有没有办法直接从UDF调用INDEX或者VLOOKUP,让代码对应公式? // 无论如何,不​​抱怨,我能理解你在做什么,虽然我还没有测试过。谢谢。这可能会成为公认的答案,但仍然!!!
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多