MACRO POUR ENCADRER DE MANIERE SIMPLE UNE BASE DE DONNEES

Résolu
SERIEUXETCOOL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
- 29 juil. 2011 à 13:26
SERIEUXETCOOL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
- 1 août 2011 à 19:42
Bonjour à tous,

Je ne suis pas sûr de poster mon message dans la bonne rubrique. Donc d'avance dsl si je fais erreur.

Je cherche à programmer une petite macro sous Excel 2007 me permettant d'encadrer très simplement une base de donnée sous le schéma suivant :

-Dans la colonne B se trouve la série de données :
0
0
0
0
0
1
1
1
1
1
2
2
2
2
2
3
3
3
.
.
.
30
30
30
30
30
30
31
31
31

Il s'agit simplement d'un exemple. La longueur de ces données est dynamique et n'occupe donc pas un nombre de ligne fixe. Chaque série commence de 0 et est incrémentée jusqu'à une certaine valeur variable. Chaque valeur 0,1,2...est reportée de nombreuse fois à l'identique. C'est à dire que le chiffre 0 sera mis 10 fois de suite, puis on mettra 5 fois le chiffre 1, puis 129 fois le chiffre 2, puis 45 fois le chiffre 3 et ainsi de suite jusqu'à atteindre la valeur finale requise.

Mon objectif est de supprimer certaines lignes qui ne m'intéressent pas. Il S'agit de supprimer les 2 premières lignes et les deux dernières lignes associer à chaque chiffre.
Ainsi pour le chiffre 0 je vais supprimer les 2 premières lignes, garder le reste et finalement supprimer les 2 dernières lignes ou le chiffre 0 se répète. Ensuite on fait de même avec le chiffre 1 en supprimant ses 2 premières occurrences ainsi que ses 2 dernières. Il s'agit bien de supprimer TOUTE la ligne et pas uniquement une case.

Voila, pour résumer je cherche à épurer une liste de valeurs identiques par ses extrêmes en supprimant les 2 premières et 2 dernières lignes.

J'ai essayé avec des boucles et des condition mais je n'y parviens pas. Voila mon idée de départ^^

For i = 1 To i=n '(n étant le nombre de lignes total du tableau)

If Cells(i, 2) <> Cells(i + 1, 2) Then Rows("i:i-2").Select and Rows("i:i+2").Select '(on travail sur la colonne B)
Selection.Delete Shift:=xlUp

Next


Mais cela ne marche pas. Je suis trop débutant.

Merci à ceux qui pourrons m'éclairer par un petit bout de code^^

André

24 réponses

ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
31 juil. 2011 à 21:43
Bon.
Me revoilà, donc (sur ma machine) mais un petit peu ... on va dire joyeux.
Mais voilà, en admettant que "In vino veritas" se vérifie ce soir :
Ces petites modifs devraient faire face à tous tes cas de figure. Si tu t'en sers, fais un copier-coller
nb = 5
   If nb = 0 Then Exit Sub
   For i = 2 To Rows.Count
     If Range("A" & i).Value = Range("A" & i - 1).Value Then
       If plage Is Nothing Then
         Set plage = Union(Range("A" & i - 1), Range("A" & i))
       Else
         Set plage = Union(plage, Range("A" & i))
       End If
     Else
       If plage.Rows.Count >= nb * 2 Then
         For j = 1 To nb
            If plage_a_supp Is Nothing Then
            
              Set plage_a_supp = Union(plage(1, 1), plage(plage.Rows.Count, 1))
            Else
              Set plage_a_supp = Union(plage_a_supp, plage(j, 1), plage(plage.Rows.Count + 1 - j, 1))
            End If
         Next
         Set plage = Range("A" & i)
         If Range("A" & i).Value = "" Then Exit For
       Else
         Set plage = Nothing
         If Range("A" & i).Value = "" Then Exit For
       End If
     End If
   Next
   plage_a_supp.Rows.EntireRow.Delete

Comme tu vas le voir, j'ignore simplement les groupe à nombre d'éléments insuffisants et les laisse intacts.
Mais si tu souhaites aller encore plus loin, par exemple si nb > nombre d'éléments du groupe, alors supprimer tant que possible et jusqu'à concurrence du nombre d'éléments, tu dis et je te le fais en cerise sur le gâteau, mais plutôt demain, lorsque mes idées seront à nouveau devenues parfaitement claires.
Mais en attendant : si problème tel qu'il est posé, déjà résolu, fait comme le demande NHenry (tag "réponse acceptée")>.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
SERIEUXETCOOL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
1 août 2011 à 18:19
Salut Ucfoutu,

Merci pour ta petite modification. Elle marche terriblement bien. Concernant la fonction pour supprimer certaines lignes j'admet que c'est bon la.

Maintenant pour terminer définitivement mon besoin, j'aimerais ajouter un bout de code à celui existant pour lui faire ceci :

De manière générale j'ai une feuille excel avec les données suivantes :

Colonne1/Colonne2/Colonne3...
0 xxx xxx
0 xxx xxx
0 xxx xxx
1 xxx xxx
1 xxx xxx
1 xxx xxx
2 xxx xxx
2 xxx xxx
2 xxx xxx
3 xxx xxx
3 xxx xxx
3 xxx xxx

-Les données partent de 0 et vont jusqu'à X. X étant un nombre connu mais variable. C'est une série de nombre entier, ordonnée du plus petit au plus grand.
Chaque entier naturel est répété un certain nombre de fois. Dans mon exemple on compte de 0 à 3 en répétant chaque chiffre 3 fois. (c'est un exemple)

-Mon but est de calculer la moyenne sur certaines colonnes de la manière suivante. Je commence avec la première série de 0. Je fais la moyenne sur toute les lignes qui ont pour indice 0, j'insère une ligne, je note la moyenne et je supprimer toutes les valeurs qui m'on servi à calculer la moyenne. Je fais donc la moyenne pour la colonne A, B,C...

-Ensuite je passe à l'entier naturel suivant, les 1. Et ainsi de suite.

-A la fin je souhaite obtenir un fichier ne représentant que les moyennes

Colonne1/Colonne 2/Colonne3....
0 XXX XXXX
1 XXX XXXX
2 XXX XXXX
3 XXX XXXX

Pour ce faire, il faut bien sur réutiliser le même code précédent. Une première partie du code supprime un certains nombre de lignes et la deuxième partie du code doit pouvoir me calculer la moyenne sur chaque série d'entier naturel et l’afficher pour remplacer la série d'entier.

Je pense être clair mais si vous avez besoin de plus d'infos je suis la.

Merci pour votre aide.

PS : J'ai commencé en utilisant la fonction suivante qui fonctionne. Mais je ne parviens pas à l'intégrer dans une boucle.

Formule = Application.Average(Range("A" & i, ":A" & j))
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
1 août 2011 à 19:24
Bien.
Mais ce nouveau problème étant totalement distinct de celui traité par la présente discussion, il convient que tu ouvres, en ce qui le concerne, une discussion à part entière.

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
SERIEUXETCOOL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
1 août 2011 à 19:42
Je le fait de suite.

Sujet Clos

Merci Ucfoutu
0