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 :

Recherche données avec plusieurs critères imbriqués [XL-97]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Par défaut Recherche données avec plusieurs critères imbriqués
    Bonjour,
    Voici mon problème : dans une feuille j'ai des données (E à H) classées selon un atelier (A), un code de 1 à 5(B) et une date de mise à jour (C). c'est données sont mise à jour aléatoirement, c'est à dire que pour une date donnée seul le code 2 est renseigné pour l'atelier dupont, et l'atelier durant est mis à jour à une autre date pour les code 2, 3 et 4 par exemple.
    Mon souhait est de pouvoir (via VBA) afficher la carte des données E à H pour tous les codes (1 à 5) mis à jour les plus récente pour un atelier donné (choix par combo).
    Je tourne un peu en rond.
    ma carte récapitulative comprend :
    - 5 lignes, 1 par code
    - 6 colonnes : code, date de révision, puis les les 4 données (E à H).

    J'ai essayé avec des boucles imbriquées sans résultat. Surtout par rapport à la recherche de la date la plus récente de mise à jour.
    je ne sais pas s'il faut que j'utilise un tableau, mais je ne maîtrise pas avec plusieurs conditions de recherche.

    Merci pour vos conseils.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Difficile de te donner une réponse précise parce-que je ne visualise pas le type de tableau que tu veux.
    Il me semble toutefois que tu peux peut-être résoudre cela dans une feuille Excel à l'aide de la formule SOMMEPROD.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Une piste. Il te faut un UserForm sur lequel tu pose un ComboBox que tu nomme "CmbAtelier" et une ListeBox que tu nomme "LstResultats". La feuille où se trouve ta base de données est dans mon exemple nommée "Feuil1" et la feuille "Feuil2" ne doit pas être utilisée, dans le cas contraire, modifier le nom dans le code pour faire référence à une autre feuille. Cette feuille (ici Feuil2") sert de tranfert :
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
     
    Private Sub UserForm_Initialize()
     
        Dim Dico As Object
        Dim Cles As Variant
        Dim Plage As Range
        Dim Cel As Range
        Dim I As Integer
     
        'rempli le combo avec le nom des ateliers, adapter le nom...
        With Worksheets("Feuil1")
     
            Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'utilise un dictionnaire pour éviter les doublons
        Set Dico = CreateObject("Scripting.Dictionary")
     
        For Each Cel In Plage
     
            If Dico.exists(Cel.Value) = False Then
     
                Dico.Add Cel.Value, Cel.Value
     
            End If
     
        Next Cel
     
        Cles = Dico.Keys
     
        'rempli le combo
        For I = 0 To Dico.Count - 1
     
            CmbAtelier.AddItem Cles(I)
     
        Next I
     
        'défini la listbox (nombre de colonnes et leur largeur)
        With LstResultats
     
            .ColumnCount = 4
            .ColumnWidths = "50;50;50;50"
     
        End With
     
    End Sub
     
    Private Sub CmbAtelier_Click()
     
        LstResultats.Clear
        Filtre CmbAtelier.Text
     
    End Sub
     
    Sub Filtre(Atelier As String)
     
        Dim Fe_Filtre As Worksheet
        Dim Fe_Recup As Worksheet
        Dim Plage As Range
        Dim PlageDate As Range
        Dim Cel As Range
        Dim I As Integer
        Dim J As Integer
        Dim DateMax As Date
        Dim Derlgn As Long
     
        'feuille sur laquelle exécuter le filtrage, adapter le nom...
        Set Fe_Filtre = Worksheets("Feuil1")
     
        'défini la feuille "Feuil2" comme cible pour
        'la récupération des valeurs filtrées, si pas libre, adapter le nom...
        Set Fe_Recup = Worksheets("Feuil2")
     
        'vide la feuille au cas où il y aurait des cellules non vides
        Fe_Recup.UsedRange.Cells.Clear
     
        'défini la plage à filtrer sur toute la zone utilisée de la feuille
        Set Plage = Fe_Filtre.UsedRange
     
        With Plage
     
            'exécute le filtrage sur le champ 1 (colonne A, les ateliers)
            .AutoFilter 1, Atelier
     
            'copie les valeurs filtrées dans la feuille qui sert de tranfert
            Fe_Filtre.AutoFilter.Range.EntireRow.Copy Fe_Recup.[A1]
     
            'supprime le filtrage
            .AutoFilter
     
        End With
     
        'redéfini la plage
        Set Plage = Fe_Recup.UsedRange
     
        Derlgn = Plage.Rows.Count + 2
     
        With Plage
     
            For I = 1 To 5
     
                'filtre sur les codes de 1 à 5
                .AutoFilter 2, I
     
                'colle le résultat deux lignes en dessous
                Fe_Recup.AutoFilter.Range.EntireRow.Copy Fe_Recup.Cells(Derlgn, 1)
     
                'supprime le filtrage
                .AutoFilter
     
                'défini la nouvelle plage pour récupérer la date max
                With Fe_Recup
     
                    Set PlageDate = .Range(.Cells(Derlgn, 1), .Cells(.Rows.Count, 8).End(xlUp))
     
                End With
     
                'si au moins un enregistrement existe ("> 1" car un filtrage emporte systématiquement la ligne d'entêtes)
                If PlageDate.Rows.Count > 1 Then
     
                    'recherche la date la plus récente
                    DateMax = Application.WorksheetFunction.Max(PlageDate.Columns(3))
     
                    'en recherche sa position
                    Set Cel = PlageDate.Columns(3).Find(DateMax, , xlValues, xlWhole)
     
                    If Not Cel Is Nothing Then
     
                        With LstResultats
     
                            .AddItem Cel.Offset(0, 2).Value
                            .Column(1, J) = Cel.Offset(0, 3).Value
                            .Column(2, J) = Cel.Offset(0, 4).Value
                            .Column(3, J) = Cel.Offset(0, 5).Value
     
                            J = J + 1
     
                        End With
     
                        PlageDate.Clear
     
                    End If
     
                End If
     
            Next I
     
        End With
     
        'vide la feuille
        Fe_Recup.UsedRange.Cells.Clear
     
    End Sub
    Hervé.

  4. #4
    Membre averti
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Par défaut
    Bonjour,


    merci à vous deux, j'avais bien pensé à utilisé les filtres dans la feuille, mais comme je dois réutiliser et mettre en forme les résultats dans une fiche, j'avais décidé de passer directement par un Ufs.

    j'essaie donc l'idée de passer par l'étape d'une feuil intermédiaire, cela me permettra de traiter d'autre aspect plus tard.

    1/ j'ai modifié .AutoFilter 1, Atelier.Text par .AutoFilter 1, CmbAtelier.Text pour prendre en compte le choix du combo.

    2/ J'ai de temps en temps un bug sur le vidage de la feuille avec : Fe_Recup.UsedRange.Cells.Clear, je ne sais pas pourquoi


    3/ Par contre, ma liste se rempli à priori qu'avec la première ligne.
    Je vais essayer de voir ce qui ne va pas, je pense à un problème dans la boucle.

    A moins que l'on puisse directement éliminer les dates les plus anciennes directement dans la feuille. Je regarde tous cela...

    A bientôt, je vous tiens au courant.

    Bonjour,
    pour mon problème N° 3 :

    Par contre, ma liste se rempli à priori qu'avec la première ligne.
    J'ai trouvé la parade. En faite, la recherche d'info bloquait lorsque la cellule de la dernière colonne à droite était vide.
    Aussi, je pense dans ce cas mettre "_" au lieu de vides par macro.

    Pour le blocage sur Fe_Recup.UsedRange.Cells.Clear, je n'ai toujours pas d'explication.

    A bientôt

    ah, j'ai parlé un peu trop vite, j'ai en fait voulu prendre l'ensemble des colonnes à utiliser dans mon cas, j'ai donc rajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    .ColumnCount = 12
       .ColumnWidths = "55;60;30;50;40;200;15;15;100;100;100;100;100"
     
    //
     Set PlageDate = .Range(.Cells(Derlgn, 1), .Cells(.Rows.Count, 16).End(xlUp)) '15 : Nb de colonnes prise en compte dans la feuille,
     
    ///
      .Column(9, J) = Cel.Offset(0, 10).Value
      .Column(10, J) = Cel.Offset(0, 11).Value
      .Column(11, J) = Cel.Offset(0, 12).Value
    et maintenant j'ai un message d'erreur :
    impossible de lire la propriété column; .Column(10, J) = argument non valide
    ... je ne vois pas ce que je pourrais avoir oublié de modifier.

    Merci encore

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Effectivement, au delà de 9, il n'est plus possible de remplir la liste par une boucle. Utilise la propriété "RowSource". Pour ça, je pense qu'il te faut stocker les valeurs les unes au dessous des autres dans une plage que tu supprime à la fermeture de la Form.

    Hervé.

  6. #6
    Membre averti
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Par défaut Recherche données avec plusieurs critères imbriqués Répondre à la discussion
    Bonjour,
    Merci pour l'information, je vais essayer autrement.
    Je vous tiens au courant.

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

Discussions similaires

  1. Recherche avec plusieurs critères
    Par Eco dans le forum Excel
    Réponses: 12
    Dernier message: 20/07/2016, 18h07
  2. recherche verticale avec plusieurs critères
    Par timon37 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/02/2012, 23h36
  3. Recherche de données avec un critère spécifique
    Par TERRIBLE dans le forum Deski
    Réponses: 1
    Dernier message: 06/08/2010, 13h48
  4. [XL-2003] obtenir une donnée avec plusieurs critères de choix
    Par spico45 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/04/2009, 13h34
  5. VBA-E Comment réaliser une recherche avec plusieurs critères ?
    Par Larsen21 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 14/12/2006, 13h43

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