Copier une ligne dans une autre feuille sur une condition

Bonjour à tous,

Merci d'avoir pris du temps pour me lire.

J'expose mon besoin :

Mon classeur est composé de douze feuilles (janvier à décembre)

une 13ème feuille est créée pour comptabiliser une seule chose, les nouveaux clients.

Voici ce que je voudrais qu'une macro réalise.

Dans les feuilles de 1 à 12 et des cellules de D3 à D33, à chaque fois qu'une cellule affiche "prospect" je voudrais que la ligne correspondante (cellule de A à K) soit copiée dans la feuille 13 à partir de la ligne A3 (si la ligne est déjà renseignée, ca passe à la suivante etc)

Comme je suis une quiche, je n'ai rien construit et je n'arrive pas à trouver comment faire même en lisant des posts sur le sujet.

En espérant avoir été suffisamment clair dans mes explications, je vous remercie de votre aide.

Cordialement.

Bonjour Doublebulle, bonjour le forum,

Essaie comme ça :

Sub Macro1()
Dim O As Byte 'déclare la variable O (Onglets)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

K = 1 'initialise la variable K
For O = 1 To 12 'boucle 1 : sur les 12 premiers onglets du classeur
    TV = Sheets(O).Range("A3:K33") 'définit la variable TV
    For I = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV
        If TV(I, 4) = "prospect" Then 'condition : si la donnée ligne I colonne 4 (=> colonne D) de TV est égale à "prospect"
            ReDim Preserve TL(1 To 11, 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonne, soit 11, K colonnes)
            For J = 1 To 11 'boucle 3 : sur les 11 colonnes du tableau des valeurs TV
                TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la donnée colonne J de TV (= Transposition)
            Next J 'prochaine colonne de la boucle 3
            K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 2
Next O 'prochain onglet de la boucle 1
If K > 1 Then 'condition : si K est supérieure à 1
    'définit la cellule de destination DEST (A3 si A3 est vide, sinon, la première cellule vide de la colonne A du treizième onglet du classeur)
    Set DEST = IIf(Sheets(13).Range("A3").Value = "", Sheets(13).Range("A3"), Sheets(13).Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0))
    DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'renvoie dans DEST redimensionnée le tableau TL transposé
End If 'fin de la condition
End Sub

Bonjour Thau Thème,

Merci de ta réponse rapide.

Je vais testé cela dans la journée et je reviens vers toi pour te dire si cela fonctionne.

Il va vraiment falloir que je me penche sur le VBA car quand je lis ta solution, je vois du "chinois".

Si tu as des pistes à me donner pour apprendre, je te remercie.

A tout à l'heure.

Alors, compte rendu,

J'ai copié collé ta macro et j'exécute mais rien ne se passe.

J'ai juste changé le nom de la 13ème feuille qui est en faite la 16ème dans l'ordre et se nomme "Suivi NC"

Alors deux questions :

1 - où mettre la macro?

2 - peut on créer un bouton pour la lancer ou la rendre automatique?

Encore une fois, merci.

Re,

Mets ton fichier en pièce jointe (avec la macro que tu as modifié). Si les explications de ton premier post ne correspondent pas à ton fichier, ce n'est pas étonnant que ça ne marche pas. Nous ne sommes pas devins !...

Pas de souci.

Je te joins le fichier original sans y avoir intégré la macro.

Je pense, en effet, que cela sera plus clair pour toi.

Merci pour le temps que tu m'accordes.

A te lire.

83equipe-1.xlsx (72.04 Ko)

Re,

Je ne voulais pas commenter mais je ne peux m'empêcher de le faire...

Pour les prochaines fois, soit tu mets directement le fichier en pièce jointes avec des explications approximatives, soit tu donnes les explications qui correspondent à la réalité de ton fichier ! C'est juste pour nous éviter de perdre notre temps...

Le code modifié et adapté :

Sub Macro1()
Dim TDO(1 To 12) As String 'déclare le tableau des variables TDO (Tableau Des Onglets)
Dim M As Byte 'déclare la variable M (Mois)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

TDO(1) = "Janv" 'définit la variable indexée TDO(1)
TDO(2) = "Fév" 'définit la variable indexée TDO(2)
TDO(3) = "Mars" 'définit la variable indexée TDO(3)
TDO(4) = "Avril" 'définit la variable indexée TDO(4)
TDO(5) = "Mai" 'définit la variable indexée TDO(5)
TDO(6) = "Juin" 'définit la variable indexée TDO(6)
TDO(7) = "Juillet" 'définit la variable indexée TDO(7)
TDO(8) = "Aout" 'définit la variable indexée TDO(8)
TDO(9) = "Sept" 'définit la variable indexée TDO(9)
TDO(10) = "Oct" 'définit la variable indexée TDO(10)
TDO(11) = "Nov" 'définit la variable indexée TDO(11)
TDO(12) = "Déc" 'définit la variable indexée TDO(12)

