SERIEUXETCOOL
Messages postés336Date d'inscriptiondimanche 3 avril 2011StatutMembreDernière intervention12 juin 2012
-
29 juil. 2011 à 13:26
SERIEUXETCOOL
Messages postés336Date d'inscriptiondimanche 3 avril 2011StatutMembreDernière intervention12 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é
A voir également:
MACRO POUR ENCADRER DE MANIERE SIMPLE UNE BASE DE DONNEES
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 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
-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
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))
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 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