Faire apparaitre ligne sous conditions dans feuille 2

Bonjour à tous et à toutes,

je me permets de vous soliciter car je bloque sur l'élaboration de mon fichier Excel (je suis sous excel 2010) :

  • J'ai un fichier de suivi avec plusieurs colonnes
  • J'ai 2 feuilles dans mon fichier : Suivi et En cours
  • En colonne F de la feuille 1 "Suivi" lorsqu'une une etape est initié elle se met automatiquement en "En cours"
  • Mon but est d'afficher sur la 2eme feuille 'En cours' uniquement les lignes de ma feuille 1 suivi dont la colonne F comportent le texte "en cours". Le but également est qu'ils se mettent à jour automatiquement (ex : dans feuille 1 plusieurs lignes se mettent en cours alors je le retrouverais en feuille 2 ; si il n' ya plus en cours en colonne f alors elles disparaissent de ma feuille 2)

En espérant avoir été clair et en vous remerciant d'avance.

PS: ci joint le fichier excel sur lequel je suis

Bonjour Hoss_fark, bonjour le forum,

Essaie avec ce code à placer dans le composant Feuil1 (Suivi) :

Private Sub Worksheet_Calculate()
Dim S As Worksheet 'déclare la variable S (onglet Suivi)
Dim E As Worksheet 'déclare la variable E (onglet En cours)
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 S = Worksheets("Suivi") 'définit l'onglet S
Set E = Worksheets("En cours") 'définit l'onglet E
E.Range("Tableau32").Rows.ClearContents 'efface toutes les lignes du Tableau32
TV = S.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeur TV (en partant de la troisième)
    If TV(I, 6) = "En cours" Then 'condition : si la donnée ligne I colonne 6 de TV vaut "En cours"
        'définit la cellule de  destination DEST (A3 si A3 est vide, sinon la première cellule vide de la colonne A tu Tableau32)
        Set DEST = IIf(E.Range("A3").Value = "", E.Range("A3"), E.Range("A2").End(xlDown).Offset(1, 0))
        DEST.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoir dans DEST redimensionnée la ligne I du tableau des valeurs TV
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

Bonjour merci beaucoup cela fonctionne bien ! Désolé pour le délai de réponse j'étais absent ce week-end !

Maintenant j'ai un peu compléxifié mon fichier mais je n'arrive pas à adapter la macro...

Pourrais je t'envoyer par mp le nouveau fichier ?

Merci d'avance

Re,

Non, pas par MP. Pas dans l'éthique de ce forum et tu te priverais de l'aide de nombreux contributeurs bien plus balèzes que moi...

Continue dans ce fil je reste attentif ou, si tu préfères, dans un nouveau fil. Tu pourras alors m'envoyer par MP un lien vers celui-ci. Je ne manquerai pas d'y jeter un œil...

capture

Re,

Oui je comprends la philosophie du forum ne t'inquiètes pas ... Mon soucis est que le fichier en question ne peux etre partagé en ligne pour diverses raison.

Mais c'est pas grave je vais essayer de me débrouiller.

J'ai quand meme une question :

  • J'ai ajouté un onglet "Traitées" juste après l'onglet "En cours"
  • Je veux la meme chose que pour l'onglet en "En cours" sauf qu'ici (onglet " Traitée") s'afficheront seulement les lignes avec le commentaire "Note traitée" dans la colonne traitement de la note de l'onglet "Suvi".

J'ai modifié le code original de cette manière :

Private Sub Worksheet_Calculate()
Dim S As Worksheet 'déclare la variable S (onglet Suivi)
Dim E As Worksheet 'déclare la variable E (onglet En cours)
Dim H As Worksheet 'déclare la variable H (onglet Traitées)
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 S = Worksheets("Suivi") 'définit l'onglet S
Set E = Worksheets("En cours") 'définit l'onglet E
Set H = Worksheets("Traitées")  'définit l'onglet H'
E.Range("Tableau32").Rows.ClearContents 'efface toutes les lignes du Tableau32
TV = S.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeur TV (en partant de la troisième)
    If TV(I, 12) = "En cours" Then 'condition : si la donnée ligne I colonne 12 de TV vaut "En cours"
        'définit la cellule de  destination DEST (A3 si A3 est vide, sinon la première cellule vide de la colonne A tu Tableau32)
        Set DEST = IIf(E.Range("A3").Value = "", E.Range("A3"), E.Range("A2").End(xlDown).Offset(1, 0))
        DEST.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoir dans DEST redimensionnée la ligne I du tableau des valeurs TV
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle

H.Range("Tableau").Rows.ClearContents 'efface toutes les lignes du Tableau32
TV = S.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeur TV (en partant de la troisième)
 If TV(I, 12) = "Note Traitée" Then 'condition : si la donnée ligne I colonne 12 de TV vaut "Note traitée"
        'définit la cellule de  destination DEST (A3 si A3 est vide, sinon la première cellule vide de la colonne A tu Tableau32)
        Set DEST = IIf(H.Range("A3").Value = "", H.Range("A3"), H.Range("A2").End(xlDown).Offset(1, 0))
        DEST.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoir dans DEST r

   End If 'fin de la condition
Next I 'prochaine ligne de la boucle

Mais ça ne passe pas... pourrais tu m'éclairer

PS: pour en cours ça fonctionne toujours très bien

End Sub

Re,

Ton code est correct et devrait fonctionner. J'ai remarqué que la colonne Traitement de la note se trouvait désormais à la colonne 12 (=> colonne L). c'est bien ça ?!... Sinon ça pourrait être la raison de l'échec de la macro...

If TV(I, 12) = "En cours" Then

To code avec une seule boucle :

Private Sub Worksheet_Calculate()
Dim S As Worksheet 'déclare la variable S (onglet Suivi)
Dim E As Worksheet 'déclare la variable E (onglet En cours)
Dim H As Worksheet 'déclare la variable H (onglet Traitées)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DESTE As Range 'déclare la variable DESTE (cellule de DESTination de l'onglet E)
Dim DESTH As Range 'déclare la variable DESTH (cellule de DESTination de l'onglet H)

Set S = Worksheets("Suivi") 'définit l'onglet S
Set E = Worksheets("En cours") 'définit l'onglet E
Set H = Worksheets("Traitées")  'définit l'onglet H'
E.Range("Tableau32").Rows.ClearContents 'efface toutes les lignes du Tableau32
H.Range("Tableau").Rows.ClearContents 'efface toutes les lignes du Tableau
TV = S.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeur TV (en partant de la troisième)
    If TV(I, 12) = "En cours" Then 'condition : si la donnée ligne I colonne 12 de TV vaut "En cours"
        'définit la cellule de  destination DESTE (A3 si A3 est vide, sinon la première cellule vide de la colonne A tu Tableau32)
        Set DESTE = IIf(E.Range("A3").Value = "", E.Range("A3"), E.Range("A2").End(xlDown).Offset(1, 0))
        DESTE.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoir dans DEST redimensionnée la ligne I du tableau des valeurs TV
    End If 'fin de la condition
    If TV(I, 12) = "Note Traitée" Then 'condition : si la donnée ligne I colonne 12 de TV vaut "Note Traitée"
        'définit la cellule de  destination DESTH (A3 si A3 est vide, sinon la première cellule vide de la colonne A tu Tableau)
        Set DESTH = IIf(H.Range("A3").Value = "", H.Range("A3"), H.Range("A2").End(xlDown).Offset(1, 0))
        DESTH.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoir dans DEST redimensionnée la ligne I du tableau des valeurs TV
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

Oui tu as bien compris l'information "note traitée" ou "en cours" se trouve maintenant en colonne 12 (et plus 6 d'ou m'a modif).

Par contre je viens d'essayer avec ton code et j'ai toujours le meme soucis... Tu verras en PJ.

capture

Bonsoir hoss_fark,

réponse en image :

screen

dhany

Bonsoir le fil, bonsoir le forum,

Merci Dhany,

Ça pourrait être ça ! J'avoue que je déteste travailler avec les ListObects (mes codes le montrent bien d'ailleurs). Je me suis servi du code proposé par Hoss_fark pour essayer de corriger son problème. Il est dommage qu'il n'ai pas mis la ligne en erreur surlignée, juste le message...

