我試圖讓該搜索中的所有數據庫中的表值的形式搜索數據庫中的所有表中值的形式(有超過1個表)。結果將顯示爲出現的表格的名稱。如果有人能幫助我,那將會很好。我怎麼會做這在訪問
總之,我有一個文本框和按鈕的形式。我輸入搜索字符串(例如183939)並單擊按鈕。它搜索數據庫中表中所有字段內的值(183939),如果找到該值,則會顯示出現的表的名稱。感謝您的幫助。
我試圖讓該搜索中的所有數據庫中的表值的形式搜索數據庫中的所有表中值的形式(有超過1個表)。結果將顯示爲出現的表格的名稱。如果有人能幫助我,那將會很好。我怎麼會做這在訪問
總之,我有一個文本框和按鈕的形式。我輸入搜索字符串(例如183939)並單擊按鈕。它搜索數據庫中表中所有字段內的值(183939),如果找到該值,則會顯示出現的表的名稱。感謝您的幫助。
我認爲這是一個壞主意,因爲它可能需要很長的時間,並提供由於還搜索系統表混亂的結果......但是下面的函數將返回所有的表名的包含搜索詞的數組或如果沒有找到,就沒有任何問題調用示例如下:theTables = containingTable("hello")
其中表是變體。一個限制是,這將失敗的多值字段。
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))
其中searchTerm
是無論你正在尋找。
我以及我不知道你爲什麼會想要做這樣的事情......
我想發表丹尼爾·庫克的解決方案是正確的,我只花了稍微不同的方法。你需要像我一樣匹配確切的價值嗎?總之,這裏是我的代碼:
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
你應該過濾掉重複的值,如果函數多次在同一個表提交的同相匹配。
另外,還可以在發現結果使用'rs.MoveLast'和'退出For'到去下一張桌子。 –
我沒有讀你評論,所以我更新我的!是的,如果他只需要顯示錶格名稱,而不是字段名稱,那麼一旦他找到匹配字段,他就可以跳過整個表格的閱讀。 – fthiella
感謝您的快速回復。我知道這是一個糟糕的主意,但我無法做到這一點,因爲它對我來說很重要。所以我需要做的就是將這段代碼粘貼到VBA頁面中,然後當我運行表單並按搜索時,結果會彈出? – nonion
不,這僅僅是你可以用它來獲得一個字符串數組有有搜索詞爲一些外地(不含多值字段)的部分內容中的所有表的名稱的功能。你需要處理數組。或者,如果您在最後一行中刪除了Split,則可以使用逗號分隔的字符串返回,而不是隻顯示在msgbox中...我會更新我的答案以向您顯示。 –
您可以調整它以處理多值字段。如果'f.Properties( 「AllowMultipleValues」)= TRUE',然後使用'DCOUNT()'表達的變體:'DCOUNT( 「[」 &f.Name& 「]」, 「[」 &td.Name& 「]」, 「[」 f.Name& 「] .value的LIKE '*」 和術語 「*'」)' – HansUp