XL 2010 Envoyer des lignes vers un autre onglet

Ricco

XLDnaute Nouveau
Bonjour à tous,

Voici mon sujet : Je ne parviens pas à envoyer des lignes d'un onglet vers un autre de façon automatisé en fonction d'une destination indiquée dans une case de cette même ligne.

Je m'explique :
J'ai un tableau avec en ligne des projets. Dans la colonne H de mon tableau j'indique soit vide, soit paradis soit cimetière.
Lorsqu'un projet est en cours il reste dans le tableau (rien ne se passe) s'il abouti il est envoyé au Paradis, lorsqu'il échoue il est envoyé au cimetière.

Je souhaiterais donc que la ligne de projet disparaisse de mon tableau, en étant couper/coller pour être envoyée, selon la destination indiqué dans la colonne H dans l'onglet paradis ou cimetière.
J'espère être clair.
Je joins un fichier d'exemple.
Si une bonne âme pouvait me donner un coup de main ce serait apprécié.

Merci d'avance pour votre aide
 

Pièces jointes

  • TRM.xlsx
    12.6 KB · Affichages: 10

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Ricco, bonjour le forum,

Essaie comme ça :

VB:
Sub Macro1()
Dim PAC As Worksheet 'déclare la variable PAC (onglet Plan d'action et chemin)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set PAC = Worksheets("Plan d'action et chemin") 'définit l'onglet PAC
TV = PAC.Range("A6").CurrentRegion 'définit le tableau des valeur TV
For I = UBound(TV, 1) To 2 Step -1 'boucle inversée sur toutes les lignes I du tableau des valeurs (de la dernière à la ligne 2)
    If TV(I, 8) <> "" Then 'condition : si la donnée ligne I colonne 8 (=> colonne H) de TV n'est pas vide
        Set OD = Worksheets(TV(I, 8)) 'définit l'onglet de destination OD
        Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
        PAC.Rows(I + 5).Copy DEST 'copie la ligne I + 5  et la colle dans DEST
        PAC.Rows(I + 5).Delete 'supprime la ligne I + 5
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub
 

Ricco

XLDnaute Nouveau
Bonjour Robert,

Merci beaucoup pour cette macro qui marcherait certainement très bien si je n'avais pas au dessus de mon tableau un autre tableau (tu ne pouvais pas le deviner)
Mon tableau commence à la ligne 21 mais est susceptible de bouger (au dessus on ajoute ou retire des lignes également)
Du coup, il faut que je repense le tableau car je ne pense pas qu'on puisse demander à la macro de courir après le tableau selon ses déplacement dans la feuille.

Je regarde comment figer mon tableau et j'applique ta macro.

Merci mille fois pour tes efforts et félicitations pour tes compétences.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Essaie comme ça :

VB:
Sub Macro1()
Dim R As Range 'déclare la variable R (Recherche)
Dim PLT As Integer 'déclare la variable PLT (Première Ligne du Tableau)
Dim PAC As Worksheet 'déclare la variable PAC (onglet Plan d'action et chemin)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set PAC = Worksheets("Plan d'action et chemin") 'définit l'onglet PAC
'définit la recherche R (recherche la valeur exacte de "Réalisation N" dans la colonne 8 (= H) de l'onglet PAC)
Set R = PAC.Columns(8).Find("Réalisation N", , xlValues, xlWhole).Row 'Attention ! Dans ton exemple c'est "Réalisé N" au lieu de "Réalisation N", à adapter...
If R Is Nothing Then Exit Sub 'si aucune occurrence n'est trouvée, sort de a procédure
PLT = R.Row 'définit la première ligne du tableau PLT
TV = PAC.Cells(PLT, "A").CurrentRegion 'définit le tableau des valeurs TV
For I = UBound(TV, 1) To 2 Step -1 'boucle inversée sur toutes les lignes I du tableau des valeurs (de la dernière à la ligne 2)
    If TV(I, 8) <> "" Then 'condition : si la donnée ligne I colonne 8 (=> colonne H) de TV n'est pas vide
        Set OD = Worksheets(TV(I, 8)) 'définit l'onglet de destination OD
        Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
        PAC.Rows(I + (PLT - 1)).Copy DEST 'copie la ligne I + (PLT-1)  et la colle dans DEST
        PAC.Rows(I + (PLT - 1)).Delete 'supprime la ligne I + (PLT-1)
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub
 

Ricco

XLDnaute Nouveau
En fait, ça copie et supprime bien les lignes mais pas les bonnes, celles qui sont au dessus du tableau.
Il y aurait il une subtilité ?
Je remet un nouveau fichier dont j'ai vidé (ou changé les valeurs) pour des raisons de confidentialité.
C'est peut être la façon dont sont montés les tableaux sur la feuille.

Nota : Effectivement, c'était "Réalisé N" (et non Réalisation N) mais j'ai modifié.
 

Pièces jointes

  • Classeur2.xlsx
    20 KB · Affichages: 4
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Mon code contient une erreur (un .Row en trop dans la ligne de recherche, Set R...) certes mais :

• Tu me dis que Réalisé N est unique et je le retrouve 5 fois dans le même onglet ! Comment veux-tu que je repère la première ligne du tableau ?!...
• Mais même en cherchant à la main le texte Réalisé N ce n'est pas trouvé dans la colonne H. Là je t'avoue que j'en perds mon latin !... Si je l'écris dans n'importe quelle cellule, une recherche manuelle le trouve mais pas dans la ligne bleue du tableau. Je n'ai jamais vu ça !?...
• l'utilisation de CurrentRegion pour définir le tableau des valeurs TV implique qu'il n'y ait aucune ligne vide à l'intérieur du tableau. Ce n'est pas le cas pour les lignes 18 et 20 !

De ce fait la solution proposé n'est pas viable, il faut envisager autre chose.
 

Ricco

XLDnaute Nouveau
Bonjour Robert,

Effectivement il y a plusieurs fois "Réalisé N" mais je peux modifier le premier pour qu'il soit unique comme "Réalisé N#" (là ce n'est pas un pb) par contre, il y aura des lignes vides.
Bon, je vais essayer de construire mon tableau autrement afin que ça puisse fonctionner.

Quoiqu'il en soit, merci mille fois pour tes efforts.
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 913
Membres
101 837
dernier inscrit
Ugo