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 SubBonjour 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...
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 boucleMais ç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 SubBonsoir 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...
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.
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 SubSuper 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


