Macro condition

Bonjour à tous,

Je souhaiterai faire une macro avec des conditions. Jusque là pas de souci, cependant il y a certaines spécificités que je n'arrive pas à mettre en place.

SI dans la "feuil1", "Tableau1" il y a une/des cellules de la colonne E contenant "P1" OU "P0" ALORS copier la/les ligne(s) à partir de la colonne A jusqu'à E dans le tableau13 de la "feuil2" à la/aux dernières lignes de ce tableau.

Je n'arrive pas à définir la sélection de la ligne des cellules actives, ainsi que le fait des les copier à la fin du tableau13.

Je vous remercie par avance pour votre retour et vous souhaite une bonne journée

Diane

3exemple.xlsx (14.18 Ko)

Bonjour,

Un test à voir

8exemple-1.xlsm (22.62 Ko)

Merci pour ce retour.

Cela fonctionne. Serait-il possible de rajouter une condition ?

Le tableau en "feuil1" sera complété au fur et à mesure avec de nouvelle référence. Du coup, il serai nécessaire qu'il n'y ai pas de doublon dans le "tableau13" et que se soit une MAJ avec les nouvelles références.

Merci d'avance.

Re,

Avec un tri sur la Référence et la suppression des doublons sur les Références en gardant le plus récent en date

13exemple-1.xlsm (24.23 Ko)

Merci, c'est parfait !

Bonjour,

Tu travailles avec des tableaux Excel, il t'appartient donc d'utiliser les avantages qu'ils présentent.

Ces tableaux sont des objets appartenant à une collection ListObjects. Un objet ListObject dispose d'une propriété Range, qui renvoie la plage correspondant à la totalité du tableau, et d'une propriété DataBodyRange qui renvoie la plage correspondant aux données (hors ligne d'en-tête.

En outre, Excel introduit automatiquement le nom du tableau dans le gestionnaire de noms, ce nom correspond à la plage de données (DataBodyRange), et on peut l'utiliser en VBA à l'instar du nom de plage pour atteindre le tableau...

L'utilisation de ce nom permet de se dispenser de toute référence aux feuilles concernées, ce qui est déjà très confortable ! Au cas où il y aurait à conserver des mises en forme particulières lors d'une opération, on n'a pas non plus à s'en préoccuper, les tableaux l'assurent automatiquement... On peut donc éviter le copier-coller lors d'une opération de transfert, au profit d'une affectation de valeurs, sans avoir à rétablir de mise en forme, le tableau s'en charge.

Et on affecte sous le tableau existant, sans se préoccuper de la suite, ce qu'on ajoute est automatiquement incorporé par Excel au tableau.

Une seule condition à laquelle il faut veiller pour une utilisation correcte. Un tableau Excel ne doit jamais comporter de lignes vides (sauf la première, lors du démarrage, sans quoi il n'existerait pas), donc ne jamais l'étendre manuellement, mais le laisser s'étendre automatiquement...

Ceci étant posé, on peut utiliser efficacement VBA pour réaliser ton opération :

Sub TransfertLignes()
    Dim LTft(), i%, n%, lni%
    With [Tableau1]
        For i = 1 To .Rows.Count
            If .Cells(i, 5) = "P0" Or .Cells(i, 5) = "P1" Then
                ReDim Preserve LTft(n)
                LTft(n) = .Rows(i): n = n + 1
            End If
        Next i
    End With
    If n = 0 Then Exit Sub
    With [Tableau13]
        lni = .Rows.Count + 1
        If lni = 2 Then lni = IIf(.Cells(1, 1) <> "", 2, 1)
        .Rows(lni).Resize(n).Value = WorksheetFunction.Transpose( _
         WorksheetFunction.Transpose(LTft))
        .Worksheet.Activate
    End With
End Sub

On déclare une variable tableau dynamique dans laquelle on recueillera les lignes à transférer, 3 variables Integer : une pour parcourir le tableau source, une pour incrémenter notre tableau résultat au fur et à mesure, une pour définir la ligne d'insertion des résultats dans le tableau cible.

On travaille d'abord avec le tableau source, que l'on met sous instruction With (de façon à y faire facilement référence, et on le fait toujours parce que cela accélère l'exécution !).

On parcourt ce tableau de la première à la dernière ligne (on n'a pas à se préoccuper de numéros de ligne, on travaille directement avec le tableau [plage de données] à partir de la ligne 1 du tableau...). On teste la valeur de le la cellule de chaque ligne en 5e colonne du tableau.

Si la valeur est "P0" ou "P1", la condition est vérifiée, on va donc prélever la ligne. On incrémente donc notre tableau résultat avec la variable dévolue à ce rôle, en préservant le contenu déjà recueilli dans ce tableau (au démarrage, la variable à la valeur 0, on dimensionne donc le tableau sur l'élément d'indice 0, on affecte cet élément, puis on incrémente la variable pour le tour suivant...)

Petite particularité, si on transformait une plage en tableau on aurait naturellement un tableau à 2 dimensions. Ici notre variable tableau ne comporte qu'une dimension : à chaque élément de ce tableau on affectera une ligne entière du tableau source répndant à la condition, soit un tableau de valeurs constitué par la ligne, dont on n'a pas à se préoccuper du nombre de colonnes... Notre tableau résultat sera un tableau à une dimension dont chaque élément sera un tableau constituant une ligne à tranférer. On opère ainsi plus rapidement...

Une fois le tableau source parcouru, il n'y a plus qu'à passer sur le tableau cible dans les mêmes conditions...

On commence par définir la ligne d'insertion qui sera tout simplement égale au nombre de lignes du tableau +1.

Si la ligne obtenue est la 2e du tableau, on prend alors la précaution de vérifier si la 1re est remplie, si c'est le cas, la ligne d'insertion est bien la 2, sinon on la ramène à 1 pour ne pas laisser de ligne vide sous l'en-tête du tableau.

On dimensionne alors la plage de résultats pour qu'elle corresponde au données à transférer : le nombre de lignes de résultats est fourni par la variable utilisée pour l'incrémentation du tableau de résultats, incrémentée à chaque obtention d'un résultat pour le tour suivant, et dont la valeur correspond exactement au nombre de lignes de résultats (compensant l'élément 0 du tableau résultats).

(NB- Si cette variable est égale à 0, c'est qu'on n'a aucun résultat, on interrompt donc la procédure avant de passer sur le tableau cible...]

On affecte donc le tableau résultats à la plage cible dimensionnée pour l'accueillir. Cette dernière phase est un peu plus difficiile à conceptualiser : un tableau à une dimension se présentera comme tableau horizontal lors d'une affectation, il faut donc le transposer pour rétablir la verticalité des lignes, mais comme chaque élément contient lui même un tableau représentant une ligne, il faut opérer une double transposition pour retomber sur nos pieds (on transpose le tableau transposé). Ce n'est sans doute pas aisé à visualiser mentalement, mais cela fonctionne efficacement...

NB- J'ai vu que tu ajoutais une condition destinée à éviter des doublons, il y a divers moyens pour cela : conserver la référence du dernier élément tranféré (si elle constitue un identifiant unique), ou bien conserver la dernière ligne testée du tableau pour repartir de la ligne suivante la fois d'après...

Cordialement.

Rechercher des sujets similaires à "macro condition"