これを試してみてください -- あなたが RowSource を探している理由がようやく理解できたと思います -- 申し訳ありませんが、最初はそれを「取得」できませんでした。プルしようとしているフィールドは、説明テーブルへの外部キーです。
この関数は、そのようなすべてのフィールドの一般的な解決策として機能するはずです (RowSource には常に主キーが最初にあり、説明が 2 番目にあると仮定します)。RowSource がない場合は、フィールドの値を取得するだけです。
@ron によって提案された変更ではなく、元のコードに基づいていますが、正しい方向に設定する必要があります。ronが示唆するように、パラメーター化してバリアントデータ型を許可するように修正する必要があります(+1 ron)
余談ですが、アンパサンド ( &
) を使用して VBA で文字列を結合し、次のようなことを回避してくださいabc = "1" + 1
:
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