我在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
如何定义适当的函数参数并调用函数?
答案 0 :(得分: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")
这样的单元格公式作为用户定义函数。
答案 1 :(得分:0)
我会这样做,识别与您的TableName
对应的工作表和ListObject:
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")
答案 2 :(得分:0)
@ R3uk Axel Richter的代码就足够了,但你的代码也可以。