Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2011, 15h49   #1
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
Par défaut Filtre selon une colonne et copie des données propres dans nouvelle feuille

Bonjour le forum !

Petite énigme en VBA en cet après-midi fort gris

Sur une feuille "Depart", j'ai un tableau de données comme sur le screenshot ci-joint.

Je souhaite, pour chaque classe, créer une nouvelle feuille qui sera nommée selon le numéro de la classe et qui récupèrera les informations propre à cette classe.
Pour ce faire, j'ai créé une liste sans doublon (qui est effacée à la fin du traitement).
Ensuite je filtre mon tableau en fonction de la classe afin de copier les données de chaque classe une à une et de les coller dans les feuilles nouvellement crées.
Ainsi, à la fin je me retrouve avec un classeur comportant les feuilles suivantes :
Depart > 1 > 2 > 3 > 4

Voici mon bout de code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Dim lastlig As Long, lastligcl As Long, i As Long, xfeuille As Worksheet, numcl As String 
 
  ThisWorkbook.Worksheets(2).Activate
  
  ' Créer une liste (temporaire) des classes sans doublons en colonne M
  lastlig = Range("C1048576").End(xlUp).Row
  [C6:C1000].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[M1], Unique:=True
  
  
  'Créer nouvelle feuille pour chaque classe et la nommer selon la classe; placer les nouvelles feuilles en dernière position
  lastligcl = Range("P200").End(xlUp).Row
  For i = 2 To lastligcl
    numcl = Cells(i, 13).Value
    Worksheets.Add.Move After:=Worksheets(Worksheets.Count)
    Worksheets(i).Name = numcl
    Application.Goto ActiveWorkbook.Worksheets(2).Range("A1")
    Range("C6").AutoFilter Field:=3, Criteria1:=Cells(i, 13).Value
    Range("A6:E6" & lastlig).SpecialCells(xlCellTypeVisible).Copy Destination:=Worksheets(i).Cells(1, 1)
    
  Next i
  
  ' Boucle sur les noms des classes
  Application.Goto ActiveWorkbook.Worksheets(2).Range("A1")
  For i = 2 To lastligcl
    numcl = Cells(i, 13).Value
    Worksheets(i).Name = numcl
  Next i

  ' Supprime la colonne temporaire
  Range("M:M").Delete
  Range("A6:E" & lastlig).AutoFilter Field:=2
  Range("A1").Select
Dans mon tableau, le nombre de colonnes est fixe mais le nombre de lignes peut varier.

Quand j'exécute ma macro, la liste sans doublons est créée impeccablement mais survient une erreur d'exécution 1004 sur la ligne que j'ai écrite en rouge :
"Cette sélection n'est pas valide. Raison possibles:
- les zones de copie et de collage ne peuvent se superposer que si elles sont de dimension et de forme identiques.
- si vous utilisez la commande Créer à partir de la sélection, la ligne ou la colonne contenant les noms proposés n'est pas incluse dans les"
(je n'ai pas la suite du message, impossible d'agrandir la fenêtre !)

D'avance, merci beaucoup everybody !

Kaera*
Images attachées
Type de fichier : png Capture3.PNG (19,0 Ko, 5 affichages)
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 17h04   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Tu as laissé le 6 dans A6:E6. C'est pas ça ?
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 06/12/2011, 19h55   #3
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
Salut ZebreLoup !

Non je ne pense pas que ça vienne de là car j'ai également testé "A6:E", sans succès.
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 21h55   #4
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

Alors
Code :
lastlig = Range("C1048576").End(xlUp).Row
A remplacer par

Code :
1
2
3
 
with ThisWorkbook.Worksheets(2)
    lastlig = .cells(.rows.count,"C").End(xlUp).Row
Ensuite ZebreLoup a raison, si tu fais
Code :
Range("A6:E6" & lastlig)
avec lastlig = 20 par exemple, vba comprend
"A6:E6" & "20"...
donc
"A6:E620"

il vaut donc mieux mettre
Code :
Range("A6:E" & lastlig)

Mais le problème est plus profond me semble t il
Lorsque tu crées une nouvelle feuille, tu ne sélectionnes pas la bonne feuille par la suite.

