Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Classer des données en les dupliquant vers différentes sheets

ClementineJ

XLDnaute Nouveau
Bonjour à tous !

Je viens aujourd'hui dans l'espoir d'avoir un petit coup de main. Je m'explique :

Je suis en train de développer une macro qui a pour but d'automatiser le traitement de différentes données.
Le problème, c'est que je bloque sur une partie du code...


Actuellement, mon programme passe par plusieurs étapes :

- Il propose à l’utilisateur d’importer des données
- Ces données sont importées dans une feuille « Données » dans un tableau(n°1)
- Et un nouveau « petit » tableau (n°2) est créé à côté du premier dans la colonne N dans lequel se trouve la liste contenant le nom des différentes communautés existantes
- Cette liste est utilisée pour générer autant de nouvelles feuilles que de communautés
- Et évidemment, chaque feuille est automatiquement nommée avec le nom contenue dans la cellule grâce à laquelle elle a été créée.




Maintenant, ce que je souhaite faire, c’est répartir les données des communautés contenues dans le tableau 1 dans leurs feuilles respectives. Donc j’ai commencé la rédaction mais je n’arrive pas à faire en sorte de sélectionner + copier les bonnes cellules…

Je pense que j’ai bien commencé, mais - je crois que c'est - ce qui est en vert qui cafouille ! (Je suis désolée si le code pique les yeux, mais au moins, j’ai une excuse : j’ai commencé le vba il y a moins de 5 jours )


Voilà le code :

Code:
Sub Repartitiondesdonnes()
Set donnees = Sheets("Donnees")
Dim line
line = 2

Do Until IsEmpty(donnees.Range("E" & line))
    Set Current = Sheets(Left(donnees.Range("E" & line), 22))
    For Each ws In Worksheets
        If [COLOR="#008000"]ws.Name = donnees.Range("E" & line) Then
            ActiveCell.EntireRow.Select
            ActiveCell.EntireRow.Copy
            'Selection.Copy
            'ws.Name.Range("A1") Paste[/COLOR]
        
        End If
    Next
    line = line + 1
Loop
End Sub

Donc voilà ! Si l’un de vous a une idée pour faire fonctionner la boucle, qu’il n’hésite pas à me la faire connaitre !


En vous remerciant déjà une première fois d'avoir prit le temps de lire tout ça !
Clémentine
 

Pièces jointes

  • image.jpg
    56.7 KB · Affichages: 44
  • Donnees exemple.xls
    38 KB · Affichages: 34
  • Modèle d'exemple.xlsm
    45.4 KB · Affichages: 17
Dernière modification par un modérateur:

Modeste

XLDnaute Barbatruc
Re : Classer des données en les dupliquant vers différentes sheets

Bonjour Clémentine et bienvenue à toi,

Dans un cas comme celui-ci, un extrait de ton fichier (sans données confidentielles) faciliterait la compréhension ... et je ne te parle de la difficulté à proposer des solutions

Ceci dit, les deux références à une ActiveCell semblent curieuses: tu copierais la même ligne à chaque passage dans la boucle!?


PS: l'utilisation des couleurs (vertes ou autres) dans les balises
Code:
 n'est pas possible
 

ClementineJ

XLDnaute Nouveau
Re : Classer des données en les dupliquant vers différentes sheets

Bonjour Modeste,

Tout d'abord, merci pour ta réponse (je ne pensais pas en avoir une si rapidement !)

J'ai ajouté deux fichiers pour que tu puisses mieux comprendre le fonctionnement du petit programme :
- un modèle d'exemple avec les macros
- un exemple de données à importer dans le modèle

Et oui, évidemment mon but n'est pas de copier la même ligne mais d'utiliser une boucle pour parcourir tout le tableau et copier/coller les données correspondantes dans les bonnes worksheets... (en fonction de ce qui est contenu dans E bien entendu)

Le code que je t'ai envoyé juste avant - qui était effectivement sans couleurs - est contenu dans le module 4. N'hésites pas à me dire si tu vois quelque chose d'étrange, je t'avoue que j'y vais totalement au feeling là dessus et que certaines choses m'échappent encore totalement !
 

Modeste

XLDnaute Barbatruc
Re : Classer des données en les dupliquant vers différentes sheets

Bonjour Clémentine,

