Affichage de données de plusieurs onglets selon un choix multiple
Bonjour,
je galère à terminer ce développement : dans mon fichier joint, j'essaye de créer sous l'onglet "feuil 2" un affichage de tableaux préformatés dont le contenu se module selon le choix du client qui se trouve dans l'onglet "2-coord membres".
Il s'agit des données tableaux des onglets 3-, 4-, 5- et 6- mais avec uniquement les lignes visibles pour le client sélectionné.
Je ne sais pas comment procéder. j'ai essayé recherchev sans succès.
je voudrais faciliter l'impression pour les membres du client de l'ensemble de leur données. (Ce fichier est protégé avec "123")
Un tout grand merci pour votre aide !
Bonjour Tadjoul,
Il faut faire ça avec une boucle à mon avis et tester si la ligne est visible, rapatrier les données,
sinon par TCD avec des segments
Mais vu l'ampleur de la tâche, je vous laisse faire.
Bonjour BrunoM45,
Merci beaucoup pour votre réponse :-)
Je préfère éviter les TCD car je ne les maîtrise pas et les utilisateurs du fichier absolument pas non plus.
Donc ok pour les boucles et le rapatriement.
Je vois l'ampleur et suis prête à le faire, cependant, est-ce possible de m'aider à coder la boucle et le rapatriement juste pour la plage de données '3-Programme 2023'!(D11:L25) =(cercle 1) à rapatrier en 'Feuil2'!(A46:I60) ? Je n'en ai jamais fait.
J'essayerai ensuite d'adapter le code pour que la plage de 3-Programme 2023'! descende de 15 lignes par 15 lignes jusqu'à nombre=32 (32= nombre max de cercles) selon la cellule de la liste de choix.
Ensuite j'adapterai pour les autres plages de données.
Est-ce une bonne manière de procéder ?
Merci pour toute l'aide que vous pourrez m'apporter !!!
@BrunoM45
Est-ce que c'est le bon bout de code ? Est-ce adapté pour une plage de données ?
(données issues de Comment parcourir en boucle une liste de données dans une feuille de calcul à l’aide de macros dans Excel - Office | Microsoft Learn ) :
Sub Test1()
Dim x As Integer
' Set numrows = number of rows of data.
NumRows = Range("A2", Range("A2").End(xldown)).Rows.Count
' Select cell a1.
Range("A2").Select
' Establish "For" loop to loop "numrows" number of times.
For x = 1 To NumRows
' Insert your code here.
' Selects cell down 1 row from active cell.
ActiveCell.Offset(1, 0).Select
Next
End SubRe,
Oui, c'est bien ça pour la boucle
Comme vous avez des tableaux les uns sous les autres et que le 1er commence à la ligne 45, il faudra faire
NumRows = Range("A45", Range("A45").End(xldown)).Rows.CountDe plus, il est inutile de faire des "Select" qui vont ralentir le code
Sub Test1()
' Nommez et typez correctement les variables
Dim Lig As Long, NumRows as Long
' Set umrows = number of rows of data.
NumRows = Range("A45", Range("A45").End(xldown)).Rows.Count
' Establish "For" loop to loop "numrows" number of times.
For Lig = 46 To NumRows
' Insert your code here.
Next
End SubA+
@BrunoM45
Génial ! Merci beaucoup
Je reste quand même un peu confuse, et nommer les variables, ainsi qu'ajouter le code dans boucle() ci dessous reste fort nébuleux pour moi (je n'en ai jamais fait) :
Sub boucle()
' Nommez et typez correctement les variables (comment ?)
Dim Lig As Long, NumRows as Long
' Set umrows = number of rows of data.
NumRows = Range("A45", Range("A45").End(xldown)).Rows.Count
' Establish "For" loop to loop "numrows" number of times.
For Lig = 46 To NumRows
' Insert your code here. (est-ce bien le code de rapatriement ici ?)
Next
End SubQUESTIONS :
- Mes tableaux de données ne commencent-t-il pas à la ligne 11 et pas 45 ?
- Dois-je commencer par coder une boucle par plage de données ou dois- je spécifier les variables provenant des 4 onglets différents tout de suite ?
càd, ne dois-je pas, pour commencer, coder la boucle pour les plage de données suivantes :
1) '3-Programme 2023'!(D11:L25) =(cercle 1) ou D11:L490 (= 32 cercles) à rapatrier en 'Feuil2'!(A46:I60)
2) '4-Formateurs 2023"(O11:W22) =(cercle 1) ou O11:W394 (= 32 cercles) à rapatrier en 'Feuil2'!(A65:I76)
3) '4-Formateurs 2023"(X11:AB22) =(cercle 1) ou X11:AB394 (= 32 cercles) à rapatrier en 'Feuil2'!(A81:92)
4) '5-Programme 2024'(D11:L25) =(cercle 1) D11:L490 (= 32 cercles) à rapatrier en 'Feuil2'!(A97:111)
5) '6-Formateurs 2024'(O11:W22)=(cercle 1) ou O11:W394 (= 32 cercles)à rapatrier en 'Feuil2'!(A116:127)
6) '6-Formateurs 2024'(X11:AB22)=(cercle 1) ou X11:AB394 (= 32 cercles) à rapatrier en 'Feuil2'!(A132:143)
?
Mais comment ça se code tout ça ? Car ensuite ne faut-il pas adapter le code pour que les plages de 3-Programme 2023'! et 5-Programme 2024' descendent de 15 lignes par 15 lignes jusqu'à nombre=32 (32= nombre max de cercles) selon la cellule de la liste de choix ? Et que les plages de 4-Formateurs 2023 et 6-Formateurs 2024 descendent de 12 lignes par 12 lignes ?
- J'ai essayé de trouver un code de rapatriement, j'en ai trouveé 2 que j'ai essayé d'adapter, mais cela ne me semble pas très concluant
Sub Rapatrie()
'Déclarations des variables
Dim a As Worksheet, b As Worksheet, c As Worksheet, d As Worksheet, e As Worksheet
Dim plage As Range
'définition des variables, ici les feuilles
Set a = Sheets("3-Programme 2023"): Set b = Sheets("4-Formateurs 2023"): Set c = Sheets("5-Programme 2024"): Set d = Sheets("6-Formateurs 2024"): Set e = Sheets("Feuil2")
'on efface les colonnes A et B de la feuille Result
b.Columns("A46:I60").Clear
'on applique le filtre sur la feuille Données
With a
.AutoFilterMode = False
Set plage = .[A11].Resize(.A490.Row, 1)
plage.AutoFilter 1, "=Left (B42;1;1)" (en fait non car le row 1 est une fusion de cellules...donc ça marche pas)
'On définit la plage de cellules à copier
Set plage = _
Intersect(.Range("A:I"), plage.SpecialCells(12))
'on copie le résultat du filtre en feuille Result
plage.Copy e.[A46]
'On ôte le filtre automatique sur la feuille Données
plage.AutoFilter
End With
'On "vide" les variables
Set a = Nothing
Set b = Nothing
Set c = Nothing
Set d = Nothing
Set e = Nothing
Set plage = Nothing
End Sub
Sub Rapatrie()
Dim plage As Range
Sheets("Feuil2").Columns("A:I").Clear
With Sheets("3-Programme 2023")
.AutoFilterMode = False
Set plage = .[A11].Resize(.A490.Row, 1)
plage.AutoFilter 1, "=Left (B42;1;1)"
Set plage = _
Intersect(.Range("A:I"), plage.SpecialCells(12))
plage.Copy Sheets("Feuil2").[A11]
plage.AutoFilter
End With
End SubEdit modo : code mis entre balises, merci d'y faire attention la prochaine fois
Suis-je en bonne voie ? Y a des aspects que je ne cerne pas bien...
J'aurai peut-être plus de chance de demander à ChatGPT