VBA访问获取RowSource以查找查找值

时间:2013-08-21 20:50:49

标签: vba access-vba lookup-tables

VBA noob在这里(截至此哀悼),

在MS Access中,我编写了一个测试函数,根据您传入的某些条件查找记录的值。

除了我正在搜索的列中有查找的情况外,该函数似乎工作正常。

基本上它可能返回“19”,19对应于其他一些表值。

似乎列的RowSource是我之后所以我可以做第二个查询来找到真值。

假设我知道列名,然后利用它来找到Im之后的值,有人能指出我找到RowSource的正确方向吗?

编辑:我似乎没有清楚地解释自己,这是我试图以编程方式提供的图片 enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,我认为使用参数查询可以解决您的问题。使用参数是很好的做法,因为它们将执行隐式数据类型转换并且还可以防止注入攻击。

注意在以下函数中,我将lookupValue更改为Variant类型,它允许您将任何类型的值传递给函数。

Public Function lookUpColumnValue( _
    database As DAO.database, _
    column As String, _
    table As String, _
    lookUpColumn As String, _
    lookUpValue As Variant) As String

    Dim sql As String
    Dim recordSet As DAO.recordSet
    Dim result As String
    Dim qd As QueryDef
    Set qd = database.CreateQueryDef("")
    sql = "SELECT [" + table + "].[" + column + "] FROM [" + table + "] " & _
          "WHERE [" + table + "].[" + lookUpColumn + "] = [parm1];"
    qd.sql = sql
    qd.Parameters![parm1] = lookUpValue
    Set recordSet = qd.OpenRecordset()

    result = recordSet(column)

编辑

    lookUpColumnValue = DLookup("Space Use Description", "Space Use Codes", result)


End Function

答案 1 :(得分:2)

试试这个 - 我想我终于理解你为什么要寻找RowSource - 抱歉我一开始并没有“得到”它。您尝试提取的字段是描述表中的外键。

此函数应作为所有此类字段的通用解决方案(假设RowSource始终具有主键,而描述第二个)。如果没有RowSource,它只会拉取字段的值。

它基于您的原始代码,而不是@ron提出的更改,但它应该让您朝着正确的方向前进。您应该修复它以使其参数化,并允许变体数据类型,如ron建议(+1 ron)

顺便说一句,使用&符号(&)在VBA中将字符串连接在一起以避免这样的事情:abc = "1" + 1,其中abc现在等于2而不是“11”期待两个项目都是字符串。

Public Function lookUpColumnValue(Database As Database, column As String, table As String, lookUpColumn As String, lookUpValue As String) As String

    Dim sql As String
    Dim recordSet As DAO.recordSet
    Dim result As String

    lookUpColumnValue = "" 'Return a blank string if no result

    On Error Resume Next

    sql = "SELECT [" & table & "].[" & column & "] FROM [" & table & "] WHERE [" & table & "].[" & lookUpColumn & "] = '" & lookUpValue & "'"
    Set recordSet = Database.OpenRecordset(sql)

    If Not recordSet.EOF Then
        Dim td As DAO.TableDef

        'this gives your number - say, 19
        result = recordSet(column)

        Set td = Database.TableDefs(table)

        'Get the rowsource
        Dim p As DAO.Property
        For Each p In td.Fields(column).Properties
            If p.Name = "RowSource" Then
                RowSource = Replace(td.Fields(column).Properties("RowSource"), ";", "")
                Exit For
            End If
        Next

        If Not RowSource = "" Then
            Dim rs2 As DAO.recordSet
            Dim qd As DAO.QueryDef

            Set qd = Database.CreateQueryDef("", RowSource)
            Set rs2 = Database.OpenRecordset(RowSource)

            If rs2.EOF Then Exit Function

            PKField = rs2.Fields(0).Name

            rs2.Close
            qd.Close

            sql = "SELECT * FROM (" & RowSource & ") WHERE [" & PKField & "]=[KeyField?]"
            Set qd = Database.CreateQueryDef("", sql)
            qd.Parameters("KeyField?").Value = result

            Set rs2 = qd.OpenRecordset()

            If Not rs2.EOF Then
                'NOTE: This assumes your RowSource *always* has ID first, description 2nd.  This should usually be the case.
                lookUpColumnValue = rs2.Fields(1)
            End If
        Else
            'Return the field value if there is no RowSource
            lookUpColumnValue = recordSet.Fields(column)
        End If
    End If

End Function
相关问题