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 :

Find, MaPlage et problème de compilation : toutes les données ne sont pas compilées….


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut Find, MaPlage et problème de compilation : toutes les données ne sont pas compilées….
    Bonjour,

    J'ai un classeur, 53 feuilles (=1 par semaine + 1 Feuille "Récap"). Dans chaque feuille, la même structure de colonne : Nom/Prénom/Date RDV, etc……

    Les dates de RDV peuvent changer d'une semaine à l'autre, ou non.

    Je cherche à "compiler" toutes les dates de RDV dans 1 seule Feuille : "Récap" : 2 colonnes : Nom/RDV

    Donc, j'essaye de boucler sur toutes les feuilles, de chercher le nom et regarder si la date de RDV a changée, et si OUI, je la mets dans dans "Récap". J'ai fait :

    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
    nb = Worksheets.Count
     
    For j = 1 To nb
     
    If Left(Worksheets(j).Name, 1) = "S" Then 'les feuilles sont nommées « S01 », etc…
     
        With Worksheets(j)
        DerligR1 = .Range("a" & .Rows.Count).End(xlUp).Row
        End With
     
     
        With Sheets("Récap")
        DerligR2 = .Range("a" & .Rows.Count).End(xlUp).Row
        Set MaPlage = .Range(.Cells(1, 1), .Cells(DerligR2, 2))
        End With
        For i = 2 To DerligR1
            With MaPlage
            Set c = .Find(Worksheets(j).Range("c" & i), LookIn:=xlValues, lookat:=xlWhole)
                If c Is Nothing Then
                ajoutRDV = ajoutRDV + 1
                Sheets("Récap").Cells(DerligR2 + ajoutRDV, 1) = Worksheets(j).Cells(i, 1)
                Sheets("Récap").Cells(DerligR2 + ajoutRDV, 2) = Worksheets(j).Cells(i, 3)
                End If
            End With
        Next i
    End If
    Next
    Mais, j'ai un souci : tous les RDV ne se compilent pas….il m'en manque dans "Récap"

    J'ai essayé plusieurs choses, sans succès, notamment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set d = .Find(Worksheets(j).Range("a" & i), LookIn:=xlValues, lookat:=xlWhole)
    if (c is nothing and d is nothing) then
    ,
    Permettrait de "regarder" dans "MaPlage", si le nom est trouvé et si la date de RDV est différente de celle déjà enregistrée dans MaPlage, alors, je rajoute dans "Récap"….car apparemment, c'est là où si se situe le problème….

    Une petite aide ?

    Merci,

    A+

  2. #2
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour ericdev67.

    Tu cherches dans les colonnes A et B De Recap les dates qui sont dans la colonne C des 52 autres feuilles.

    Si tu cherches des dates dans des cellules au format Date et dont la valeur n'est pas le résultat d'une formule, remplace


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find(Worksheets(j).Range("c" & i), LookIn:=xlValues, lookat:=xlWhole)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find(CDate(Worksheets(j).Range("c" & i)), LookIn:=xlFormulas, lookat:=xlWhole)
    Mais le plus sûr moyen est une itération pour comparer chacune des cellules.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For i = 2 To DerligR1
     
    For k = 2 To DerligR2
     
    If  Worksheets(j).Range("c" & i) = Sheets("Récap").Range("b" & k) then
     Trouver = True
    End if
     
    Next
     
    Next
    Cordialement

    Docmarti.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Merci Docmarti,

    Effectivement le simple est toujours le mieux……j'avais opté pour la méthode MaPlage et Find, car dans chaque feuille (et donc dans "Récap"), il y avait beaucoup de données, et donc cela me permettait d'être plus rapide que 2 boucle imbriquées, mais……tu as raison, au moins, je suis certain du résultat…..

    J'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With MaPlage
            Set c = .Find(Worksheets(j).Range("a" & i)&Worksheets(j).Range("c" & i), LookIn:=xlValues, lookat:=xlWhole)
                If c Is Nothing Then
                ajoutRDV = ajoutRDV + 1
                Sheets("Récap").Cells(DerligR2 + ajoutRDV, 1) = Worksheets(j).Cells(i, 1)
                Sheets("Récap").Cells(DerligR2 + ajoutRDV, 2) = Worksheets(j).Cells(i, 3)
    Sheets("Récap").Cells(DerligR2 + ajoutRDV, 3) = Worksheets(j).Cells(i, 1)&Worksheets(j).Cells(i, 3)
                End If
            End With
    me permettant de compiler les données en étant certain d'éviter les doublons (je sais, pas très joli, mais ça fonctionnait…), et finalement, je n'ai pas "gagné" plus de temps que cela, je reste donc sur ta méthode de boucle imbriquée….

    Merci,

    A+ pour de prochaines aventures….

  4. #4
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    ericdev67.

    La recherche de Find avec XlValues est très pointue et sensible à différentes conditions : largeur de la colonne, format des cellules....

    Voici ce qu'il faudrait pour rechercher efficacement avec XlValues comme paramètre de Find:

    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
     
    Sub RechercheDatesAvec_Find_XlValues()
     
       Set MaPlage = Nothing
     
        nb = Worksheets.Count
     
        For j = 1 To nb
     
            If Left(Worksheets(j).Name, 1) = "S" Then 'les feuilles sont nommées « S01 », etc…
                Worksheets(j).Select
                With Worksheets(j)
                    DerligR1 = .Range("a" & .Rows.Count).End(xlUp).Row
                End With
     
                With Sheets("Récap")
                    DerligR2 = .Range("a" & .Rows.Count).End(xlUp).Row
     
                    'Definir toute la colonne B comme champ de recherche
                    'car on va y ajouter des donnees
                    Set MaPlage = .Range("B:B")
                    'Pour chercher une valeur de type Date avec xlValues,
                    'le champ de recherche doit obligatoirement etre au format special "m/d/yyyy"
                    MaPlage.NumberFormat = "m/d/yyyy"
                    'et les valeurs doivent etre visibles
                    'Donc rendre visibles les valeurs
                    .Columns(MaPlage.Column).AutoFit
                    MaPlage.ShrinkToFit = True
     
                End With
     
                For i = 2 To DerligR1
     
                    If Trim(Worksheets(j).Range("c" & i)) <> "" Then
                        If IsDate(Worksheets(j).Range("c" & i)) Or IsNumeric(Worksheets(j).Range("c" & i)) Then
                            With MaPlage
                                Set c = .Find(CDate(Worksheets(j).Range("c" & i)), LookIn:=xlValues, LookAt:=xlWhole, SearchFormat:=False, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
     
                                If c Is Nothing Then
                                    ajoutRDV = ajoutRDV + 1
                                    Sheets("Récap").Cells(DerligR2 + ajoutRDV, 1) = Worksheets(j).Cells(i, 1)
                                    Sheets("Récap").Cells(DerligR2 + ajoutRDV, 2) = CDate(Worksheets(j).Cells(i, 3))
     
                                   'Rendre bien visible la nouvelle entree dans le champ de recherche
                                    Sheets("Récap").Columns(MaPlage.Column).AutoFit
     
                                End If
                            End With
                        End If
                    End If
                Next i
            End If
     
        Next
      If Not MaPlage Is Nothing Then MaPlage.ShrinkToFit = False
     
    End Sub
    Cordialement

    Docmarti.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 855
    Points : 368
    Points
    368
    Par défaut
    Merci Docmarti,

    Par sécurité, je vais écouter tes conseils, je change mon code….

    Merci pour tous ces éclaircissements,

    A+ pour de nouvelles aventures….

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/06/2008, 11h01
  2. Réponses: 5
    Dernier message: 03/04/2008, 13h00
  3. Réponses: 5
    Dernier message: 03/03/2008, 11h31
  4. Debutant : les tests ne sont pas compilés
    Par jdvacheron dans le forum Maven
    Réponses: 1
    Dernier message: 03/07/2007, 17h19
  5. Réponses: 1
    Dernier message: 16/05/2007, 15h52

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