1

データベース内のすべてのテーブル内の値を検索するフォームを作成しようとしています (複数のテーブルがあります)。結果は、これが表示されるテーブルの名前として表示されます。誰かが私を助けることができれば、それは素晴らしいことです。

要するに、テキストボックスとボタンを備えたフォームがあります。検索文字列 (183939 など) を入力し、ボタンをクリックします。データベース内のテーブルのすべてのフィールド内の値 (183939) を検索し、値が見つかった場合は、それが表示されるテーブルの名前を表示します。助けてくれてありがとう。

4

2 に答える 2

1

これは非常に時間がかかる可能性があり、システムテーブルも検索するために混乱する結果をもたらす可能性があるため、これは悪い考えだと思います...しかし、次の関数は、検索語を含むすべてのテーブル名の配列を返すか、そうでない場合は何も返しません見つかりません。呼び出し例は次の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))どこsearchTermにありますか。

于 2012-10-15T19:42:10.023 に答える
0

私も、どうしてそんなことをしたいのかわかりません...

ダニエル・クックが投稿した解決策は正しいと思います。少し異なるアプローチをとっただけです。私のように正確な値を一致させる必要がありますか? とにかく、ここに私のコードがあります:

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

関数が同じテーブルの同じフィールドに複数回一致する場合は、重複する値を除外する必要があります。

于 2012-10-15T20:26:55.200 に答える