Gestion d'annuaire téléphonique

Salut mes seigneurs,

avec des explications quant aux manip' que tu souhaites pouvoir exécuter...

A+

Salut,

J'aimerais que la recherche des numéros du "Fixe" se fera sur les colonnes F, G et H

Ainsi, la recherche du "Mobile" se fera sur les colonnes I et J.

Pour l'affichage, chaque titulaire trouvé, sera affiché avec ces numéros de fixe ainsi que ces numéros de mobile respectifs.

Le fichier testé est celui que FINDRH à joint la dernière fois.

Bonsoir

J'élargis la recherche

FINDRH

Bonjour

Avec recherche sur 3 colonnes fixes et 2 colonnes mobiles

A tester

Bonne journée

FINDRH

Bonsoir à tous,

Merci pour le fichier joint

J’essaye d’apporter quelques modifications, et quand je terminerais je le mettrais en pièce jointe

Bonjour,

Après quelques recherches, j'ai essayé de mélanger la solution de curulis et celle de FINDRH, en utilisant les tableaux à dimensions à la place des boucles, ensuite, essayer d'afficher toutes les colonnes trouvées des numéros fixes dans ListFix et les numéros mobile dans ListMob.

Je sais qu'il reste encore des améliorations àa apportés au code, puisqu'il y a des redondances

J'attends vos idées et vos contributions.

Merci

Bonjour,

J'aimerais trouver une procédure qui regroupe les étapes communs lors de l’événement OnChange des 3 TextBox dans le dernier fichier joint.

Merci d'avance.

Bonsoir,

J'ai un peux reduit le code, en créant la procédure TxtChange().

Mais les tests ne sont pas toujours fiables

Seuls les deux premiers caractères qui sont pris en considération

Private Sub Txt_Change()

    Nbmax = Sheets("Base").Range("A100000").End(xlUp).Row

    Me.ListClient.Clear
    Me.ListFix.Clear
    Me.ListMob.Clear

    tm = Timer

    tTab = Range("A2:J" & Range("A" & Rows.Count).End(xlUp).Row).Value
    If Len(Me.TxtNom) >= 2 Then
        For x = 1 To UBound(tTab, 1)
            For y = 2 To UBound(tTab, 2)

                If InStr(UCase(tTab(x, y)), UCase(Me.TxtNom.Value)) > 0 Then

                    iIdx = iIdx + 1
                    ReDim Preserve tExtract(7, iIdx)
                    tExtract(0, iIdx - 1) = tTab(x, 1) + 1
                    tExtract(1, iIdx - 1) = tTab(x, 5)
                    tExtract(2, iIdx - 1) = tTab(x, 6)
                    tExtract(3, iIdx - 1) = tTab(x, 7)
                    tExtract(4, iIdx - 1) = tTab(x, 8)
                    tExtract(5, iIdx - 1) = tTab(x, 9)
                    tExtract(6, iIdx - 1) = tTab(x, 10)
                End If
            Next
        Next
        If isArrayEmpty(tExtract) Then
            MsgBox "Pas de résultats"
            Exit Sub
        End If

        n = UBound(tExtract)

        ListClient.List = Application.Index(tExtract, 2)

        With Me.ListFix
            .Clear
            .ColumnHeads = False
            .ColumnCount = 3
            .List = Application.Index(tExtract, Array(3, 4, 5), Evaluate("Row(1:" & n & ")"))
        End With

        With Me.ListMob
            .Clear
            .ColumnHeads = False
            .ColumnCount = 2
            .List = Application.Index(tExtract, Array(6, 7), Evaluate("Row(1:" & n & ")"))
        End With

    End If

    'MsgBox "Durée d'exécution: " & Timer - tm & " s"

End Sub

Private Sub TxtNom_Change()
    Txt_Change
End Sub

Private Sub TxtFix_Change()
    Txt_Change
End Sub
Private Sub TxtMob_Change()
    Txt_Change
End Sub

Salut apt,

Ne pas mettre tTab, tExtract() et iIdx en PUBLIC !

En règle générale, travailler avec des variables locales suffit.

Private Sub Txt_Change(ByVal sItem$, iCol1%, iCol2%)
    '
    Dim tTab, tExtract(), iIdx%
    '
    Nbmax = Sheets("Base").Range("A100000").End(xlUp).Row

    Me.ListClient.Clear
    Me.ListFix.Clear
    Me.ListMob.Clear
    tm = Timer

    tTab = Worksheets("Base").Range("A2:J" & Range("A" & Rows.Count).End(xlUp).Row).Value
    If Len(sItem) > 1 Then
        For x = 1 To UBound(tTab, 1)
            For y = iCol1 To iCol2

                If InStr(UCase(tTab(x, y)), UCase(sItem)) > 0 Then

                    iIdx = iIdx + 1
                    ReDim Preserve tExtract(7, iIdx)
                    tExtract(0, iIdx - 1) = tTab(x, 1)
                    tExtract(1, iIdx - 1) = tTab(x, 5)
                    tExtract(2, iIdx - 1) = tTab(x, 6)
                    tExtract(3, iIdx - 1) = tTab(x, 7)
                    tExtract(4, iIdx - 1) = tTab(x, 8)
                    tExtract(5, iIdx - 1) = tTab(x, 9)
                    tExtract(6, iIdx - 1) = tTab(x, 10)
                    Exit For
                End If
            Next
        Next        ...

Tant qu'à créer une SUB commune, autant cibler la donnée recherchée et la colonne dans 'Base', non ?

