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 :

bug dans macro de copy-insert inéxpliquable


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 20
    Points : 14
    Points
    14
    Par défaut bug dans macro de copy-insert inéxpliquable
    bonjour, ma macro contient une forme de bug
    celle ci est assez simple, elle copie une ligne i et la colle 9 fois en dessous de la ligne i (puis applique des modifs à l'une des cases)
    afin de faire cela dans l'ordre, le programme va toujours chercher la meme ligne de facon redondante. hors de facon récurente le programme insert une ligne placé 4 ou 5 ligne plus haut (en passant par la partie en rouge.)
    auriez vous une explication


    macro :

    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
    Sub duplicate()
    
    Dim i As Integer
    
    For i = [470] To [2] Step -1
    
        If Cells(i, 4) <> Cells(i - 1, 4) Then
            If Right(Left(Cells(i, 4), 3), 1) = "1" And Right(Cells(i, 4), 1) = "2" Then
        
                Rows(i - 1).Select
                Selection.Copy
                Selection.Insert
                Cells(i, 5).Select
                Selection = Left(Cells(i, 4), 3) & "C09"
        
                Rows(i).Select
                Selection.Copy
                Selection.Insert
                Cells(i, 5).Select
                Selection = Left(Cells(i, 4), 3) & "C09"
        
                Rows(i + 1).Select
                Selection.Copy
                Selection.Insert
                Cells(i, 5).Select
                Selection = Left(Cells(i, 4), 3) & "C09"
        
            End If
        
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A03"
        
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A03"
            
            Rows(i - 1).Select
            Selection.Copy
            Selection.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A03"
            
            Rows(i - 1).Select
            Selection.Copy
            Selection.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A02"
            
            Rows(i - 1).Select
            Selection.Copy
            Selection.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A02"
            
            Rows(i - 1).Select
            Selection.Copy
            Selection.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A02"
            
            Rows(i - 1).Select
            Selection.Copy
            Selection.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A01"
            
            Rows(i - 1).Select
            Selection.Copy
            Selection.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A01"
            
            Rows(i - 1).Select
            Selection.Copy
            Selection.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A01"        
        End If
    
    Next i
    
    End Sub

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    C'est tout simplement parce-que tu te fais des croche-pieds avec la boucle For... to
    Utilise plutot une boucle While en remontant du bas vers le haut et décale vers le haut, lorsque tu insères, du nombre le lignes insérées.
    Ta boucle do while doit donc démarrer à la ligne 470 et continuer tant que le n+ de ligne est inférieur à 3 (2 + 1)
    Simulacre en français, en mécanisme simplifié...
    .
    - je pars de la ligne 422 et boucle tant que pas sur ligne < 3

    - Boucle, donc, jusqu'à arriver à la ligne 3
    - je lis la ligne en cours et la compare à celle du dessus
    - si j'insère n lignes, je fais un offset de -n lignes
    - fin boucle

    Ceci étant dit : il me semple que tu aurais plutôt intérêt à t'intéresser, par ailleurs à la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expression.Insert(Décalage, CopierOrigine)
    ou expression représente un range

    (vois ce que c'est dans ton aide en ligne...)

    EDIT :
    Tu comprendras mieux maintenant pourquoi je te posais hier une question (restée sans réponse) ici :

    http://www.developpez.net/forums/d84...gne-condition/
    2) soit très précis

    Citation:
    "est differente de la meme cellule de la ligne superieur, de copier et d'inserer cette ligne 8 fois en dessous "
    Fin de citation

    "en dessous" de quoi, très exactement ? de la ligne en cours ? de la ligne au-dessus ? tout en bas de tout ?
    Je voyais venir le coup des croches-pieds ....

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Salut, Ousk
    Ben ... en ligne 3 il compare avec la ligne 2 (incluse dans sa plage d'examen)...
    Il faut bien qu'il s'y rende ...

    EDIT : attends, là.... je viens de le relire ... sa plage d'examen comprend la ligne 1
    C'est donc tant que > 1 ou jusqu'à ce que = 2 (c'est pareil)

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    merci pour toutes ces réponses (ainsi que pour l'autre question)

    apres avoir cherché un moment je me suis rendu compte que le probleme venait moins de la macro que du fait que les cellules de références etaient des formules (j'ignorais que cela pouvais poser des problemes)
    voici ma macro finis et qui marche (pour info)!!!
    et merci pour la ligne de code innsertorigine , je ne connaissais pas

    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
    Sub duplicate()
     
    Dim i As Integer
     
    For i = [470] To [3] Step -1
     
        If Cells(i, 4).Value <> Cells(i - 1, 4).Value Then
     
     
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A03"
     
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A03"
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A03"
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A02"
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A02"
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A02"
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A01"
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A01"
     
            Rows(i - 1).Select
            Selection.Copy
            Selection.EntireRow.Insert
            Cells(i, 5).Select
            Selection = Left(Cells(i, 5), 6) & "A01"
            End If
     
            If Right(Left(Cells((i - 1), 5), 3), 1) = "2" And Right(Cells((i - 1), 5), 1) = "1" And Right(Cells((i + 3), 5), 3) <> "C09" Then
     
                Rows(i - 1).Select
                Selection.Copy
                Selection.Insert
                Cells(i, 5).Select
                Selection = Left(Cells(i, 5), 6) & "C09"
     
                Rows(i).Select
                Selection.Copy
                Selection.Insert
                Cells(i, 5).Select
                Selection = Left(Cells(i, 5), 6) & "C09"
     
                Rows(i + 1).Select
                Selection.Copy
                Selection.Insert
                Cells(i, 5).Select
                Selection = Left(Cells(i, 5), 6) & "C09"
      End If
     
    Next i
     
    End Sub

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

Discussions similaires

  1. Bug dans une macro de copie de tableau Excel dans PPT
    Par sachadupuy dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 27/05/2014, 11h29
  2. [XL-2010] Bug dans macro qui reunit plusieurs doc word en 1 seul
    Par dany13 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/05/2012, 11h23
  3. [XL-2000] Petit bug dans ma macro
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 19/05/2010, 15h04
  4. [XL-2003] Macro VBA copie valeur cellule excel et colle dans doc word
    Par tony020422 dans le forum Macros et VBA Excel
    Réponses: 54
    Dernier message: 03/06/2009, 09h21
  5. bug dans une macro
    Par lsebastien dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/01/2009, 17h14

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