Copier des lignes en fonction d'une variable dans des onglet

Bonjour,

Je débute en ce qui concerne VBA: je tente,actuellement,de créer une macro qui a plusieurs effets.

Jusque-là j’avançais relativement vite à mon sens, mais là je bloque depuis quelque jours.

Je pars d’une base de données allant jusqu'à la colonne CH (comprise) et pouvant avoir un nombre de lignes variables (plus de 10 000 en moyenne).

Mon but est d’effectuer un tri via la colonne « CC ».

Je m’explique, si la cellule de la colonne « CC » contient «gâteau » alors je souhaiterais que toutes les lignes dont la cellule de la colonne CC est « gâteau », soient alors copiées dans un onglet du même nom.

La ou les choses se compliquent (outre le fait que sur plusieurs lignes la cellule de la colonne CC peut être vide) c’est que j’ai également besoin de pouvoir mettre sur le même onglet des lignes dont la cellule de la colonne cc ne contient pas le même mot. Ainsi il faudrait que si la cellule de la colonne « cc » contient « clavier » ou « souris » ou « imprimante » alors chaque ligne dont la cellule de la colonne « cc » contient l’un de ces trois mots ,soit alors copiée dans un nouvel onglet appelé « ordinateur ».

Le tout en laissant ma base intacte.

J’en suis arrivé à un stade ou de la fumée me sort par les oreilles….

Un ténor du VBA serait-il dans le coin pour me dépanner ?

Merci d’avance.

Bonsoir,

Si je comprends bien, ta base part de A1 à CHxxxxx.

Dans un premier onglet, on met "Cadeau", et dans un autre, toutes les autres données, cellules CCxxx vides comprises.

On veut bien t'aider, mais il faut que tu précises au maximum tes souhaits, avec les termes exacts...

Et le mieux, tu joins un fichier exemple, exempt de toutes données confidentielles, mais au plus près de ton fichier réel.

@ te relire

bonjour,

Déjà je tiens à te remercier de te pencher sur mon sujet.

Comme tu l'as deviné, il s'agit d'un tableau dont les données sont confidentielles (et non de pâtisseries ^^).

Je vais essayer de créer un fichier équivalent pour être plus précis.

je fais ça tout de suite.

Re,

Tu trouveras ci-joints deux fichiers,

Le premier étant l’équivalent de la base de travail, et le second, le résultat que je souhaiterais avoir.

Les 30 variables de la colonne « cc » (il s’agit de la colonne i dans mon exemple) sont toujours les mêmes. Ces 30 variables peuvent donc être inscrites en dur dans le code.

Le nombre de lignes peut varier entre environ 200 et plus de 10 000.

J’ai fait exprès de laisser des cellules vides,ainsi que d’avoir des variables qui ne se suivent pas toujours ,

afin de coller au mieux à la réalité.

Merci encore de ton aide…

ps: j'ai du zipper les deux fichiers car ils sont supérieur à 300Ko.

24exemples.rar (228.12 Ko)

Re-,

C'est bien ce dont j'avais peur....

Dans l'onglet "informatique", tu mets plusieurs "problèmes"

Comment je sais qu'en fonction du problème, ces données vont dans cet onglet?

Est-ce qu'il y a plusieurs groupes ainsi constitués?

Et ensuite, je mets où les données dont le problème est "vide"?

@ te relire

Il s'agit toujours des 30 mêmes "problèmes".

Ceux qui constituent l'onglet (dans notre exemple) "informatique" sont toujours les 5 mêmes "problèmes" soient ici : "clavier et souris"; "écran et caisson de basses"; "imprimante"; "nass"; "câbles et wifi".

L'ordre de copie des lignes n'a que peu d'importance compte tenu du fait que l’étape d’après sera de créer des tableaux croisés dynamiques. (pour savoir par exemple la somme de la colonne remboursement en fonction de la date).

Il n'y a qu'un seul groupe ainsi constitué ,les autres étant observés, les autres "problèmes" étant observes seuls.,

pour ce qui est des "problèmes" vides,peut être les mettre dans un onglet "résidu" ainsi, si l'on fait la somme de la colonne remboursement de tous les onglets, on retrouve la somme de la colonne remboursement de l'onglet "base" (qui lui doit resté inchangé).

merci encore de ton aide.

Re-,

Essaie le fichier joint, et fais attention aux remarques en vert dans le code, pour pouvoir mettre ce code dans ton fichier réel...

Bon courage

Bonjour,

J’ai suivi à la lettre les commentaires, tout fonctionne parfaitement jusqu'à maintenant (après adaptation au véritable fichier de travail), il va falloir que je teste la macro sur un nombre significatif de bases pour constater si j’ai omis des variables ou pas.

En tout cas cela va me permettre d’avancer et je te suis sincèrement reconnaissant !!!