Private Sub TxtNom_Change()
'
Call Txt_Change(Me.TxtNom.Text, 5, 5)
'
End Sub

Private Sub TxtFix_Change()
'
Call Txt_Change(Me.TxtFix.Text, 6, 8)
'
End Sub
Private Sub TxtMob_Change()
'
Call Txt_Change(Me.TxtMob.Text, 9, 10)
'
End Sub

A+

Bonjour curulis57,

J'ai appliqué le nouvel code, mais quand je saisi dans la deuxième textbox TxtFix, je n'ai rien comme résultat.

ymfdyrb 5ux0lve

Alors comment faire pour prendre en compte les résultats des mots saisis dans les deux autres TextBox ?

Salut apt,

ah, je n'avais pas capté que tu voulais cumuler la recherche !

Je regarde ça tout à l'heure !

A+

Ok

Bonjour à tous,

Pour répondre à la question postée sur mon site, voici une démo de recherche par Sql.

La recherche/affichage se fait indifféremment sur les cases nom/fixe/mobile combinées ou non

avec affichage au fur et à mesure de la saisie.

Pour cette recherche, une seule et même requête suffit.

Function Treponse(nm As String, fx As String, mb As String)

    Req = "SELECT `Titulaire`, `Fixe 1`+'-'+`Fixe2`+'-'+`Fixe3`," & _
          " `Mobile1`+'-'+`Mobile2`" & _
          " FROM " & Tbl_Bdd & _
          " WHERE `N°`>0" '

    If Not nm = "" Then Req = Req & " AND `Titulaire` LIKE '%" & nm & "%'"
    If Not fx = "" Then Req = Req & " AND `Fixe 1`+'-'+`Fixe2`+'-'+`Fixe3` LIKE '%" & fx & "%'"
    If Not mb = "" Then Req = Req & " AND `Mobile1`+'-'+`Mobile2` LIKE '%" & mb & "%'"

    Connect_xls ThisWorkbook.Path & "\" & ThisWorkbook.Name
    Treponse = Select_Db(Req, 0)
    Close_Cnx
End Function

C'est juste une démo avec code réduit au minimum

Pierre

On peut encore un peu simplifier comme ceci

Bonjour Pierre,

Merci pour cette nouvelle solution

Je vais faire des essais

Pour un premier essai, voici ce que j'ai pu remarqué :

- Lorsqu'on ajoute la recherche tapée dans le deuxième champ (fixe) et le troisième champ (mobile), seule la première ligne est affichée, les autres résultats sont ignorés.

Requete executée :

SELECT `N°`,`Titulaire`, `Fixe 1`,`Fixe2`,`Fixe3`, `Mobile1`,`Mobile2` FROM [Base$A:J] WHERE `N°`>0 AND `Titulaire` LIKE '%F%'
annuaire tel tatiak pierre 1

Requete executée :

SELECT `N°`,`Titulaire`, `Fixe 1`,`Fixe2`,`Fixe3`, `Mobile1`,`Mobile2` FROM [Base$A:J] WHERE `N°`>0 AND `Titulaire` LIKE '%F%' AND `Fixe 1`+'-'+`Fixe2`+'-'+`Fixe3` LIKE '%2%'
annuaire tel tatiak pierre 2

Bonjour à tous,

En effet, le Sql dans Excel diffère un poil du Sql "classique", la concaténation de chaine se fait mieux avec un "&" qu'avec le "+" ordinaire. Il faut donc écrire :

Function Treponse(nm As String, fx As String, mb As String) As Variant

    Req = "SELECT `N°`,`Titulaire`, `Fixe 1`,`Fixe2`,`Fixe3`," & _
          " `Mobile1`,`Mobile2`" & _
          " FROM " & Tbl_Bdd & _
          " WHERE `N°`>0"

    If Not nm = "" Then Req = Req & " AND `Titulaire` LIKE '%" & nm & "%'"
    If Not fx = "" Then Req = Req & " AND `Fixe 1`&'-'&`Fixe2`&'-'&`Fixe3` LIKE '%" & fx & "%'"
    If Not mb = "" Then Req = Req & " AND `Mobile1`&'-'&`Mobile2` LIKE '%" & mb & "%'"

    Connect_xls ThisWorkbook.Path & "\" & ThisWorkbook.Name
    Treponse = Select_Db(Req, 1)
    Close_Cnx
End Function

Bonne remarque de Apt

Pierre

Bonjour Pierre, le forum,

Merci pour la nouvelle requête. Ça fonctionne.

Une question secondaire sur SQL :

Pourquoi en essayant cette syntaxe :

AND (`Mobile1` OR `Mobile2`) LIKE '%11%'

au lieu de :

AND `Mobile1`&'-'&`Mobile2` LIKE '%11%'

ca ne fonctionne pas ?

Parce qu'il manque un opérateur de comparaison, la bonne syntaxe serait :

AND (`Mobile1` LIKE '%11%' OR `Mobile2` LIKE '%11%')

Ceci dit, la concaténation simplifie la rédaction de la requête : une seule variable et non deux, d'où ma préférence pour :

AND `Mobile1`&'-'&`Mobile2` LIKE '%11%'

Merci pour la clarification

Bonsoir,

Fait avec un pgm générique:

  • On peut ajouter ou supprimer des colonnes dans la BD
  • La recherche peut se faire par ComboBox ou par recherche intuitive.

Boisgontier

Rechercher des sujets similaires à "gestion annuaire telephonique"