Ms access 如何创建一个表单,在access中搜索数据库的所有表中的值
我试图创建一个表单,在数据库中的所有表中搜索值(有多个表)。结果将显示为其中显示的表的名称。如果有人能帮我,那就太好了Ms access 如何创建一个表单,在access中搜索数据库的所有表中的值,ms-access,vba,Ms Access,Vba,我试图创建一个表单,在数据库中的所有表中搜索值(有多个表)。结果将显示为其中显示的表的名称。如果有人能帮我,那就太好了 简而言之,我有一个带有文本框和按钮的表单。我输入搜索字符串(例如183939)并单击按钮。它在数据库中的表中的所有字段中搜索值(183939),如果找到该值,则显示该值所在的表的名称。谢谢您的帮助。我认为这是一个坏主意,因为它可能需要很长时间,并且由于还搜索系统表而提供混乱的结果。。。但是下面的函数将返回一个包含搜索项的所有表名的数组,如果没有找到,则不返回任何内容。调用示例是
简而言之,我有一个带有文本框和按钮的表单。我输入搜索字符串(例如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
函数包含表(术语为字符串)
dimdb作为数据库
将tds变暗为TableDefs
将td设置为TableDef
Set db=CurrentDb
设置tds=db.TableDefs
对于tds中的每个td
对于td.字段中的每个f
出错时继续下一步
如果数据计数(“[”&f.Name&“]”、“[”&td.Name&“]”、“[”&f.Name&“]与“*”)类似,则
如果错误号为0,则
调试.打印错误号,错误说明
呃,明白了
错误转到0
其他的
containingTables=containingTables&td.Name&“
退出
如果结束
如果结束
下一个
下一个
设置tds=无
Set db=Nothing
“替代版本
如果Len(containingTables),那么containingTables=Left(containingTables,Len(containingTables)-1)
"原版",
'如果Len(containingTables),那么containingTables=Split(左(containingTables,Len(containingTables)-1),“,”)
端函数
要使用备用版本显示结果,只需使用:
Msgbox(containingTables(searchTerm))
wheresearchTerm
就是您要搜索的内容。我认为这是一个坏主意,因为它可能需要很长时间,并且由于还搜索系统表,因此会提供混乱的结果。。。但是下面的函数将返回一个包含搜索项的所有表名的数组,如果没有找到,则不返回任何内容。调用示例是这样的: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
函数包含表(术语为字符串)
dimdb作为数据库
将tds变暗为TableDefs
将td设置为TableDef
Set db=CurrentDb
设置tds=db.TableDefs
对于tds中的每个td
对于td.字段中的每个f
出错时继续下一步
如果数据计数(“[”&f.Name&“]”、“[”&td.Name&“]”、“[”&f.Name&“]与“*”)类似,则
如果错误号为0,则
调试.打印错误号,错误说明
呃,明白了
错误转到0
其他的
containingTables=containingTables&td.Name&“
退出
如果结束
如果结束
下一个
下一个
设置tds=无
Set db=Nothing
“替代版本
如果Len(containingTables),那么containingTables=Left(containingTables,Len(containingTables)-1)
"原版",
'如果Len(containingTables),那么containingTables=Split(左(containingTables,Len(containingTables)-1),“,”)
端函数
要使用备用版本显示结果,只需使用:
Msgbox(containingTables(searchTerm))
其中searchTerm
就是您要搜索的内容。Me我也不知道您为什么要这样做
我认为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
函数搜索表(术语为字符串)
将T调暗为TableDef
将遥感器作为记录集
Dim Result()作为字符串
暗色计数器
计数器=0
对于CurrentDb.TableDefs中的每个T
如果(左(T.Name,4)“USys”)和(T.Attributes=0),则
Set Rs=T.OpenRecordset
而不是卢比
对于Rs.字段中的每个字段
如果Rs(Field.Name)=术语,则
计数器=计数器+1
重拨保留结果(计数器)
结果(计数器)=T.Name&“,”和Field.Name
如果结束
下一个
下一个
温德
Rs.Close
如果结束
下一个
如果计数器=0,则
searchTables=Null
其他的
searchTables=结果
如果结束
端函数
你应该过滤掉重复的值,以防函数多次匹配同一个表中的同一个字段。我也是。我不知道你为什么要这样做 我认为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
函数搜索表(术语为字符串)
将T调暗为TableDef
将遥感器作为记录集
Dim Result()作为字符串
暗色计数器
计数器=0
对于CurrentDb.TableDefs中的每个T
如果(左(T.Name,4)“USys”)和(T.Attributes=0),则
Set Rs=T.OpenRecordset
而不是卢比
对于Rs.字段中的每个字段
如果Rs(Field.Name)=术语,则
计数器=计数器+1
重拨保留结果(计数器)
结果(计数器)=T.Name&“,”和Field.Name
如果结束
下一个
下一个
温德
Rs.Close
如果结束
下一个
如果计数器=0,则
searchTables=Null
其他的
searchTables=Re