2017-02-13 5 views
2

Excelのさまざまな設定テーブルがあり、それぞれにパラメータと値という2つの列見出しがあります。Excelの関数にテーブル名を渡す方法

特定のテーブルの名前を、そのテーブル内の特定のパラメータの名前を検索し、関連するパラメータの値を返し、すべてのエラー処理を実行する関数getParameterに渡したいとします。

適切な関数引数を定義して関数を呼び出すにはどうすればよいですか?

答えて

1

表は、であり、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

テーブル参照を与えるパラメータがないため、この揮発性を作成する必要があります。名前ではなくテーブル参照を渡すほうがよいでしょう。 –

+0

@Charles Williams:はい、多分これはその使用法に応じて揮発性に設定する必要があります。しかし、問題はまさに「関数にテーブル名を渡す方法」でした。 「関数へのテーブル参照の受け渡し方法」ではありません。後者の場合、「VBA」は必要ありません。これは、Excelのネイティブ 'INDEX'機能を使用して実現できます。 –

+0

良い答えのための@AxelR Thx – Cyberpro

0

私はあなたのTableNameに対応するシートとListObjectを識別し、このようにみます:VBAでの

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 

コール:Excelで

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

コール:

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

テーブルリファレンスを与えるパラメータがないので、このVolatileを作成する必要があります。名前ではなくテーブル参照を渡す方が良いでしょう。 –

+0

@CharlesWilliams: 'Set LOTable = wS.ListObjects(tableName)'はテーブルrefを取得するのに十分ではありませんか? – R3uK

+0

はい、ただし、(UDFとして使用されていると仮定して)テーブルへの参照をパラメータとして渡さない限り、Excelはテーブル内のデータが変更されたときにUDFを再計算しません。 –

0

@ R3uk Axel Richterのコードで十分ですが、あなたも機能します。

関連する問題