Sélectionner la semaine sen cours , faire un filtre et copier les informations dans un autre fichier

annaDela

XLDnaute Nouveau
Bonjour,

Actuellement je suis en stage de fin d’études j'ai une tache à réaliser en utilisant VBA et j'ai trouvé une difficulté pour la réaliser puisque je n'ai jamais utilisé des macros ...
J'ai besoin de votre expérience afin de résoudre mon problème...
j'ai un tableau Excel avec presque 40 colonnes et plusieurs lignes, mon tableau est divisé en deux parties une partie avec différentes informations (nom, tel, adresse, manager ... ) une deuxième partie pour les semaines (de semaine S1 jusqu’à semaine S52)et pour chaque semaine je peux faire un filtre sur plusieurs variables ...
Depuis une semaine j'essaye de réaliser et de chercher une solution mais je n'arrive pas ...
Donc j'ai besoin de votre aide pour :

Ajouter un bouton a l'appui il :
Sélectionne la semaine en cours, faire un filtre sur une variable parmi les choix que j'ai
Sélectionne les lignes qui correspondent à mon filtre copier ses informations et les mettre dans un autre fichier Excel avec l'ajout de la semaine en cours (semaine S et S+3) ...

J’espère que j'ai bien expliqué mon besoin et j’espère que je trouve une personne qui peut m’aider.

je vous transfère en PJ un exemplaire de mon fichier.
 

Pièces jointes

  • EXEMPLE.xlsx
    14.7 KB · Affichages: 28

vgendron

XLDnaute Barbatruc
Bonjour

avec un peu d'enregistreur de macro et un tout petit peu d'adaptation ca pourrait te donner ceci pour aller jusqu'au filtre
VB:
Sub filtrer()
NumSemaine = WorksheetFunction.WeekNum(Now) 'récupère le numéro de la semaine en cours
With Sheets("Feuil1")
    Set c = .Rows(3).Find("S" & NumSemaine) 'on cherche sa position dans la ligne 3
    fincol = Cells(.Rows.Count, c.Column).End(xlUp).Row 'on récupère ligne de la dernière donnée de la colonne
   
    Set ZoneToFilter = c.Resize(fincol - 2) 'on set ZoneFilter
    'on applique  le filtre avec IC comme critère
    ZoneToFilter.AutoFilter Field:=1, Criteria1:="=IC", _
        Operator:=xlOr, Criteria2:="="
   
End With
   
End Sub
 

vgendron

XLDnaute Barbatruc
avec recopie du résultat

tout ca à adapter en fonction du besoin et des précisions qui manquent.
"comment choisis tu le critère de filtre? fixé à l'avance? le code doit te le demander?
"où colles tu le résultat? que la colonne filtrée ou toute les lignes??...

VB:
Sub filtrer()
NumSemaine = WorksheetFunction.WeekNum(Now) 'récupère le numéro de la semaine en cours
With Sheets("Feuil1")
    Set c = .Rows(3).Find("S" & NumSemaine) 'on cherche sa position dans la ligne 3
    fincol = Cells(.Rows.Count, c.Column).End(xlUp).Row 'on récupère ligne de la dernière donnée de la colonne
   
    Set ZoneToFilter = c.Resize(fincol - 2) 'on set ZoneFilter
    'on applique  le filtre avec FS comme critère
    ZoneToFilter.AutoFilter Field:=1, Criteria1:="=FS"
    ZoneToFilter.SpecialCells(xlVisible).Copy Destination:=Sheets("Feuil2").Range("A1") 'copie du résultat dans la feuille 2 à partir de A1
     
End With
   
End Sub
 

annaDela

XLDnaute Nouveau
bonjour @vgendron
Je vous remercie pour votre retour , j'ai besoin de copier les informations liée au filtre dans notre exemple de filtre sur les FS j'ai besoin de copier les noms des colonnes (nom , matricule ..) avec les données .
de rajouter le numéro de la semaine en cours et en dessus les S+3 .
je ne sais pas si c'est faisable ou non .
Merci
 

vgendron

XLDnaute Barbatruc
donc..si je comprend bien. ce sera toujours le Critère FS
et tu recopies toutes les colonnes.. ??
VB:
Sub filtrer()
NumSemaine = WorksheetFunction.WeekNum(Now) 'récupère le numéro de la semaine en cours
With Sheets("Feuil1")
   Set c = .Rows(3).Find("S" & NumSemaine) 'on cherche sa position dans la ligne 3
    fincol = Cells(.Rows.Count, c.Column).End(xlUp).Row 'on récupère ligne de la dernière donnée de la colonne
   
   Set ZoneToFilter = c.Resize(fincol - 2) 'on set ZoneFilter
   'on applique  le filtre avec FS comme critère
    ZoneToFilter.AutoFilter Field:=1, Criteria1:="=FS"
    ZoneToFilter.SpecialCells(xlVisible).entirerow.Copy Destination:=Sheets("Feuil2").Range("A1") 'copie du résultat dans la feuille 2 à partir de A1
     
