Excelのさまざまな設定テーブルがあり、それぞれにパラメータと値という2つの列見出しがあります。Excelの関数にテーブル名を渡す方法
特定のテーブルの名前を、そのテーブル内の特定のパラメータの名前を検索し、関連するパラメータの値を返し、すべてのエラー処理を実行する関数getParameter
に渡したいとします。
適切な関数引数を定義して関数を呼び出すにはどうすればよいですか?
Excelのさまざまな設定テーブルがあり、それぞれにパラメータと値という2つの列見出しがあります。Excelの関数にテーブル名を渡す方法
特定のテーブルの名前を、そのテーブル内の特定のパラメータの名前を検索し、関連するパラメータの値を返し、すべてのエラー処理を実行する関数getParameter
に渡したいとします。
適切な関数引数を定義して関数を呼び出すにはどうすればよいですか?
表は、であり、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")
のようなセル式を使用してユーザー定義関数として使用されることが想定されています。
私はあなたの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")
テーブルリファレンスを与えるパラメータがないので、このVolatileを作成する必要があります。名前ではなくテーブル参照を渡す方が良いでしょう。 –
@CharlesWilliams: 'Set LOTable = wS.ListObjects(tableName)'はテーブルrefを取得するのに十分ではありませんか? – R3uK
はい、ただし、(UDFとして使用されていると仮定して)テーブルへの参照をパラメータとして渡さない限り、Excelはテーブル内のデータが変更されたときにUDFを再計算しません。 –
@ R3uk Axel Richterのコードで十分ですが、あなたも機能します。
テーブル参照を与えるパラメータがないため、この揮発性を作成する必要があります。名前ではなくテーブル参照を渡すほうがよいでしょう。 –
@Charles Williams:はい、多分これはその使用法に応じて揮発性に設定する必要があります。しかし、問題はまさに「関数にテーブル名を渡す方法」でした。 「関数へのテーブル参照の受け渡し方法」ではありません。後者の場合、「VBA」は必要ありません。これは、Excelのネイティブ 'INDEX'機能を使用して実現できます。 –
良い答えのための@AxelR Thx – Cyberpro