2017-02-13 13 views
2

У меня есть различные таблицы настроек в Excel, каждая с двумя заголовками столбцов Параметр и значение.Как передать имя таблицы функции в Excel

Я хочу передать имя конкретной таблицы функции getParameter, которая просматривает имя конкретного параметра в этой таблице, возвращает значение связанного параметра и выполняет всю обработку ошибок, например. со следующим сегментом кода:

Function getParameter(.... 
... 
Dim paramterValue as Variant 
With Application 
    parameterValue = .Index([tableName[Value], .Match("parameterName", [tableName[Parameter], 0)) 
    If Not IsError(parameterValue) then 
     ... 
    Else 
     ... 
    End If 
End With 

End Function 

Как определить соответствующие аргументы функции и вызвать функцию?

ответ

1

Столы указаны в VBA по выбору ListObject Object. Но эти объекты находятся только в области рабочего листа. Поэтому мы должны знать рабочий лист, на который помещается таблица, чтобы получить его, используя wrksht.ListObjects(tableName).

Чтобы быть более гибким, мы могли бы с помощью Evaluate оценить структурированные ссылки:

Public Function getParameter(tableName As String, parameterName As Variant) as Variant 

Dim parameterValue As Variant 
Dim oRangeTValues As Range 
Dim oRangeTParameters As Range 

Set oRangeTValues = Evaluate("" & tableName & "[Value]") 
Set oRangeTParameters = Evaluate("" & tableName & "[Parameter]") 
With Application 
    parameterValue = .Index(oRangeTValues, .Match(parameterName, oRangeTParameters, 0)) 
    If Not IsError(parameterValue) Then 
     getParameter = parameterValue 
    Else 
     getParameter = CStr(parameterValue) 
    End If 
End With 

End Function 

Это будет использоваться на всех рабочих листов, так как имена таблиц в рабочей книге сферы в действительности.

Предполагается, что он используется как функция, определяемая пользователем, с использованием формулы ячейки, например =getParameter("TableName","Parameter").

+0

Вам нужно будет сделать это Volatile, потому что нет параметра, указывающего ссылку в таблице: лучше было бы передать ссылку в таблице вместо имени. –

+0

@Charles Williams: Да, может быть, это нужно установить неустойчивым в зависимости от его использования. Но вопрос был в точности как «Как передать имя таблицы функции?» а не «Как передать ссылку на таблицу для функции?» Для последнего нет 'VBA'. Этого можно добиться с помощью встроенной функции 'INDEX'. –

+0

@AxelR Thx для хорошего решения – Cyberpro

0

Постараюсь, как это, идентифицирующий лист и ListObject соответствующий вашему TableName:

Function getParameter(ByVal tableName As String, ByVal parameterName As String) As Variant 
Dim parameterValue As Variant 
Dim RgVal As Range 
Dim wS As Worksheet 
Dim LOTable As ListObject 

Application.Volatile 

Set wS = Evaluate(tableName).Parent 
Set LOTable = wS.ListObjects(tableName) 
Set RgVal = LOTable.DataBodyRange 

With Application.WorksheetFunction 
    parameterValue = .Index(RgVal.Columns(2), .Match(parameterName, RgVal.Columns(1), 0)) 
End With 'Application.WorksheetFunction 

If Not IsError(parameterValue) Then 
    getParameter = parameterValue 
Else 
    '... 
    DoEvents 
    getParameter = CStr(parameterValue) 
End If 

End Function 

вызова в VBA:

Sub test_GetParameter() 
    Debug.Print getParameter("Table1", "testParam") 
End Sub 

вызовов в Excel:

= getParameter("Table1", "testParam") 
+0

Вам нужно будет сделать это Volatile, потому что нет параметра, указывающего ссылку в таблице: лучше было бы передать ссылку в таблице вместо имени. –

+0

@CharlesWilliams: Не 'Set LOTable = wS.ListObjects (tableName)' достаточно, чтобы получить таблицу ref? – R3uK

+0

Да, но (при условии, что это используется как UDF), если вы не передадите ссылку на таблицу в качестве параметра, Excel не будет пересчитывать UDF при изменении данных в таблице. –

0

@ Код R3uk Axel Richter достаточно, но ваш тоже работает.

Смежные вопросы