2016-09-09 8 views
1

私はVBAとADODBの助けを借りてExcelから検索するアクセスデータベースを持っています。複数の列で検索する

これは完璧に機能しますが、一度に1つしか検索できません。列[2]の「姓」も持つ[1]列の「名」のすべてのインスタンスを検索したいとします。または、列[1]の「ファーストネーム」と列[3]の「アドレス」。

私はどのようにユーザーフォームのテキストボックスからそれを行うことになるでしょうか?

何らかの形で「Firstname + Lastname」などを追加しようとしていましたが、コードのロジックを理解できません。助言がありますか?

これは私が今持っているものです。提案のため

Private Sub cmd_lookup_Click() 

    Dim cn As Object 
    Dim rs As Object 

    Set cn = CreateObject("ADODB.Connection") 
    Set sqlConnect = New ADODB.Connection 
    Set rs = CreateObject("ADODB.RecordSet") 

    sqlConnect.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Source\database.accdb;Persist Security Info=False;" 

    cn.Open sqlConnect 

    rs.ActiveConnection = cn 

    SearchCriteria = "%" & searchCrit.Text & "%" 

    rs.Open "SELECT [1],[2] ,[3],[4], [5] FROM [tblDatabase]" & _ 
    "WHERE  [1] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [2] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [3] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [4] LIKE '" & SearchCriteria & "' " & _ 
    "   OR [5] LIKE '" & SearchCriteria & "' " & _ 
    "ORDER BY [2] Desc;", _ 
     cn, adOpenStatic 

Dim i As Integer 
If Not rs.EOF Then 
    rs.MoveFirst 
    i = 0 
    With lstLookup 
     'Code not relevant 
    End With 

    rs.Close 
    cn.Close 
    Set rs = Nothing 
    Set cn = Nothing 
    End If 
End Sub 

感謝:)

+0

これを実行する方法はたくさんあります。私はユーザーフォームを使って情報を入力して照会する傾向があります。次に、これらの入力を変数として保存します。それは空白であるものを省略するために、いくつかの条件付きロジック(すなわち 'If..End If'または' Select ... Case')を必要とします。希望の出力を知らずに具体的に伝えるのは難しいです。 – Kyle

+0

を使用すると、whereステートメントを動的に構築することができます。複雑さはguiとそれがANDやORなどのときに識別するためのパラメータですが、ドロップダウンリストやチェックボックスをAND/ORに使用し、SQL文を構築するときにその値を使用することができます – Matt

+0

複数の入力ボックスフォームに?たとえば、3つのボックスがある場合、それらを満たすことができます。次に、それらの値を持つクエリに対して「AND」ステートメントを追加するだけです。ボックスが空白の場合は、空の文字列ではなくワイルドカードを挿入できます。 – SandPiper

答えて

0

OR演算子で区切られAND paringsを考えてみましょう。しかし、最初に別のテキストフィールドで構成ユーザーフォームを持っている(それぞれが他の必要なフィールドにする必要がありますが、動的にWHERE句を構築する必要があります):

First Name Search:_____________ 
Last Name Search: _____________ 
Address Search: _______________ 

をそして一緒に基準をバインドします。また、私は理由のデバッグのための番号が、名前のフィールドに助言しません。また

rs.Open "SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [2] LIKE '%" & LastNameSearch & "%') " & _ 
     " OR ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " OR ([2] LIKE '%" & LastNameSearch & "%' " & _ 
     " AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " ORDER BY [2] Desc;", _ 
     cn, adOpenStatic 

を、それはUNION vs OR間の効率性を議論しているSQLの世界では、頻繁にUNIONクエリを使用しています。真に同等であるためには、重複を除去するために上記の両方にDISTINCTを追加する必要があります。

rs.Open "SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [2] LIKE '%" & LastNameSearch & "%') " & _ 
     " UNION" _ 
     " SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([1] LIKE '%" & FirstNameSearch & "%' " & _ 
     "  AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " UNION" _ 
     " SELECT [1], [2], [3], [4], [5]" & _ 
     " FROM [tblDatabase]" & _ 
     " WHERE ([2] LIKE '%" & LastNameSearch & "%' " & _ 
     "  AND [3] LIKE '%" & AddressSearch & "%') " & _ 
     " ORDER BY [2] Desc;", _ 
     cn, adOpenStatic 
+0

こんにちは、提案していただきありがとうございます。私は列に名前を付けました、私は実際にここでコードを変更しました。私はまた、1つのテキストボックスを使用したいだけです。私は5つ以上の列を検索する(25のように)と彼らは名前からアドレスへのコンポーネントの名前などに日付から時代までのすべてです。私は "criteria1 + criteria2"とSQLを書くことができるようになりたい列のいずれかに値が見つかるかどうかを確認してください。私が望んでいたよりもはるかに難しいと思われる。 – Thomas