Bonsoir ThauThème,

screen

« je déteste travailler avec des ListObects » : les tableaux structurés te débectent tant que ça ?

ne l'répète pas à jmd, mais moi non plus, j'aime pas utiliser les tableaux structurés !

dhany

Bonjour à vous,

Effectivement c'ets bien la ligne H.Range("Tableau").Rows.ClearContents 'efface toutes les lignes du Tableau qui est surligné chez moi aussi....

Du coup avec listobject cela donnerait quoi ? H.ListObject("Tableau").Rows.ClearContents ?

Bonjour hoss_fark,

tu a écrit :

Du coup avec listobject cela donnerait quoi ? H.ListObject("Tableau").Rows.ClearContents ?

ben normalement, oui. essaye sur une copie du fichier, et vois si t'as bien les résultats attendus.

dhany

Bonjour le fil, bonjour le forum,

Un code avec les ListObject :

Private Sub Worksheet_Calculate()
Dim S As Worksheet 'déclare la variable S (onglet Suivi)
Dim E As Worksheet 'déclare la variable E (onglet En cours)
Dim H As Worksheet 'déclare la variable H (onglet Traitées)
Dim TBE As ListObject 'déclare la variable TBE (Tableau de l'onglet E)
Dim TBH As ListObject 'déclare la variable TBH (Tableau de l'onglet H)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DESTE As Range 'déclare la variable DESTE (cellule de DESTination de l'onglet E)
Dim DESTH As Range 'déclare la variable DESTH (cellule de DESTination de l'onglet H)

