Djorge84
Habitué
Bonjour,
j'ai regardé sur le forum et je n'ai trouvé aucune discussion qui réponde à mon problème. Je vous explique donc de quoi il s'agit et ce que j'ai pu faire jusqu'à maintenant. Si quelqu'un peut me conseiller ensuite...
J'ai une base de donnée dans laquelle la colonne A renseigne sur les années et les premières lignes de la feuille indiquent différents calculs statistiques à partir des données contenues dans les colonnes à partir de F sur la période globale renseignée dans la colonne A (1984-2010).
Or j'aimerai pouvoir obtenir ces mêmes résultats statisitques pour chaque année.
Je sais que des fonctions d'Excel, type Sommeprod, prennent en compte l'utilisation d'un filtre pour calculer des statistiques sur un ensemble de données. Sauf que là des valeurs aberrantes devaient être exclues sur chaque colonnes en fonction d'un critère donné et que le fichier a été construit à partir de fonctions matricielles d'Excel... L'utilisation d'un filtre classique ne permet donc pas d'obtenir les valeurs statistiques sur les éléments retenus.
J'ai donc pensé tout bêtement à copier cette feuille plusieurs fois et à supprimer toutes les valeurs correspondant à l'année que je ne désire pas dans les calculs. Les calculs statisques ne prennent ainsi en compte que les valeurs correspondant à l'année conservée et j'ai donc ce que je souhaite!
Or comme il y a beaucoup d'années (et beaucoup de fichiers...), c'est beaucoup trop long à faire à la main... D'où mon idée de recourir à une macro pour automatiser cette tâche.
Comme je suis débutant en VBA, j'ai utilisé l'enregistreur de macro d'Excel et j'ai obtenu un code qui fonctionne. Pas de problème là-dessus, même si je pense qu'il pourrait êtr eplus joli, on est d'accord... Le problème c'est qu'il fonctionne bien évidemment uniquement pour l'année que j'ai utilisé lors de l'enregistrement : c'est logique (ne vous inquiétez pas j'attendais pas à ce qu'il me résolve toute ma problématique ). Et comme changer à la main l'année dans la macro ne permettrait pas de gagner du temps par rapport à une opération sans macro, j'aurai voulu faire une boucle pour que dans l'ordre la macro :
- copie la feuille qui m'intéresse en dernière position (feuille 2) ;
- supprime toutes les données contenues dans les colonnes à partir de la colonne F ;
- copie la feuille initiale une nouvelle fois (feuille 3) en y insérant 3 lignes tout en haut pour y coller les intitulés des différentes colonnes de données dans le but de réaliser un filtre élaboré;
- copie en A3 l'année que l'on souhaite garder pour le filtre élaboré;
- copier sur la feuille 2, les données provenant de l'utilisation du filtre sur la feuille 3
- renommer les feuille 2 du nom de l'année correspondante aux données;
- supprimer la feuille 3 ;
- et recommencer pour une autre année de la liste...
Pour qu'au final j'ai dans mon fichier, la feuille initiale avec l'ensemble des données et autant d'autres feuilles que d'année indiquée dans la base de données.
J'avais pensé insérer une feuille supplémentaire en 1ère position du classeur dans laquelle j'aurai indiqué sur la première colonne toutes années pour ensuite renvoyer vers ces cellules pour indiquer au filtre élaboré l'année à utiliser (feuille appelée "Année"). Mais je n'arrive pas à faire la boucle...
J'espère avoir été clair.
Si quelqu'un veut bien me filer un coup de main...
Merci par avance
J'indique le code que me donne l'enregistreur de macro :
[cpp]
Sub Test()
' Préparation de la feuille finale
' Copie de la feuille principale en dernière position
Sheets("Régénération").Select
Sheets("Régénération").Copy After:=Sheets(2)
' Sélection de l'ensemble des données sur cette feuille
Rows("27:27").Select
Range(Selection, Selection.End(xlDown)).Select
' Suppression de ces données pour avoir une feuille vide avec la mise en forme et la zone des données statistiques voulues conservée
Selection.ClearContents
' Création d'une feuille intermédiaire pour permettre la manipulation des données
' Copie de la feuille principale en dernière position
Sheets("Régénération").Select
Sheets("Régénération").Copy After:=Sheets(3)
' Insertion de 3 lignes
Rows("1:3").Select
Selection.Insert Shift:=xlDown
' Copie des titres des différents champs pour préparer l'utilisation d'un filtre élaboré
Rows("28:29").Select
Range("F28").Activate
Selection.Copy
' Collage des titres des différents champs sur les deux premières lignes
Rows("1:1").Select
ActiveSheet.Paste
Range("A3").Select
Application.CutCopyMode = False
' Choix de l'année à utiliser pour le filtre élaboré
ActiveCell.Value = Worksheets("Année").Range("A25").Value
Range("A4").Select
' Sélection de la plage de données et de la plage de critères pour le filtre élaboré
Range("A28:AA2036").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A1:AA3"), Unique:=False
' Sélection des données filtrées pour copie
Rows("1212:1212").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
' Collage des données sur la feuille finale
Sheets("Régénération (2)").Select
Rows("27:27").Select
ActiveSheet.Paste
' Changement du nom de la feuille (année correspondante)
Sheets("Régénération (2)").Name = Sheets("Année").[A25]
' Suppression de la feuille intermédiaire
Sheets("Régénération (3)").Select
Application.CutCopyMode = False
ActiveWindow.SelectedSheets.Delete
End Sub
[/cpp]
PS. J'aurai bien mis un fichier en exemple mais je ne sais pas comment ajouter une PJ à ce post...
j'ai regardé sur le forum et je n'ai trouvé aucune discussion qui réponde à mon problème. Je vous explique donc de quoi il s'agit et ce que j'ai pu faire jusqu'à maintenant. Si quelqu'un peut me conseiller ensuite...
J'ai une base de donnée dans laquelle la colonne A renseigne sur les années et les premières lignes de la feuille indiquent différents calculs statistiques à partir des données contenues dans les colonnes à partir de F sur la période globale renseignée dans la colonne A (1984-2010).
Or j'aimerai pouvoir obtenir ces mêmes résultats statisitques pour chaque année.
Je sais que des fonctions d'Excel, type Sommeprod, prennent en compte l'utilisation d'un filtre pour calculer des statistiques sur un ensemble de données. Sauf que là des valeurs aberrantes devaient être exclues sur chaque colonnes en fonction d'un critère donné et que le fichier a été construit à partir de fonctions matricielles d'Excel... L'utilisation d'un filtre classique ne permet donc pas d'obtenir les valeurs statistiques sur les éléments retenus.
J'ai donc pensé tout bêtement à copier cette feuille plusieurs fois et à supprimer toutes les valeurs correspondant à l'année que je ne désire pas dans les calculs. Les calculs statisques ne prennent ainsi en compte que les valeurs correspondant à l'année conservée et j'ai donc ce que je souhaite!
Or comme il y a beaucoup d'années (et beaucoup de fichiers...), c'est beaucoup trop long à faire à la main... D'où mon idée de recourir à une macro pour automatiser cette tâche.
Comme je suis débutant en VBA, j'ai utilisé l'enregistreur de macro d'Excel et j'ai obtenu un code qui fonctionne. Pas de problème là-dessus, même si je pense qu'il pourrait êtr eplus joli, on est d'accord... Le problème c'est qu'il fonctionne bien évidemment uniquement pour l'année que j'ai utilisé lors de l'enregistrement : c'est logique (ne vous inquiétez pas j'attendais pas à ce qu'il me résolve toute ma problématique ). Et comme changer à la main l'année dans la macro ne permettrait pas de gagner du temps par rapport à une opération sans macro, j'aurai voulu faire une boucle pour que dans l'ordre la macro :
- copie la feuille qui m'intéresse en dernière position (feuille 2) ;
- supprime toutes les données contenues dans les colonnes à partir de la colonne F ;
- copie la feuille initiale une nouvelle fois (feuille 3) en y insérant 3 lignes tout en haut pour y coller les intitulés des différentes colonnes de données dans le but de réaliser un filtre élaboré;
- copie en A3 l'année que l'on souhaite garder pour le filtre élaboré;
- copier sur la feuille 2, les données provenant de l'utilisation du filtre sur la feuille 3
- renommer les feuille 2 du nom de l'année correspondante aux données;
- supprimer la feuille 3 ;
- et recommencer pour une autre année de la liste...
Pour qu'au final j'ai dans mon fichier, la feuille initiale avec l'ensemble des données et autant d'autres feuilles que d'année indiquée dans la base de données.
J'avais pensé insérer une feuille supplémentaire en 1ère position du classeur dans laquelle j'aurai indiqué sur la première colonne toutes années pour ensuite renvoyer vers ces cellules pour indiquer au filtre élaboré l'année à utiliser (feuille appelée "Année"). Mais je n'arrive pas à faire la boucle...
J'espère avoir été clair.
Si quelqu'un veut bien me filer un coup de main...
Merci par avance
J'indique le code que me donne l'enregistreur de macro :
[cpp]
Sub Test()
' Préparation de la feuille finale
' Copie de la feuille principale en dernière position
Sheets("Régénération").Select
Sheets("Régénération").Copy After:=Sheets(2)
' Sélection de l'ensemble des données sur cette feuille
Rows("27:27").Select
Range(Selection, Selection.End(xlDown)).Select
' Suppression de ces données pour avoir une feuille vide avec la mise en forme et la zone des données statistiques voulues conservée
Selection.ClearContents
' Création d'une feuille intermédiaire pour permettre la manipulation des données
' Copie de la feuille principale en dernière position
Sheets("Régénération").Select
Sheets("Régénération").Copy After:=Sheets(3)
' Insertion de 3 lignes
Rows("1:3").Select
Selection.Insert Shift:=xlDown
' Copie des titres des différents champs pour préparer l'utilisation d'un filtre élaboré
Rows("28:29").Select
Range("F28").Activate
Selection.Copy
' Collage des titres des différents champs sur les deux premières lignes
Rows("1:1").Select
ActiveSheet.Paste
Range("A3").Select
Application.CutCopyMode = False
' Choix de l'année à utiliser pour le filtre élaboré
ActiveCell.Value = Worksheets("Année").Range("A25").Value
Range("A4").Select
' Sélection de la plage de données et de la plage de critères pour le filtre élaboré
Range("A28:AA2036").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("A1:AA3"), Unique:=False
' Sélection des données filtrées pour copie
Rows("1212:1212").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
' Collage des données sur la feuille finale
Sheets("Régénération (2)").Select
Rows("27:27").Select
ActiveSheet.Paste
' Changement du nom de la feuille (année correspondante)
Sheets("Régénération (2)").Name = Sheets("Année").[A25]
' Suppression de la feuille intermédiaire
Sheets("Régénération (3)").Select
Application.CutCopyMode = False
ActiveWindow.SelectedSheets.Delete
End Sub
[/cpp]
PS. J'aurai bien mis un fichier en exemple mais je ne sais pas comment ajouter une PJ à ce post...