Il y a une chose que les demandeurs ont décidément un peu de mal à se représenter, c'est -pour ceux/celles qui les lisent- la difficulté qu'il y a à "deviner" ce qui n'est pas précisé. Tu connais ton fichier par cœur, de même que son fonctionnement, sa structure, etc. Nous, nous n'en connaissons ... rien!
Dans tes 2 fichiers exemples (qui ne correspondent pas vraiment à l'image que tu avais fournie au départ), on ne sait pas si des feuilles existent, portant comme nom un des items représentés en colonne "Action". Peut-être qu'en fouillant ton code on finirait par obtenir la réponse, mais ça prendrait un temps ... dont nous ne disposons pas toujours

Pour faire au plus simple, j'ai donc considéré que, dans le classeur contenant la macro, existait déjà une feuille "View" (seul item présent en colonne E). Si c'est bien le cas et s'il s'agit de copier dans cette feuille, les lignes correspondant à cette action, il me semble que ton code peut se modifier comme suit:
VB:
Sub Repartitiondesdonnes()
Set donnees = Sheets("Donnees")
Dim line
line = 2
Do Until IsEmpty(donnees.Range("E" & line))
    Set Current = Sheets(Left(donnees.Range("E" & line), 22)) 'Current n'est plus utilisé dans la suite du code!?
    For Each ws In Worksheets
        If ws.Name = donnees.Range("E" & line) Then
            donnees.Range("E" & line).EntireRow.Copy ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
        End If
    Next
    line = line + 1
Loop
End Sub


Ceci dit, tu as donc une boucle For ... Next, à l'intérieur d'une autre boucle Do ... Loop. Le temps d'exécution s'allonge donc. Tu peux (toujours à condition que les feuilles existent préalablement!) écrire:
VB:
Sub Repartitiondesdonnes()
Set donnees = Sheets("Donnees")
Dim line
line = 2
Do Until IsEmpty(donnees.Range("E" & line))
    donnees.Range("E" & line).EntireRow.Copy Sheets(donnees.Range("E" & line).Text).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
    line = line + 1
Loop
End Sub
J'ai tout de même pris la précaution d'ajouter un item et une feuille du même nom, pour tester.
Je me suis permis de supprimer le Set Current ... puisque pas utilisé. Tu verras bien ...
Si le volume de données à traiter est nettement plus conséquent, il faudra sans doute envisager de s'y prendre autrement. Tu nous diras si le temps d'exécution devient "pharaonique"

Pas regardé le reste du code, hein
 

ClementineJ

XLDnaute Nouveau
Re : Classer des données en les dupliquant vers différentes sheets

Rebonjour,

Déjà merci à nouveau, pour le temps que tu passes à répondre / à participer à cette communauté sur ce forum !

Ensuite, c'est vrai que je n'ai pas été très précise dans mes explications et je m'en excuse... Du coup :

L'idée, c'est que chaque mois, je vais recevoir des données relatives à la fréquentation des différentes pages d'un site intranet.

Ces données sont auto-générées et porteront toujours le même format (que celui présent dans "Donnees d'exemple"). La seule différence avec le fichier que je t'ai fourni c'est le nombre de ligne qui est, en effet, conséquent (il faut compter entre 100 000 et 200 000 lignes à termes pour le même nombre de colonne qu'actuellement).

Quand tu ouvre le fichier "Modèle d'exemple", une seule worksheet existe qui est appelée Menu, via celle-ci tu vas pouvoir exécuter des macro qui te permettent d'exploiter les données (pour toi, ces données sont présentent dans donnees d'exemple). Tu as donc 3 boutons (+2 boutons de suppression) pour :

-importer les données dans une deuxième worksheet qui s'auto-nomme "Donnees"
-puis le bouton "générer les pages" créer autant de worksheets vierge qu'il y a d'éléments dans "Liste des Communautés"-Colonne N
-suite à quoi, le dernier bouton permettra de répartir les données dans les bonnes Sheets (et c'est là que je suis venue quémander de l'aide :x )



-> Du coup ! Le deuxième code fonctionne bien SAUF QUE arriver à la ligne

Code:
 donnees.Range("E" & line).EntireRow.Copy Sheets(donnees.Range("E" & line).Text).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

Un message d'erreur me dit "L'indice n'appartient pas à la sélection... Je vais peut-être avoir l'air bête, mais l'indice c'est quoi ? '-'


Merci encore et par avance pour le temps que tu as/ passes à lire
Clem'
 

Modeste

XLDnaute Barbatruc
Re : Classer des données en les dupliquant vers différentes sheets

Re,

Un indice, c'est par exemple le n° d'un élément (sa position) dans un tableau ... ça peut aussi être une feuille qui n'existe pas dans un classeur!?
Tu es certaine d'avoir créé tes feuilles avant l'exécution de la macro? Je viens de re-tester ici, avec ton fichier exemple: si en colonne E, j'ajoute un nom qui ne correspond pas à une feuille existante, j'ai bien le message que tu évoques!
 

ClementineJ

XLDnaute Nouveau
Re : Classer des données en les dupliquant vers différentes sheets

Tu vas me haïr x)

En principe les feuilles sont toutes bien créées ... Enfin toutes sauf une :
-> j'ai eu un truc que je n'arrivais pas à contrôler à un moment, dans mon petit tableau en N, qui me permet de générer les pages, je lui demandais de ne me mettre que les cellules contenues dans E et ayant une valeur. SAUF QUE, il laissait apparaitre aussi systématiquement une cellule vide dans le tableau en plus. Ce qui fait que quand je voulais générer les pages à partir de la liste en nommant les pages en fonction de ce qui était contenu dans les cellules, arrivé à la cellule vide, il me pondait une erreur style "L'indice n'appartient pas à la sélection" (petit effet de déjà vu, pas vrai ? ^^' ) du coup je l'avais réglé avec ce code là

Code:
       For Each cell In Range("N:N")
         If IsEmpty(cell.Value) Then Exit For
         If cell.Value <> "Liste des Communautés" Then
            If cell.Value <> "" Then
                Worksheets.Add().Name = cell.Value
            End If
         End If
      Next cell

Mais au final j'ai jamais compris où il me trouvait une cellule vide... Du coup est-ce que ça pourrait venir de là ?
 

Modeste

XLDnaute Barbatruc
Re : Classer des données en les dupliquant vers différentes sheets

Tu vas me haïr x)
Gagné!!!!!

Regarde éventuellement sous la dernière cellule au contenu apparent, dans ta colonne E, si un espace (ou autre caractère difficilement visible) ne traînerait pas dans la première cellule qui semble vide.

Autrement, sans fichier, on peut se perdre en conjectures

Et comme le disait Chimène: "Va, je ne te hais point!"
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…