Set S = Worksheets("Suivi") 'définit l'onglet S
Set E = Worksheets("En cours") 'définit l'onglet E
Set TBE = E.ListObjects(1) 'définit la tableau TBE
Set H = Worksheets("Traitées")  'définit l'onglet H'
Set TBH = H.ListObjects(1) 'définit la tableau TBH
E.Range(TBE).Rows.ClearContents 'efface toutes les lignes du Tableau32
H.Range(TBH).Rows.ClearContents 'efface toutes les lignes du Tableau
TV = S.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 3 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeur TV (en partant de la troisième)
    If TV(I, 12) = "En cours" Then 'condition : si la donnée ligne I colonne 12 de TV vaut "En cours"
        'définit la cellule de  destination DESTE (A3 si A3 est vide, sinon la première cellule vide de la colonne A tu Tableau32)
        Set DESTE = IIf(E.Range("A3").Value = "", E.Range("A3"), E.Range("A2").End(xlDown).Offset(1, 0))
        DESTE.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoir dans DEST redimensionnée la ligne I du tableau des valeurs TV
    End If 'fin de la condition
    If TV(I, 12) = "Note Traitée" Then 'condition : si la donnée ligne I colonne 12 de TV vaut "Note Traitée"
        'définit la cellule de  destination DESTH (A3 si A3 est vide, sinon la première cellule vide de la colonne A tu Tableau)
        Set DESTH = IIf(H.Range("A3").Value = "", H.Range("A3"), H.Range("A2").End(xlDown).Offset(1, 0))
        DESTH.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoir dans DEST redimensionnée la ligne I du tableau des valeurs TV
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

Super merci beaucoup ça fonctionne bien maintenant !!!!

Merci pour le coup de main vous etes au top

merci pour ton retour, même si c'est ThauThème qui a fait le plus gros boulot !

bonne continuation !

dhany

Rechercher des sujets similaires à "apparaitre ligne conditions feuille"