End With
   
End Sub
Si c'est pas ca. alors. renvoie un fichier avec dans une feuille, les datas de départ et dans une autre feuille, le résultat souhaité
 

annaDela

XLDnaute Nouveau
@vgendron
Je suis vraiment désolé je n'ai pas vu votre retour, en effet mon filtre sera toujours sur les IC.
Pour le résultat souhaité je vous communique en PJ un exemple ;
j'ai besoin d'afficher la semaine en cours dans mon exemple S27 donc :
j'ai besoin des infos des IC pour la semaine S27 avec
S+1 qui correspond à la semaine en cours ) + 1 ==> S28
S+2 qui correspond à la semaine en cours + 2==> S29
Jusqu'à la semaine en cours +3 (semaine 27 +3)
Un grand merci ...
 

Pièces jointes

  • Test_filtre.xlsx
    10 KB · Affichages: 27

annaDela

XLDnaute Nouveau
C'est possible :)
Bonjour ,
Je vous remercie pour votre retour et votre aide vous m'avez aider ..
Pouvez-vous juste m'expliquer cette ligne de code:
ZoneToFilter.Offset(1, 0).SpecialCells(xlVisible).EntireRow.Copy Destination:=FeuilleDest.Range("B" & FeuilleDest.Range("B" & Rows.Count).End(xlUp).row).Offset(1, 0)
en particulier ZoneToFilter.Offset(1, 0).SpecialCells(xlVisible).EntireRow.Copy Destination
le (1,0 ) dépend de quoi exactement ou correspond à quoi .
un grand merci
 

vgendron

XLDnaute Barbatruc
Hello

alors
ZoneToFilter.Offset(1, 0).SpecialCells(xlVisible).EntireRow.Copy Destination:=FeuilleDest.Range("B" & FeuilleDest.Range("B" & Rows.Count).End(xlUp).row).Offset(1, 0)

ZoneToFilter..c'est la zone qu'on a définie pour etre filtrée: elle contient la ligne d"entete.
ZoneToFilter.offset(1,0)
on décale la zone (Offset) de 1 ligne, et 0 colonne
comme ca. on ne prend plus la ligne d'entete.. par contre.. on prend une ligne vide en dessous.. mais ce n'est pas grave.. car elle est vide..
dans la ZoneToFilter.offset(1,0), on ne récupère QUE les cellules qui apparaissent (celles qui résultent du filtre)
entirerow. on récupère la ligne entière
.copy ---> et bien.. on copy
et la destination pour dire l'endroit où on colle

si tu souhaites plus d'exemples et explication pour chaque fonction: la touche F1 te sera d'une grande AIDE :)
 

annaDela

XLDnaute Nouveau
Hello

alors
ZoneToFilter.Offset(1, 0).SpecialCells(xlVisible).EntireRow.Copy Destination:=FeuilleDest.Range("B" & FeuilleDest.Range("B" & Rows.Count).End(xlUp).row).Offset(1, 0)

ZoneToFilter..c'est la zone qu'on a définie pour etre filtrée: elle contient la ligne d"entete.
ZoneToFilter.offset(1,0)
on décale la zone (Offset) de 1 ligne, et 0 colonne
comme ca. on ne prend plus la ligne d'entete.. par contre.. on prend une ligne vide en dessous.. mais ce n'est pas grave.. car elle est vide..
dans la ZoneToFilter.offset(1,0), on ne récupère QUE les cellules qui apparaissent (celles qui résultent du filtre)
entirerow. on récupère la ligne entière
.copy ---> et bien.. on copy
et la destination pour dire l'endroit où on colle

si tu souhaites plus d'exemples et explication pour chaque fonction: la touche F1 te sera d'une grande AIDE :)
Un grand merci , bonne journée .
 

annaDela

XLDnaute Nouveau
@vgendron Bonjour,

Je suis désolé pour vous déranger encore une fois ... mais juste j'ai besoin de rajouter un autre critère pour l'affichage, j'ai besoin de faire le filtre, afficher la semaine en cours et pour S+1, S+2, S+3 j'ai besoin de faire une comparaison avec les résultats de la semaine en cours, si je trouve le même nom, prénom je ne l'affiche pas .
merci de m'aider..
 

Discussions similaires

Réponses
12
Affichages
269

Statistiques des forums

Discussions
311 709
Messages
2 081 774
Membres
101 816
dernier inscrit
Jfrcs