我正在尝试制作一个表单,用于搜索数据库中所有表中的值(有多个表)。结果将显示为其中出现的表的名称。如果有人可以帮助我,那就太好了。
简而言之,我有一个带有文本框和按钮的表单。我输入搜索字符串(例如 183939)并单击按钮。它在数据库表的所有字段中搜索值(183939),如果找到该值,则显示它出现的表的名称。感谢您的帮助。
我认为这是一个坏主意,因为它可能需要很长时间,并且由于还要搜索系统表而提供令人困惑的结果......但是以下函数将返回包含搜索词的所有表名的数组,或者如果它是没找到。调用示例是这样的:theTables = containingTable("hello")
其中 theTables 是一个变体。一个限制是这对于多值字段将失败。
Function containingTables(term As String)
Dim db As Database
Dim tds As TableDefs
Dim td As TableDef
Set db = CurrentDb
Set tds = db.TableDefs
For Each td In tds
For Each f In td.Fields
On Error Resume Next
If DCount("[" & f.Name & "]", "[" & td.Name & "]", "[" & f.Name & "] LIKE '*" & term & "*'") Then
If Err.Number <> 0 Then
Debug.Print Err.Number, Err.Description
Err.Clear
On Error GoTo 0
Else
containingTables = containingTables & td.Name & ","
Exit For
End If
End If
Next
Next
Set tds = Nothing
Set db = Nothing
'Alternate Version
if Len(containgingTables) then containingTables = Left(containingTables, Len(containingTables) - 1)
'Original Version
'if Len(containgingTables) then containingTables = Split(Left(containingTables, Len(containingTables) - 1), ",")
End Function
要使用替代版本显示结果,只需使用:Msgbox(containingTables(searchTerm))
where searchTerm
is what you are search.
我也一样,我不知道你为什么想做那样的事情......
我认为 Daniel Cook 发布的解决方案是正确的,我只是采取了稍微不同的方法。你需要像我一样匹配确切的值吗?无论如何,这是我的代码:
Function searchTables(term as String)
Dim T As TableDef
Dim Rs As Recordset
Dim Result() As String
Dim Counter
Counter = 0
For Each T In CurrentDb.TableDefs
If (Left(T.Name, 4) <> "USys") And (T.Attributes = 0) Then
Set Rs = T.OpenRecordset
While Not Rs.EOF
For Each Field In Rs.Fields
If Rs(Field.Name) = term Then
Counter = Counter + 1
ReDim Preserve Result(Counter)
Result(Counter) = T.Name & "," & Field.Name
End If
Next
Rs.MoveNext
Wend
Rs.Close
End If
Next
If Counter = 0 Then
searchTables = Null
Else
searchTables = Result
End If
End Function
您应该过滤掉重复的值,以防函数在同一个表中多次匹配相同的字段。