Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Macro copier/coller avec conditions

  • Initiateur de la discussion Initiateur de la discussion Mantix
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Mantix

XLDnaute Nouveau
Bonjour à toutes et à tous!

Je débute en VBA et je me retrouve face à un problème:

J'ai une source de donnée sur une feuille excel comportant 3 colonnes: des N°, des intitulés ainsi que des opérations.
Sur une autre feuille - présentation - j'ai organisé les opérations selon les intitulés et je voudrais creer une macro permettant de copier les N° de la feuille de donnée et de les coller au bon endroit.

Les explications ne sont pas très clair donc je vous joint un fichier "test" afin de mieux comprendre.

Merci d'avance !

Bien Cdt
 

Pièces jointes

Re : Macro copier/coller avec conditions

Bonjour Mantix et bienvenu, bonjour le forum,

Je te propose la maco ci-dessous :
Code:
Sub Macro1()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)

dl = Sheets("Données").Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne dl
For Each cel In Sheets("Données").Range("B5:B" & dl) 'boucle sur toutes les cellules éditée cel de la plage B5:Bdl...
    Select Case cel.Offset(0, 1).Value 'agit en fonction de la valeur de la cellule de la colonne C
        Case "OPERATIONS DM " 'cas "OPERATIONS DM " (attention il y a un espace à la fin... Faut il le laisser ou le supprimer partout ?)
            Set dest = Sheets("Résultat attendu").Range("D12").End(xlUp).Offset(1, 0) 'définit la cellule de destination
        Case "OPERATIONS SVS" 'cas "OPERATIONS SVS"
            Set dest = Sheets("Résultat attendu").Range("D29").End(xlUp).Offset(1, 0) 'définit la cellule de destination
        Case "01 - CHAUSSEES" 'cas "01 - CHAUSSEES"
            Set dest = Sheets("Résultat attendu").Range("D36").End(xlUp).Offset(1, 0) 'définit la cellule de destination
        Case "02 - OUVRAGES D'ART" 'cas "02 - OUVRAGES D'ART"
            Set dest = Sheets("Résultat attendu").Cells(Application.Rows.Count, 4).End(xlUp).Offset(1, 0) 'définit la cellule de destination
    End Select 'fin de l'action en fonction de...
    cel.Copy dest 'copie la cellule et la colle dans dest
Next cel 'prochaine cellule cel de la boucle
End Sub

Le fichier :
 

Pièces jointes

Re : Macro copier/coller avec conditions

Bonjour Robert,

Merci pour ta réponse!

J'ai une question supplémentaire: Est-il possible dans la macro de prendre en compte la colonne "opération"? car un intitulé peut correspondre à plusieurs opérations.

Cdt,
Mantix
 
Re : Macro copier/coller avec conditions

Bonjour Mantix, bonjour le forum,

C'est pas le cas dans ton exemple ! Quand j'ai ouvert ton fichier je me doutais que tu allais revenir à la charge avec ce genre d'argument...
Il suffit de rajouter un Select Case cel.Offset(0, 2) avec un cas Case "IMMOS" et un cas Case "EI"... Puis définir dest dans le second Select Case cel.Offset(0, 1) selon chaque cas. Le code que je t'ai fourni est suffisement commenté pour que tu puisses le modifier toi-même. Sinon, pour ne pas perdre de temps, envoie-nous le fichier original...
 
Re : Macro copier/coller avec conditions

Bonjour Mantix, bonjour le forum,

Mantix, à la différence des formules, qui acceptent le rajout/suppression de lignes et/ou colonnes dans le tableau tout en conservant le résultat, le VBA ne le fait pas. Le code est écrit pour une configuration précise. Tu rajoutes ou supprime une ligne ou une colonne et il ne fonctionne plus.
La présentation de l'onglet Résultat attendu ne paraît être l'exemple parfait de ce qu'il ne faut pas faire avec du VBA. J'imagine que l'exemple que tu fournis est juste une petit extrait de ton fichier original. Mais peut-être me trompe-je ? En tous cas, si je te propose un code et qu'ensuite il te faut rajouter un intitulé ou une opération, ce code ne marchera plus.
Donc soit tu me dis :
• "ça peut changer" et je te propose une autre solution (par exemple une onglet par opération)
• "c'est fixe et définitif" et je te propose le code...

En attendant ta réponse...


 
Re : Macro copier/coller avec conditions

Bonsoir Mantix, bonsoir le forum,

Tu n'étais vraiment pas loin... Comme le If... End IF, le Select Case doit être fermé par un End Select.
Le code :
Code:
Sub Macro2()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)

dl = Sheets("Données").Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne dl
For Each cel In Sheets("Données").Range("B5:B" & dl) 'boucle sur toutes les cellules éditée cel de la plage B5:Bdl...
    Select Case cel.Offset(0, 2) 'agit en fonction de la cellule de la colonne D
        Case "IMMOS" 'cas "IMMOS"
            Select Case cel.Offset(0, 1).Value 'agit en fonction de la valeur de la cellule de la colonne C
                Case "OPERATIONS DM " 'cas "OPERATIONS DM " (attention il y a un espace à la fin... Faut il le laisser ou le supprimer partout ?)
                    Set dest = Sheets("Résultat attendu").Range("D12").End(xlUp).Offset(1, 0) 'définit la cellule de destination
                Case "OPERATIONS SVS" 'cas "OPERATIONS SVS"
                    Set dest = Sheets("Résultat attendu").Range("D17").End(xlUp).Offset(1, 0) 'définit la cellule de destination
                Case "01 - CHAUSSEES" 'cas "01 - CHAUSSEES"
                    Set dest = Sheets("Résultat attendu").Range("D29").End(xlUp).Offset(1, 0) 'définit la cellule de destination
            End Select 'fin de l'action en fonction de la valeur de la cellule de la colonne C
        Case "EI" 'cas "EI"
            Select Case cel.Offset(0, 1).Value 'agit en fonction de la valeur de la cellule de la colonne C
                Case "01 - CHAUSSEES" 'cas "01 - CHAUSSEES"
                    Set dest = Sheets("Résultat attendu").Range("D36").End(xlUp).Offset(1, 0) 'définit la cellule de destination
                Case "02 - OUVRAGES D'ART" 'cas "02 - OUVRAGES D'ART"
                    Set dest = Sheets("Résultat attendu").Range("D53").End(xlUp).Offset(1, 0) 'définit la cellule de destination
            End Select 'fin de l'action en fonction de la valeur de la cellule de la colonne C
        Case "ICAS" 'cas "ICAS"
            Select Case cel.Offset(0, 1).Value 'agit en fonction de la valeur de la cellule de la colonne C
                Case "OPERATIONS SVS" 'cas "OPERATIONS SVS"
                    Set dest = Sheets("Résultat attendu").Range("D61").End(xlUp).Offset(1, 0) 'définit la cellule de destination
                Case "02 - OUVRAGES D'ART" 'cas "02 - OUVRAGES D'ART"
                    Set dest = Sheets("Résultat attendu").Cells(Application.Rows.Count, 4).End(xlUp).Offset(1, 0) 'définit la cellule de destination
            End Select 'fin de l'action en fonction de la valeur de la cellule de la colonne C
    End Select 'fin de l'action en fonction de la cellule de la colonne D
    cel.Copy dest 'copie la cellule et la colle dans dest
Next cel 'prochaine cellule cel de la boucle
End Sub
Le fichier :

 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
1 K
Réponses
10
Affichages
382
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…