2016-09-09 1 views
1

J'ai une base de données d'accès que j'effectue à partir d'Excel avec l'aide de VBA et ADODB.Recherche dans plusieurs colonnes

Cela fonctionne parfaitement bien, mais je ne peux rechercher qu'une chose à la fois. Dites que je veux rechercher toutes les instances de "prénom" dans la colonne [1] qui a également "nom de famille" dans la colonne [2]. Ou, "prénom" dans la colonne [1] et "adresse" dans la colonne [3].

Comment procéder à partir d'une zone de texte sur un formulaire utilisateur?

Je pensais d'une certaine manière ajouter "Prénom + Nom" ou quelque chose, mais je ne peux pas comprendre la logique du code. Aucune suggestion?

C'est ce que j'ai pour l'instant.

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 

Merci pour les suggestions :)

+0

Il existe de nombreuses façons de procéder. J'ai tendance à utiliser un formulaire utilisateur pour que les utilisateurs saisissent des informations à interroger. Ensuite, enregistrez ces entrées en tant que variables. Cela exigera une certaine logique conditionnelle (c.-à-d. «If..End If» ou «Select ... Case») afin d'omettre tout ce qui est vide. Genre de difficile à vous dire spécifiquement sans connaître la sortie désirée. – Kyle

+0

vous pouvez construire votre instruction where dynamiquement, y compris la commutation OU à ET lorsque vous souhaitez trouver les deux. La complication sera le GUI et les paramètres à identifier quand il sera ET ou OU etc. mais vous pouvez utiliser la liste déroulante ou la case à cocher pour AND/OR et ensuite utiliser la valeur lors de la construction de votre instruction SQL – Matt

+0

Avez-vous plusieurs boîtes d'entrée Sur le formulaire? Si vous avez trois cases, par exemple, vous pouvez les faire remplir et ensuite ajouter une instruction 'AND' sur la requête avec ces valeurs. Si les cases sont vides, vous pouvez insérer un caractère générique au lieu d'une chaîne vide. – SandPiper

Répondre

0

Considérez AND rognures séparés par OR opérateurs. Mais d'abord userform structuré avec des champs de texte séparés (et chacun doit être un champ obligatoire sinon vous devez construire WHERE clause dynamique):

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

Et puis lier ensemble des critères. En outre, je ne conseillerais pas numérotés mais nommés champs pour des raisons de débogage:

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 

Vous pouvez également utiliser une requête UNION aussi souvent dans le monde SQL il est discuté de l'efficacité entre UNION vs OR. Pour être vraiment équivalent, un DISTINCT doit être ajouté ci-dessus pour les deux pour supprimer les doublons.

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

Salut, merci pour la suggestion. J'ai nommé des colonnes, je viens de changer le code ici pour des raisons pratiques. Je veux aussi seulement utiliser une zone de texte. J'ai plus de 5 colonnes à rechercher (comme 25 ou plus) et ils sont tout de dates en heures aux noms et adresses aux noms de composants etc etc Je voudrais juste être en mesure d'écrire "criteria1 + criteria2" et avoir SQL voir s'il peut trouver les valeurs dans l'une des colonnes, puis une autre. Semble être beaucoup plus difficile que ce que j'avais espéré. – Thomas