K = 1 'initialise la variable K
For M = 1 To 12 'boucle 1 : sur les 12 variables du tableau des onglets TDO
    TV = Sheets(TDO(M)).Range("A3:K33") 'définit la variable TV (plage A3:K33 de l'onglet TDO(M))
    For I = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV
        If TV(I, 4) = "Prospect" Then 'condition : si la donnée ligne I colonne 4 (=> colonne D) de TV est égale à "Prospect"
            ReDim Preserve TL(1 To 11, 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes que TV a de colonne, soit 11, K colonnes)
            For J = 1 To 11 'boucle 3 : sur les 11 colonnes du tableau des valeurs TV
                TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la donnée colonne J de TV (= Transposition)
            Next J 'prochaine colonne de la boucle 3
            K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 2
Next M 'prochain onglet de la boucle 1
If K > 1 Then 'condition : si K est supérieure à 1
    With Worksheets("Suivi NC") 'prend en compte l'onglet "Suivi NC"
        'définit la cellule de destination DEST (A3 si A3 est vide, sinon, la première cellule vide de la colonne A de l'onglet "Suivi NC"
        Set DEST = IIf(.Range("A3").Value = "", .Range("A3"), .Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0))
    End With
    DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'renvoie dans DEST redimensionnée le tableau TL transposé
End If 'fin de la condition
End Sub

RE -

T'inquiète, je comprends et en même temps c'est logique, mea-culpa !

En tout cas merci beaucoup, ça marche nickel.

Par contre, il faudrait que cela soit automatique car j'ai testé pour janvier et j'ai ajouté des prospects en février et quand je relance, elle me remet ceux de janvier.

Bonsoir,

La macro que tu m'a construite fait ce que je souhaite mais lorsque je la relance pour ajouter un autre mois, elle me remets tout depuis le début.

Donc, si c'est possible car je ne comprends pas le VBA, peut on rendre la macro automatique, c'est à dire que dès que la cellule indique prospect, la ligne se copie de suite.

Ou, un bouton qui permet de a lancer mais sans créer de doublon.

Merci de ton aide.

Bonsoir DoubleBulle, bonsoir le forum,

Voilà mon point de vue. Je déteste les problèmes à tiroir. Quand le problème est résolu et que le demandeur rajoute une requête. Il aurait été plus simple de le dire dès le départ. Tu as beau ne pas comprendre le VBA tu sais quand même ce que tu veux non ? C'est pour ça que je n'ai pas poursuivi dans ton fil...

D'un autre coté, je ne peux pas te planter comme ça puisque je t'ai fourni le premier code. Ton problème est relativement simple à résoudre mais il y a plusieurs façons. Je t'en propose trois, tu me diras qu'elle est celle qui te convient le mieux. Tu me diras aussi si tu as autre chose à ajouter car cette fois je n'y reviendrai plus.

1. Les lignes contenant "Prospect" ne sont plus copiées dans l'onglet Suivi NC mais déplacées. Plus de doublons possible...

2. On rajoute une colonne entre les colonnes actuelles K et L. Quand une ligne est copiée dans l'onglet Suivi NC, on écrit "X" dans cette colonne. La copie ne se fait que si la cellule de cette colonne est vierge. Plus de doublons...

3. On supprime la mise en forme conditionnelle en colonne D et on colore la cellule d'une couleur autre que vert (tu me diras laquelle), la copie ne se fait que si la couleur de la cellule contenant "Prospect" n'est pas la couleur que tu auras choisie.

En attendant ta réponse...

Désolé !

Je retiens la 3ème façon et je choisis le gris clair.

La dernière chose, peut on lancer la macro automatiquement ou mettre un "bouton"

Et je n'y reviens plus.

Merci

Re,

Je me suis rendu compte que la 3ème façon avait l'inconvénient suivant. Pour colorer la cellule de gris il me faut d'abord supprimer la mise en forme conditionnelle. Donc, si par la suite ton Prospect devient Client la cellule restera grise au lieu de passer au rouge car elle aura perdu sa MFC... Bouton dans l'onglet Suivi NC. Fichier Equipe 1.xlsm

Je t'ai donc aussi fait une la proposition 2 avec la colonne L masquée. Fichier Equipe1_v2.xlsm qui elle, garde la mise en forme conditionnelle en colonne D et ajoute X en colonne L.

50equipe-1.xlsm (99.62 Ko)
95equipe-1-v2.xlsm (102.87 Ko)

Yop,

Merci Thau Thème, c'est exactement cela que je souhaite.

La méthode 2 est parfaite.

Il va vraiment falloir que je me mette au VBA.

Encore merci pour tout ça !

Rechercher des sujets similaires à "copier ligne feuille condition"