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 :

Copier en comparant deux numéros


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Copier en comparant deux numéros
    Bonjour à tous!

    Je vous explique mon blocage:

    Je copie d'une feuille à une autre des informations (Feuil1 et Feuil2).
    J'aimerais avant de copier mes données de la Feuil1 à la Feuil2, comparer les nombres des colonnes B.
    Si le nombre que je souhaite coller existe déja dans la Feuil2, je souhaite remplacer la ligne par la nouvelle (Feuil1).
    En revanche, si le nombre n'existe pas, j'aimerai l'ajouter mais par ordre croissant (qu'il trouve tout seul sa place au milieu de tous..).

    Est-ce possible?

    Merci d'avance pour votre aide

    Chouki60.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    Une possibilité serait:

    - Pour chaque ligne de ta feuille 1 tester si ton nombre de ta colonne B est le même dans la feuille 2.

    - Si oui, tu remplaces la ligne correspondante dans la feuille 2. Si non, tu la copies à la fin dans la feuille 2

    - Et pour finir tu tries les données de la feuille 2 suivant ta colonne B.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Bonjour à tous,

    Voici le code que j'ai fait ce matin, mais (evidemment) cela ne fonctionne pas..
    J'ai une erreur au niveau de la ligne 6 : "Erreur d'exécution '1004': erreur définie par l'application ou par l'objet".

    Quelqu'un pourrait me dire comment corriger cette erreur?

    Merci !

    Chouki.

    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
    Private Sub recherche()
    Dim ws1 As Worksheet, ws2 As Worksheet, i1, i2, k, kk, z
    Set ws1 = Worksheets("Essai")
    Set ws2 = Worksheets("Recopie")
    ' tableau de page essai
    i1 = ws1.Range("A8").End(20).Row
    ' tableau de page recopie
    i2 = ws2.Range("A8").End(35).Row
    'je me positionne page essai
    With ws1
    'au niveau du 8
      For k = 8 To i1
        'je commence au B8
        z = .Range("B" & k)  
     'je me met maintenant à 8 mais sur la feuille recopie    
         For kk = 8 To i2  
         'je commence au B8
            If z = ws2.Range("B" & kk) Then
            'si c'est le même numéro alors je recopie toutes les données de la feuille essai dans la feuille recopie
            ws2.Range("B" & i3 + 8) = z
            ws2.Range("E" & i3 + 8) = .Range("C" & k)
            ws2.Range("F" & i3 + 8) = .Range("D" & k)
            ws2.Range("G" & i3 + 8) = .Range("E" & k)
            ws2.Range("H" & i3 + 8) = .Range("F" & k)
            ws2.Range("I" & i3 + 8) = .Range("G" & k)
            ws2.Range("O" & i3 + 8) = .Range("H" & k)
            ws2.Range("P" & i3 + 8) = .Range("I" & k)
            ws2.Range("Q" & i3 + 8) = .Range("J" & k)
            ws2.Range("R" & i3 + 8) = .Range("K" & k)
            ws2.Range("S" & i3 + 8) = .Range("L" & k)
            ws2.Range("T" & i3 + 8) = .Range("M" & k)
            ws2.Range("U" & i3 + 8) = .Range("N" & k)
            ws2.Range("V" & i3 + 8) = .Range("O" & k)
            ws2.Range("W" & i3 + 8) = .Range("P" & k)
            ws2.Range("X" & i3 + 8) = .Range("Q" & k)
            ws2.Range("Y" & i3 + 8) = .Range("R" & k)
            ws2.Range("Z" & i3 + 8) = .Range("S" & k)
            ws2.Range("AA" & i3 + 8) = .Range("T" & k)
            ws2.Range("A" & i3 + 8) = .Range("A" & k)      
            'j'augmente de 1
            i3 = i3 + 1
            End If
         Next
      Next
    End With
    End Sub

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Quelques pistes:

    - C'est pas obligatoire en VBA mais c'est quand même mieux de typer ses variables donc tu pourrais déclarer les variables i1, i2, k, kk, z comme des types Long.

    - Pour trouver la dernière ligne de ta feuille c'est plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i1 = ws1.Range("A8").End(xlDown).Row
    i2 = ws1.Range("A8").End(xlDown).Row
    - Pour copier une ligne entière, tu peux utiliser:


  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup pour ces conseils ! J'ai donc un programme qui fonctionne concernant le test d'un numéro existant.

    J'ai aussi réussi à mettre les données dans l'odre croissant.

    Par contre, je n'arrive pas à copier les données (si le numéro n'existe pas) à la place de la première ligne vide.

    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     ' Dernière ligne vide dans la feuille recopie
        lgLigFinH = Worksheets("Recopie").Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
        ' Dernière ligne dans la feuille essai
        lgLigFinM = Worksheets("Essai").Range("A" & Cells.Rows.Count).End(xlUp).Row
     
        ' Copier les données de la feuille essai dans la première ligne vide de la feuille recopie
        Worksheets("Essai").Range("A8:B" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("A" & lgLigFinH)
        Worksheets("Essai").Range("C8:G" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("E" & lgLigFinH)
        Worksheets("Essai").Range("H8:T" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("O" & lgLigFinH)
    Le problème est que ce bout de code tourne à l'infini, c'est à dire qu'il me recopie l'ensemble des données plusieurs fois, jusqu'à ce que la feuille recopie soit remplie..

    Une astuce ?

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Attention à lgLigFinM, il manque '+1' à la fin pour que ça désigne la première ligne vide de ta feuille de destination.

    Sinon pour le fait que ça te remplisse ta feuille, c'est probablement que ce code se trouve dans une boucle et que la condition de sortie de la boucle n'est pas bonne.

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Ok, j'ai modifié la boucle, ça fonctionne mieux !
    Mais toujours un petit bug

    Ce qui ne fonctionne pas :
    Lorsque deux numéros sont identiques entre la feuille "essai" et la feuille "recopie", je veux remplacer les données de la feuille "recopie" par les données de la feuille "essai".
    Ceci fonctionne bien cependant, le code que j'ai fait me copie deux fois la ligne à remplacer..

    Une idée?

    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
    Private Sub recherche()
    Dim ws1 As Worksheet, ws2 As Worksheet, i1 As Long, i2 As Long, k As Long, kk As Long, z As Long
    Set ws1 = Worksheets("Essai")
    Set ws2 = Worksheets("Recopie")
    i1 = ws1.Range("A8").End(xlDown).Row
    i2 = ws2.Range("A8").End(xlDown).Row
    With ws1
      For k = 8 To i1
        z = .Range("B" & k)    
         For kk = 8 To i2   
            If z = ws2.Range("B" & kk) Then             
            'si c'est le même numéro alors je recopie toutes les données de la feuille essai dans la feuille recopie
            ws2.Range("B" & kk) = z
            ws2.Range("E" & kk) = .Range("C" & k)
            ws2.Range("F" & kk) = .Range("D" & k)
            ws2.Range("G" & kk) = .Range("E" & k)
            ws2.Range("H" & kk) = .Range("F" & k)
            ws2.Range("I" & kk) = .Range("G" & k)
            ws2.Range("O" & kk) = .Range("H" & k)
            ws2.Range("P" & kk) = .Range("I" & k)
            ws2.Range("Q" & kk) = .Range("J" & k)
            ws2.Range("R" & kk) = .Range("K" & k)
            ws2.Range("S" & kk) = .Range("L" & k)
            ws2.Range("T" & kk) = .Range("M" & k)
            ws2.Range("U" & kk) = .Range("N" & k)
            ws2.Range("V" & kk) = .Range("O" & k)
            ws2.Range("W" & kk) = .Range("P" & k)
            ws2.Range("X" & kk) = .Range("Q" & k)
            ws2.Range("Y" & kk) = .Range("R" & k)
            ws2.Range("Z" & kk) = .Range("S" & k)
            ws2.Range("AA" & kk) = .Range("T" & k)
            ws2.Range("A" & kk) = .Range("A" & k)
     
            End If
        Next
      Next
    End With
     
     
           'sinon, je recopie les données dans une ligne qui n'est pas occupée
     
     
        ' Dernière ligne vide dans la feuille recopie
        lgLigFinH = Worksheets("Recopie").Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
        ' Dernière ligne dans la feuille essai
        lgLigFinM = Worksheets("Essai").Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
        ' Copier les données de la feuille "essai" dans la première ligne vide de la feuille recopie
        Worksheets("Essai").Range("A8:B" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("A" & lgLigFinH)
        Worksheets("Essai").Range("C8:G" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("E" & lgLigFinH)
        Worksheets("Essai").Range("H8:T" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("O" & lgLigFinH)
     
     
    'et puis maintenant je trie par odre croissant
        Range("A8:AA1000").Select
        Selection.Sort Key1:=Range("B8"), Order1:=xlAscending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    End Sub

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Citation Envoyé par chouki60 Voir le message
    le code que j'ai fait me copie deux fois la ligne à remplacer..
    Qu'entends-tu par "copie 2 fois", que la ligne de la feuille Essai est copiée en double sur 2 lignes consécutives de la feuille Recopie?

    Sinon, étant donné que la partie de ton code qui traite le cas où "ton nombre n'existe pas" se trouve en dehors de la boucle, je doute que cela te donne le résultat attendu...

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Qu'entends-tu par "copie 2 fois", que la ligne de la feuille Essai est copiée en double sur 2 lignes consécutives de la feuille Recopie?
    C'est exactement ça oui.

    Sinon, malgré que le code soit hors de la boucle, le cas où le nombre n'existe pas fonctionne très bien.

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Tu es sûre que c'est la nouvelle ligne qui est copiée 2 fois ou que l'ancienne est conservée (il y aurait donc la nouvelle et l'ancienne).

    Parce qu'à priori, je ne vois pas pourquoi ton code aurait ce comportement...
    Tu peux toujours essayer de ne copier que la valeur pour voir si ça résout le problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws2.Range("B" & kk).Value = z.Value  'et pareil pour les suivantes

    Sinon, malgré que le code soit hors de la boucle, le cas où le nombre n'existe pas fonctionne très bien.
    Pourtant tout ce que cela devrait faire, c'est copier la dernière ligne de ta feuille "Essai" sur la dernière ligne vide de ta feuille "Recopie"...

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par Sclarckone Voir le message
    Tu es sûre que c'est la nouvelle ligne qui est copiée 2 fois ou que l'ancienne est conservée (il y aurait donc la nouvelle et l'ancienne).
    C'est bien ce qui se passe, je viens de vérifier, la nouvelle ligne se copie deux fois.

    Citation Envoyé par Sclarckone Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws2.Range("B" & kk).Value = z.Value  'et pareil pour les suivantes
    Ce code ne change pas du tout mon problème, cela copie toujours deux fois la même ligne


    Citation Envoyé par Sclarckone Voir le message
    Pourtant tout ce que cela devrait faire, c'est copier la dernière ligne de ta feuille "Essai" sur la dernière ligne vide de ta feuille "Recopie"...
    Je viens de re-tester, ça marche pour toutes les nouvelles lignes..

    En tout merci de prendre le temps pour mon problème !
    Une autre idée?

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Je ne comprends pas pourquoi en tout cas. Si ton fichier ne contient pas de données confidentielles, mets-le en pièce jointe que je puisse jeter un œil à ta macro...

  13. #13
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    J'ai essayé de mettre en pièce jointe mon document cependant je ne peux pas car "la marque de sécurité est manquante".. c'est à dire?

Discussions similaires

  1. [XL-2010] Comparer deux cellules et copier valeur
    Par debutanteVba dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/02/2014, 13h53
  2. Réponses: 0
    Dernier message: 15/11/2012, 19h47
  3. [XL-2003] Comparer deux feuilles et copier les valeurs équivalentes sur une troisième
    Par Julzz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/08/2011, 14h02
  4. Comparer deux numéros de version
    Par ben130978 dans le forum Langage
    Réponses: 2
    Dernier message: 30/01/2008, 16h58
  5. [date] Comparer deux formats différents
    Par terziann dans le forum Requêtes
    Réponses: 17
    Dernier message: 21/07/2003, 15h21

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