si jamais je devais être amené a créer un deuxième groupe de problème (tel que "ordinateur" me suffit il de dupliquer ce passage :

Ordi = Array("clavier et souris", "écran et caisson de basses", "imprimante", "Nass", "câbles et wifi")

Set Prob = CreateObject("Scripting.Dictionary")

With Sheets("Base")

.Range("CK1").Value = .Range("I1").Value 'remplace I1 par CC1

Derlig = .Cells(Rows.Count, "A").End(xlUp).Row

Set Plg = .Range("A1:J" & Derlig) 'ATTENION à bien définir la plage(dans ton fichier réel, remplace J par CK)

For Each Cel In .Range("I2:I" & Derlig) 'Ici, remplace I par CC

If Not IsEmpty(Cel) Then

If IsError(Application.Match(Cel.Value, Ordi, 0)) Then

Prob(Cel.Value) = Cel.Value

End If

End If

Next Cel

Sheets.Add After:=Sheets(Sheets.Count)

ActiveSheet.Name = "Ordinateur"

For I = 0 To UBound(Ordi)

.Cells(I + 2, "CK").Value = Ordi(I)

Next I

Plg.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range( _

"CK1").Resize(UBound(Ordi) + 2), CopyToRange:=ActiveSheet.Range("A1"), Unique:=False

.Range("CK1").Resize(UBound(Ordi) + 2).Clear

et de le placer a la suite du premier groupement en changeant les variables ?

Un tres grand merci à toi.

Ps : je n’aurais pas toujours la chance de tomber sur quelqu’un comme toi, de ce fait aurais tu un livre à me conseiller pour me perfectionner en VBA. ?

Bonjour,

Je suis ravi que tu aies pu transcrire ce code dans ton fichier réel.

Effectivement, si tu souhaites créer un deuxième groupe, il te suffit de rajouter un Array, de modifier les conditions pour être intégré dans l'objet "Prob", c'est à dire rajouter une deuxième condition If IsError(Application.Match.....), et de rajouter une deuxième boucle afin de rentrer les nouveaux "problèmes" dans la zone de critère du filtre élaboré (les cellules BK1 à BKxxx).

Pour ta formation, te conseiller un livre ou un autre, je ne saurai dire???

Perso, je suis entièrement autodidacte, mais il faut passer du temps...(plus de 20 ans pour ma part...)

Sinon, J.Walkenbach peut être un bon début, mais surtout, ne pas hésiter à consulter les différents tutos, que ce soit sur ce site, ou sur d'autres.

Bref, être curieux.

Bon courage, et bon dimanche

Je suis pas sur de tout comprendre... :s

lorsque je fais les modifications cela me créer soit une colonne vide "animaux", soit cela ne veux pas aller plus loin....

:s

Re-,

Renvoie un nouveau fichier, avec tes nouvelles conditions, afin de voir ce qu'on peut faire..

@ te relire

c'est comme le premier fichier sauf que à la place d'un seul groupement "ordinateur" on en rajoute un deuxième "animaux" composé des problèmes "chien" et "chat".

j'en profite, on est bien d'accord qu'il n'est pas possible de regrouper plusieurs colonnes en même temps sur plusieurs feuilles en même temps? (ex : regrouper les colonnes A:F sur toutes les feuilles),

dans ce cas la seule solution c'est de le faire feuille par feuille, mais comment faire dans nôtres exemples puisque le nombre et le nom des feuilles changes en fonction des problèmes. ?

Re-,

Regarde le fichier joint, j'ai modifié le code, et annoté également..

Par contre, je ne comprends pas ta 2ème question, qu'entends-tu par "regrouper"?

si c'est pour fusionner, je te le déconseille vivement, la fusion des cellules peut peut-être servir à faire "jouli", mais pour un traitement d'une base de données, c'est à proscrire...

@ +

je te remercie je regarde ça tout de suite.

non, il ne s'agit pas de fusionner mais de "grouper" :

With Columns("P:Z")

.Columns.Group

.Columns(1).ShowDetail = False

End With

Re-,

OK

En faisant une boucle sur toutes les feuilles, style :

Dim Sh As Worksheet
For Each Sh In Sheets
    If Sh.Name <> "Base" Then
        With Sh.Columns("P:Z")
            .Columns.Group
            .Columns(1).ShowDetail = False
        End With
    End If
Next Sh

Peut-être?

(non testé)

pour le second groupement, parfait.... çà fonctionne nickel et comme ça je pense avoir compris si jamais j'ai besoin d'en faire un troisième (en tout cas j’espère pas !^^). J'en était quand même assez loin... :s

pour la boucle j'essai tout de suite et je te tiens au courant!

merci encore c'est vraiment cool de ta part!

La boucle a l'air de fonctionné parfaitement...

encore une fois, je me dois de te remercier pour tout ça....

ça commence à prendre vraiment forme...

curieusement c'est la boucle de mise en forme qui a l'air de prendre le plus de ram, par rapport a la boucle de ventilation des onglets...

Re-,

Est-ce que tu as mis ce dernier code dans la procédure initiale?

Sinon, si tu as des formules dans ton fichier, on peut accélérer le code en mettant ceci en début :

'mettre en début de code
With Application
    .DisplayAlerts = False
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With
'.... code
' et terminer comme ceci :
Application.Calculation = xlCalculationAutomatic

Sinon, comme dans mon code, j'utilise le filtre élaboré, c'est très rapide, donc peu de ressources sollicitées.

bonne soirée

Je n'est pas encore implémenté de formule mais ça va venir donc je note le code permettant de bloquer les formules le temps de la macro pour plus tard !

pour le reste oui j'avais bien laisser le code permettant de bloquer le rafraîchissement de l'écran et les alertes.

merci encore

Bonjour,

J’ai testé la macro cette après-midi, et cela fonctionne parfaitement !

J’avais peur que cela prenne du temps à tourner, mais cela a pris à peine 15,52 secondes pour une base de données de plus de 54 000 lignes. Ma crainte était que cela mette beaucoup plus de temps.

Du coup je me demande s’il est possible de rajouter une fonctionnalité à la macro.

A savoir, pour chaque onglet créé, ajouter un second onglet qui aurait pour nom : ZOOM_« nom de l’onglet de base » avec toujours les mêmes variables en colonnes, lignes, et valeurs.

Ainsi il me resterait à créer un onglet type sommaire, pour que, en fonction de ce que l’on veut observer, on l’atteigne directement.

Cela est-il possible ? Compliqué ?

Cordialement,

Rechercher des sujets similaires à "copier lignes fonction variable onglet"