IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

fonction de recherche [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Par défaut fonction de recherche
    Bonjour,

    J'ai créé un usf qui fait une recherche selon un ou plusieurs critères.

    Lorsque la recherche est lancé, les lignes ne correspondant pas au critères définit dans les textbox sont cachées et non pas effacées. Je ferais un bouton pour les réafficher dans l'ordre ou c'était.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Option Explicit
    Option Compare Text
     
    Private Sub Bouton_rechercher_Click()
     
        Dim cellule As Range
        Feuil1.Activate
     
        'recherche à partir du numéro de marché
        If (TextBox_num_marche.Value <> "") Then
            For Each cellule In Range("A1", Cells(Rows.Count, "A").End(xlUp))
     
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = .Value <> CStr(TextBox_num_marche.Value)
                    End With
     
            Next
        End If
     
        'recherche à partir du titulaire du marché
        If (TextBox_titulaire_marche.Value <> "") Then
            For Each cellule In Range("G1", Cells(Rows.Count, "G").End(xlUp))
     
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = .Value <> CStr(TextBox_titulaire_marche.Value)
                    End With
     
            Next
        End If
     
        'recherche en fonction d'une fourchette de prix
        If ((TextBox_prix_min.Value <> "") And (TextBox_prix_max.Value <> "")) Then
            For Each cellule In Range("M1", Cells(Rows.Count, "M").End(xlUp))
                If Not IsEmpty(cellule) Then
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = (.Value) <= CLng(TextBox_prix_min.Value) Or (.Value) >= CLng(TextBox_prix_max.Value)
                    End With
                End If
            Next
        End If
     
        'recherche en fonction du type de maché
        If (TextBox_type_marche.Value <> "") Then
            For Each cellule In Range("B1", Cells(Rows.Count, "B").End(xlUp))
                If Not IsEmpty(cellule) Then
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = (.Value) <= CStr(TextBox_type_marche.Value)
                    End With
                End If
            Next
        End If
     
        'Fermeture fenetre de recherche
        'Unload UserForm_rechercher
     
    End Sub
     
    Private Sub TextBox_prix_max_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'Seule une valeur numérique peut être entrée
        If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
     
        'Si le caractère saisi est le 1er et qu'il s'agit d'un point alors j'ajoute 0 devant
        If Len(TextBox_prix_max) = 1 And TextBox_prix_max = "." Then TextBox_prix_max = "0."
     
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_prix_max.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0
     
        'S'il existe un point dans le TextBox : InStr(TextBox_prix_max.Value, ".") <> 0
        'et que la longueur de la chaine contenue dans le textbox : Len(TextBox_prix_max.Value)
        'est supérieure à la place du . dans la chaine + 1 > InStr(TextBox_prix_max.Value, ".") + 1
        'alors on annule la saisie : Then KeyAscii = 0
        If InStr(TextBox_prix_max.Value, ".") <> 0 And Len(TextBox_prix_max.Value) > InStr(TextBox_prix_max.Value, ".") + 1 Then KeyAscii = 0
     
    End Sub
     
    Private Sub TextBox_prix_min_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'Seule une valeur numérique peut être entrée
        If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
     
        'Si le caractère saisi est le 1er et qu'il s'agit d'un point alors j'ajoute 0 devant
        If Len(TextBox_prix_min) = 1 And TextBox_prix_min = "." Then TextBox_prix_min = "0."
     
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_prix_min.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0
     
        'S'il existe un point dans le TextBox : InStr(TextBox_prix_min.Value, ".") <> 0
        'et que la longueur de la chaine contenue dans le textbox : Len(TextBox_prix_min.Value)
        'est supérieure à la place du . dans la chaine + 1 > InStr(TextBox_prix_min.Value, ".") + 1
        'alors on annule la saisie : Then KeyAscii = 0
        If InStr(TextBox_prix_min.Value, ".") <> 0 And Len(TextBox_prix_min.Value) > InStr(TextBox_prix_min.Value, ".") + 1 Then KeyAscii = 0
     
    End Sub
    Mais voilà, j'ai un souci dans le code car lorsque je rentre dans type de marche le mot service ça déconne. J'ai des lignes avec le mot fourniture et d'autres qui sont vides.

    Si vous voulez le fichier je le mettrais.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Par défaut
    Salut,

    Etant donné que le type de marché est un critère texte, la condition de test doit s'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .EntireRow.Hidden = (.Value) <> CStr(TextBox_type_marche.Value)
    plutôt que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .EntireRow.Hidden = (.Value) <= CStr(TextBox_type_marche.Value)
    Cordialement,
    n.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, je résudrais ce genre de cas en utilisant les filtres automatiques en VBA. C'est 1000 fois plus simple que de boucler sur les lignes, et tu dégages la logique de filtre du VBA.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Par défaut
    Le copier coller c'est pas terrible. Pour les filtres automatiques en vba , j'en ai jamais utilisés mais pourquoi pas le tenter.

    On peut faire plus de deux criteria?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    Citation Envoyé par Chicard Voir le message
    On peut faire plus de deux criteria?
    Sous Excel 2003 je ne crois pas (il n'y a que Criteria1 et Criteria 2 quand tu regardes dans l'explorateur de projets).

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 239
    Par défaut
    Donc vu que j'ai 5 critères, utiliser les filtres vba peux être possible que si j'en spécifie deux au maximum mais mon but est de pouvoir en spécifier 5 (même si ça n'arrivera peut-être jamais).


    En attendant mon code ne fonctionne toujours pas.

    Apparemment pas d'erreur de compil mais surement dans le code du traitement mais je vois pas ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Option Explicit
    Option Compare Text
     
    Private Sub Bouton_rechercher_Click()
     
        Dim cellule As Range
        Feuil1.Activate
     
        'recherche à partir du numéro de marché
        If (TextBox_num_marche.Value <> "") Then
            For Each cellule In Range("A1", Cells(Rows.Count, "A").End(xlUp))
     
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = .Value <> CStr(TextBox_num_marche.Value)
                    End With
     
            Next
        End If
     
        'recherche à partir du titulaire du marché
        If (TextBox_titulaire_marche.Value <> "") Then
            For Each cellule In Range("G1", Cells(Rows.Count, "G").End(xlUp))
     
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = .Value <> CStr(TextBox_titulaire_marche.Value)
                    End With
     
            Next
        End If
     
        'recherche en fonction d'une fourchette de prix
        If ((TextBox_prix_min.Value <> "") And (TextBox_prix_max.Value <> "")) Then
            For Each cellule In Range("M1", Cells(Rows.Count, "M").End(xlUp))
                If Not IsEmpty(cellule) Then
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = (.Value) <= CLng(TextBox_prix_min.Value) Or (.Value) >= CLng(TextBox_prix_max.Value)
                    End With
                End If
            Next
        End If
     
        'recherche en fonction du type de maché
        If (TextBox_type_marche.Value <> "") Then
            For Each cellule In Range("B1", Cells(Rows.Count, "B").End(xlUp))
                If Not IsEmpty(cellule) Then
                    With cellule.Offset(1, 0)
                        .EntireRow.Hidden = (.Value) <> CStr(TextBox_type_marche.Value)
                    End With
                End If
            Next
        End If
     
        'Fermeture fenetre de recherche
        'Unload UserForm_rechercher
     
    End Sub
     
    Private Sub TextBox_prix_max_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'Seule une valeur numérique peut être entrée
        If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
     
        'Si le caractère saisi est le 1er et qu'il s'agit d'un point alors j'ajoute 0 devant
        If Len(TextBox_prix_max) = 1 And TextBox_prix_max = "." Then TextBox_prix_max = "0."
     
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_prix_max.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0
     
        'S'il existe un point dans le TextBox : InStr(TextBox_prix_max.Value, ".") <> 0
        'et que la longueur de la chaine contenue dans le textbox : Len(TextBox_prix_max.Value)
        'est supérieure à la place du . dans la chaine + 1 > InStr(TextBox_prix_max.Value, ".") + 1
        'alors on annule la saisie : Then KeyAscii = 0
        If InStr(TextBox_prix_max.Value, ".") <> 0 And Len(TextBox_prix_max.Value) > InStr(TextBox_prix_max.Value, ".") + 1 Then KeyAscii = 0
     
    End Sub
     
    Private Sub TextBox_prix_min_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        'Seule une valeur numérique peut être entrée
        If InStr("0123456789.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
     
        'Si le caractère saisi est le 1er et qu'il s'agit d'un point alors j'ajoute 0 devant
        If Len(TextBox_prix_min) = 1 And TextBox_prix_min = "." Then TextBox_prix_min = "0."
     
        'Si un point est déjà dans la chaine on ne peut pas en taper un autre
        If InStr(TextBox_prix_min.Value, ".") <> 0 And Chr(KeyAscii) = "." Then KeyAscii = 0
     
        'S'il existe un point dans le TextBox : InStr(TextBox_prix_min.Value, ".") <> 0
        'et que la longueur de la chaine contenue dans le textbox : Len(TextBox_prix_min.Value)
        'est supérieure à la place du . dans la chaine + 1 > InStr(TextBox_prix_min.Value, ".") + 1
        'alors on annule la saisie : Then KeyAscii = 0
        If InStr(TextBox_prix_min.Value, ".") <> 0 And Len(TextBox_prix_min.Value) > InStr(TextBox_prix_min.Value, ".") + 1 Then KeyAscii = 0
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction de recherche
    Par lejimi dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 4
    Dernier message: 15/01/2006, 22h09
  2. Fonction de recherche de ligne...
    Par Zenol dans le forum Langage
    Réponses: 6
    Dernier message: 05/12/2005, 20h26
  3. fonction de recherche et recopie
    Par mavean dans le forum Access
    Réponses: 2
    Dernier message: 20/11/2005, 13h24
  4. Adapter la fonction de recherche de Plone/Zope
    Par StarNab dans le forum Zope
    Réponses: 2
    Dernier message: 07/04/2005, 17h04
  5. [String] Fonction de recherche de caractères numériques
    Par david71 dans le forum Général Java
    Réponses: 10
    Dernier message: 16/02/2005, 13h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo