Résolu Copier Coller ligne complète si une condition est respectée

LouisHSE

Habitué
Alors

Sub test() -> c'est parti mon kiki

Dim cel As Range -> dire que les cellules seront à copier
Dim source As Range -> cellules de la source seront à copier
Dim destination As Range -> la destination sera là où copier


Worksheets("test").UsedRange.Clear -> feuille test est la destination à copier en la remettant à zéro
Set destination = Worksheets("test").Range("A1") -> copier dans test à partir de A1
Sheets("Carto 11-2012").Range("A1:I2").Copy destination -> feuille carto, copier les cases A1 à I2 de base
Set destination = destination.Offset(2, 0) -> laisser un espace de 2 lignes sous la copie A1:I2


With Sheets("Carto 11-2012") -> avec la feuille carto
For Each cel In .Range("g3:g" & .Range("g" & .Rows.Count).End(xlUp).Row) -> pour toute cellule de la colonne G à partir de G3 ... ??
If cel.MergeCells Then -> si les cellules sont fusionnées alors
If source Is Nothing Then -> si la source n'est rien alors (?? hein ?)
Set source = cel.MergeArea.EntireRow -> définir que les cellules fusionnées en source sont une seule et même cellule sur la ligne complète


Else -> ou alors
Set source = Union(source, cel.MergeArea.EntireRow) -> définir que la source est une union entre la source et les cellules fusionnées sur la ligne complète (euh ?)
End If -> fin de si
ElseIf cel.Value >= 80 Then -> autrement si la cellule est >=80 alors
If source Is Nothing Then -> si la source est rien alors (encore what ??)
Set source = cel.EntireRow -> définir la source comme une ligne entière liée à ladite cellule


Else -> ou alors
Set source = Union(source, cel.EntireRow) -> définir la source comme une union entre la source et la ligne complète liée à la cellule
End If -> fin de if

End If -> fin de if


Next -> ensuite (jamais compris cette commande)

End With -> fin de avec
source.Copy destination -> copie de la source dans la destination
Worksheets("Carto 11-2012").Activate -> feuille carto activée (euhm ?)
Worksheets("Carto 11-2012").Range("A1").Select -> sélectionner la feuille carto et copier à partir de A1

End Sub -> over



 

drul

Obscur pro du hardware
Staff


C'est très bien d'avoir fait ce travail [s:p/1o3i]

Je te mets ici le soft commenté par mes soins, n'hésite pas à me demander tout ce qui n'est pas clair !

Code:
Sub test()
 
    Dim cel As Range            'déclaration d'une variable pour la boucle de type range
    Dim source As Range         'déclaration d'une variable qui servira de source pour la copie de donnée
    Dim destination As Range    'déclaration d'une variable qui servira de destination pour la copie de donnée
    
    Worksheets("test").UsedRange.Clear                          'On vide complètement la feuille de destination
    Set destination = Worksheets("test").Range("A1")            'Initialisation de la variable destination sur A1 de la feuille test
    Sheets("Carto 11-2012").Range("A1:I2").Copy destination     'Copie de l'entête A1:I2
    Set destination = destination.Offset(2, 0)                  'Déplacement de la cellule destination 2 lignes plus bas
    
    With Sheets("Carto 11-2012")    '"With" permet d'économiser un peu d'écriture, toute les commande commancant par "." se référeront automatiquement à Sheets("Carto 11-2012") à l'intérieur du with
        For Each cel In .Range("g3:g" & .Range("g" & .Rows.Count).End(xlUp).Row) 'on boucle sur toutes les cellules de G3 à la dernière cellule occupée de la colonne G
            If cel.MergeCells Then 'si la cellule est fusionnée
                If source Is Nothing Then ' si la source n'est pas initialisé
                
                'petite parenthèse, si on lit une variable objet non initialisée alors le soft plante
                'N.B. en relisant mon code je remarque qu'on pourrait facilement améliorer qqch ici ...
                
                    Set source = cel.MergeArea.EntireRow 'alors on l'initialise avec l'ensemble des lignes fusionnées
                Else 'si elle est déjà initialisée
                    Set source = Union(source, cel.MergeArea.EntireRow) 'alors on rajoute les lignes fusionnées à la source
                End If ' fin de si
            ElseIf cel.Value >= 80 Then 'si le contenu de cel est plus grand ou égal à 80
                If source Is Nothing Then 'si la source n'est pas initialisé
                    Set source = cel.EntireRow 'alors on l'initialise avec l'ensemble des lignes fusionnées
                Else 'si elle est déjà initialisée
                    Set source = Union(source, cel.EntireRow) 'alors on rajoute les lignes fusionnées à la source
                End If ' fin de si
 
            End If 'fin de si
 
         Next 'prochain élément de la boucle for each (y a rien à comprendre c'est la synthaxe d'une boucle for ... next)
 
    End With ' fin du with
    source.Copy destination 'et hop on copie d'un coup toutes les cellule qu'on n'a mis dans source
    'N.B. il serait possible de copier ligne à ligne sans utilisé le union, mais le moins souvent on écrit dans une feuille, le plus vite va la macro
    Worksheets("Carto 11-2012").Activate 'On active la feuille Carto (optionnel)
    Worksheets("Carto 11-2012").Range("A1").Select 'Et on sélectionne la case A1 (la aussi optionnel)
 

drul

Obscur pro du hardware
Staff
et finalement compactage de code :

Code:
Sub test()
    Dim cel As Range            'déclaration d'une variable pour la boucle de type range
    Dim source As Range         'déclaration d'une variable qui servira de source pour la copie de donnée
    
    Worksheets("test").UsedRange.Clear                          'On vide complètement la feuille de destination
    Set source = Sheets("Carto 11-2012").Range("A1:I2").EntireRow 'Initialisation de source avec l'entête de la feuille source
    
    With Sheets("Carto 11-2012")    '"With" permet d'économiser un peu d'écriture, toute les commande commancant par "." se référeront automatiquement à Sheets("Carto 11-2012") à l'intérieur du with
        For Each cel In .Range("g3:g" & .Range("g" & .Rows.Count).End(xlUp).Row) 'on boucle sur toutes les cellules de G3 à la dernière cellule occupée de la colonne G
            If cel.MergeCells Then 'si la cellule est fusionnée
                Set source = Union(source, cel.MergeArea.EntireRow) 'on rajoute les lignes fusionnées à la source
            ElseIf cel.Value >= 80 Then 'si le contenu de cel est plus grand ou égal à 80
                Set source = Union(source, cel.EntireRow) 'alors on rajoute les lignes fusionnées à la source
            End If 'fin de si
         Next 'prochain élément de la boucle for each (y a rien à comprendre c'est la synthaxe d'une boucle for ... next)
    End With ' fin du with
    
    source.Copy Worksheets("test").Range("A1") 'et hop on copie d'un coup toutes les cellule qu'on n'a mis dans source

    Worksheets("Carto 11-2012").Activate 'On active la feuille Carto (optionnel)
    Worksheets("Carto 11-2012").Range("A1").Select 'Et on sélectionne la case A1 (la aussi optionnel)
End Sub
 

LouisHSE

Habitué
oyé... J'ai donc eu "bon" sur les End if et la valeur >=80 :pt1cable:

du coup j'ai laissé tomber l'idée de faire que le code crée une nouvelle feuille à chaque modif de la feuille source. J'ai copié le code sur un doc word en mettant les choses à changer x')
 

magellan

Modérâleur
Staff
Tu peux être fière de toi :merci: Beaucoup de gens pensent pouvoir demander du code sans même avoir à le comprendre, alors que tu as accepté la démarche de chercher à en saisir le sens, et qui plus est tu es allée au bout de l'exercice avec détermination.

Chapeau!
 

drul

Obscur pro du hardware
Staff
[s:p/1iex]

@magellan: pour info t'as les droits de modérations ici ?
 

LouisHSE

Habitué
J'ai compris les explications mais par contre de là à refaire un code entier tout seul ... y a un monde.

Tout forum a ses règles, et puis si je voulais juste un code sans me triturer les méninges (j'ai horreur de pas comprendre les choses en fait), j'aurais payé quelqu'un pour haha
 

drul

Obscur pro du hardware
Staff
C'est en forgeant, gnagnagna ... [:turlupin-en-ptard]

La prochaine fois tu essaies par toi-même et quand ça coince tu viens demandé ;)

Ce qu'il faut toujours faire: c'est découpé en tout petit morceaux que tu test un à un, user et abuser des points d'arrêts et des msgbox pour voir les états intermédiaires des variables, demander à google, le VBA est très utilisé et on trouve à peu près tout ce que l'on veut (souvent en anglais toutefois).
Ne pas se gêner d'aller sur le site de msdn ou toutes les fonctions VBA sont répertoriées et documentées, avec des exemples (et en français).
 

magellan

Modérâleur
Staff


pas dans la section programmation, pourquoi? (si tu veux des précisions passe en mp ;) )
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 028
Membres
1 586 388
Dernier membre
mery2005
Partager cette page
Haut