Voila une possibilité de faire (je n'ai pas testé)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim LastLigCl As Long 'Toujours au moins une majuscule dans tes nom de variables
Dim TheCell As Range
Dim NewSheet As Worksheet
Dim LastLig As Long
 
'Créer nouvelle feuille pour chaque classe et la nommer selon la classe; placer les nouvelles feuilles en dernière position
 
With ThisWorkbook.Sheets(2)
    LastLig = .Cells(.Rows.Count, "C").End(xlUp).Row
  'Plutot que sheets(2), essai de donner le nom de la feuille, sa position peut varier ou alors utilise le codename de la feuille directement
  For Each TheCell In .Range("P2", .Cells(.Rows.Count, "P").End(xlUp))
    Set NewSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    NewSheet.Name = TheCell.Offset(0, -3) '-3 = de la colonne P à la colonne M
    Application.Goto .Range("A1") 'je ne connaissais pas cette méthode
    .Range("C6").AutoFilter Field:=3, Criteria1:=TheCell.Offset(0, -3).Value
    .Range("A6:E" & LastLig).SpecialCells(xlCellTypeVisible).Copy Destination:=NewSheet.Range("A1")
 
  Next i
++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 06/12/2011, 22h41   #5
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
Salut salut,

D'abord, au temps pour moi ZèbreLoup.

Ensuite, Qwazerty, merci de ta réponse.
MEA CULPA : il y a une minuscule erreur dans le code que j'ai donné au début du topic.
Je crée une liste temporaire sans doublon dans la colonne M mais plus bas j'ai écrit colonne P. Donc, sorry.
Du coup, ton code lavé de ma faute doit donner :
Code :
NewSheet.Name = TheCell.Offset(0, 0)
au lieu de
Code :
NewSheet.Name = TheCell.Offset(0, -3) '-3 = de la colonne P à la colonne M
right ?

Autre chose : à propos de l'utilisation du nom de la feuille plutôt que Worksheets(2), le problème c'est que la feuille en question porte un nom avec partie fixe et partie variable. Explanation : La feuille est nommée par macro "Depart_nomfichier" et varie donc en fonction du nom du fichier.

Merci d'avance.
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 06h07   #6
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Dans ce cas la
Code :
NewSheet.Name = TheCell
Offset te permet de te décaler de y lignes et x colonne, donc se décaler de 0, 0 revient à rester en place .

Pour le reste, il faudrait avoir une vue un peu plus large de ton code, par exemple à quel moment crées tu la feuille que tu pointes avec worksheets(2) et comment appelles tu le morceau de code que tu nous a donné?

Le fait d'avoir une partie variable sur le nom d'une feuille n'est pas un problème, exemple

Code :
1
2
3
4
5
6
7
8
9
DIm NomFichier as string
 
'On défini le nom du fichier
NomFichier = "a adapter"
 
'[...] Suite du code
'On pointe notre feuille
with Thisworkbook.sheets("Depart_" & NomFichier)
    '[...]
En y réfléchissant un peu, il me semble que lorsque tu dis Worksheet(2), au vu des explication que tu donnes en début de sujet, tu veux faire référence à ta feuille de départ, donc pas de problème de nom de feuille?
Et donc par extension la création des feuilles est faite par le code que tu nous propose? right?

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 07h32   #7
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
Hallo,

Il est vrai que j'aurais dû davantage expliciter le "contexte" de mon bout de code.

Le but de la macro-mère (qui contient donc des macros-enfants, dont le code que j'ai donné en début de topic) est d'importer un fichier texte, de le nettoyer, le mettre en forme et d'effectuer quelques traitements avec les données, tout ceci afin de faciliter la lecture et l'analyse dudit fichier.
Le nom de ma worksheets(2) varie donc en fonction du fichier importé.

Les étapes du traitement de la macro-mère:
-importer le fichier texte
-le nettoyer des lignes futiles
-organiser les données sous forme de tableau
-filtrer ledit tableau en fonction de la colonne C et pour chaque donnée différente en C (ici la classe), créer une nouvelle feuille sur laquelle seront copiées les lignes du tableau propres à la donnée du tableau filtré.

Vielen Dank im Voraus

(PS: je me sens d'autant plus idiote que j'avais pourtant bien compris le concept d'Offset...)
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2011, 17h46   #8
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Pas de soucis pour Offset, on est parfois trop pressé

Pour ce qui est de ta macro, ta macro-mère ouvre le fichier texte, donc ensuite rien ne t'empêche de pointer la feuille dans une variable worksheet et de la passer en paramètre à ta macro-enfant (ou juste le nom du fichier).

N'hésite pas à proposer ton code si tu veux une simplification (si nécessaire) et ça nous permet de mieux voir les interactions entre les différentes macro. A toi de voir.

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/12/2011, 23h43   #9
Membre du Club
 
Avatar de Kaera
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 102
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2011
Messages : 102
Points : 69
Points : 69
Salut Qwaz'

C'est une macro qui comporte pas mal de traitement et qui contient des informations que je ne peux divulguer.
Lorsque c'était pour des bouts de code, ce n'était pas grave et puis je pouvais toujours modifier les infos "gênantes", mais là, impossible !
Néanmoins je te remercie beaucoup, une fois de plus !

'nuit
Kaera est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h54.


 
 
 
 
Partenaires

Hébergement Web