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 :

Problème de duplication dans macro [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2016
    Messages : 6
    Par défaut Problème de duplication dans macro
    Bonjour à tous,

    J'ai fais une macro pour dupliquer les lignes de mon fichier si la colonne BX présente une chaine de caractère.
    Si BX <> de vide alors copie de la ligne, insertions d'une ligne en dessus et copie de la ligne.
    Puis suppression des données et collage de la donnée de BX.

    La Macro fonctionne correctement jusqu'au trois dernière ligne ou le Whiel passe directement en end sub.
    Je pense qu'il s'agit d'un pb dans ma variable mais je ne parviens pas l'identifier.

    Je suis débutant et il me semble que la solution est à portée de main mais je préfère m'en référer aux pros du forum :

    Ci-dessous ma 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
     
    Sub Duplik()
     
    Range("BX2").Select
     
    der = Range("a50000").End(xlUp).Row
     
    While ActiveCell.Row <= der
     
    If ActiveCell <> "" Then
        ActiveCell.Offset(1).EntireRow.Insert
        ActiveCell.EntireRow.Copy ActiveCell.Offset(1).EntireRow
        ActiveCell.Copy
        ActiveCell.Offset(1, -1).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        ActiveCell.Offset(0, 1).ClearContents
        ActiveCell.Offset(-1, 1).ClearContents
        ActiveCell.Offset(1, 1).Select
     
        Else
            ActiveCell.Offset(1, 0).Select
     
    End If
    Wend
    End Sub
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour !

    ! (voir les règles de ce forum …)

    Sinon la logique requière de partir de la dernière ligne pour remonter vers la première …

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tout d'abord, lis ça :
    http://club.developpez.com/regles/#LIII-E

    Quelques conseils :

    Pense à déclarer tes variables avec des Dim. Pour t'y obliger, mets en Option Explicit avant ton premier Sub.

    Au lieu de donner une valeur de ligne pour un End(xlUp), utilise Rows.Count. Comme ça tu es sûr que tu ne vas pas dépasser ta zone de recherche et que ton code s'adaptera aux version d'Excel.

    Evite autant que possible les Select : ils compliquent le code et ralentissent l'exécution.

    Je pense que ton problème vient du fait que tu calcules le nombre de lignes au début et que, comme tu rajoutes des lignes, au final le numéro de ta dernière ligne a changé.
    Quand on fait une procédure qui ajoute (ou supprime) des lignes, il faut toujours aller du bas vers le haut.

    En nettoyant un peu ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Duplik()
        Dim Lig As Long
        For Lig = Range("BX" & Rows.Count).End(xlUp).Row To 2 Step -1
           If Range("BX" & Lig).Text <> ""
               Rows(Lig).Copy
               Rows(Lig + 1).Insert
               Range("BX" & Lig).Copy Range("BW" & (Lig + 1))
               Range("BY" & Lig & ":BY" & (Lig + 1)).ClearContents
            End If
        Next Lig
        Application.CutCopyMode = False
    End Sub

  4. #4
    Membre habitué
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2016
    Messages : 6
    Par défaut
    Bonjour Mehnir et merci pour le lien.

    J'ai testé ta proposition et effectivement c'est optimisé.
    Je te remercie.

    J'ai effectué des mini ajustements mais le code fonctionne parfaitement.
    Il va falloir que j'apprenne à penser autrement mes codes pour les optimiser.

    Merci pour votre aide !

    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
    Sub Duplik2()
     
    Dim Lig As Long
     
    For Lig = Range("BX" & Rows.Count).End(xlUp).Row To 2 Step -1
        If Range("BX" & Lig).Text <> "" Then
           Rows(Lig).Copy
           Rows(Lig + 1).Insert
           Range("BX" & Lig).Copy Range("BW" & (Lig + 1))
           Range("Bx" & Lig & ":Bx" & (Lig + 1)).ClearContents
        End If
     
      Next Lig
     
            Application.CutCopyMode = False
     
    End Sub

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    J'avais zappé le Offset(1, -1).Select en milieu de boucle. C'est pour ça que j'avais appliqué le ClearContents à BY.
    Ca renforce l'idée que travailler avec les Select sont généralement une mauvaise idée.

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

Discussions similaires

  1. [XL-2007] Problème de recherche dans macro avec .find
    Par steelk dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 14/01/2015, 19h29
  2. Problème d'écriture dans macro..
    Par glpx65 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/07/2014, 20h48
  3. [VBA-E]problème d'indice pour macro dans perso.xls
    Par fred38 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/05/2007, 23h33
  4. [VBA-E] Problème de tableau dans macro VBA
    Par Chouls dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 12/06/2006, 15h20
  5. problème de condition dans une macro
    Par Skizo dans le forum Access
    Réponses: 3
    Dernier message: 15/05/2006, 11h22

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