Excel UDF для указания строки таблицы и имени по имени - PullRequest
0 голосов
/ 08 ноября 2018

Учитывая таблицу Excel, такую ​​как та, что на изображении ниже

enter image description here

Я знаю, как использовать 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

, который можно назвать следующим образом, для полуреалистичного примера, где столбцы - это конкретные модели ЦП, а строки - параметры uarch.

Cache_Size_in_Bytes = TRC(Cache_Param_Table,"Line_Size","Pentium4")

или помещены в формулку в ячейку типа

= TRC(Cache_Param_Table,"Line_Size","Pentium4")

К сожалению, мне не удалось заставить что-либо работать.

Помощь?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Ты имеешь в виду что-то подобное? Я бы посоветовал использовать более описательное имя функции.

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

enter image description here

0 голосов
/ 08 ноября 2018

Это должно работать

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
...