如何将表名传递给Excel中的函数

时间:2017-02-13 07:01:43

标签: excel vba excel-vba

我在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

如何定义适当的函数参数并调用函数?

3 个答案:

答案 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的代码就足够了,但你的代码也可以。