Macro pour encadrer de maniere simple une base de donnees

SERIEUXETCOOL

XLDnaute Occasionnel
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é
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro pour encadrer de maniere simple une base de donnees

Dsl Staple je n'avais pas percuté que tu désirais le lien. J'ai justement pensé le contraire.

Alors voici le lien en rapport avec cette même discussion :
MACRO POUR ENCADRER DE MANIERE SIMPLE UNE BASE DE DONNEES page 2 - Langages dérivés / VBA, Visual Basic, VB6, VB.NET, VB 2005, VB

J'ai bien sentis qu'il y avait des balises permettant de rendre plus lisible certaines informations. Je ne trouve pas à première vue ces dites balises. Sa m'agace aussi, mais en attendant je fais à l'ancienne.


Si quelqu'un sais comment parvenir à faire la moyenne sur un colonne contenant un indicateur de début et de fin de série, sa m'aiderais beaucoup. Je vais sans doute débuter une nouvelle discussion je pense. Celle ci répondant déjà à l'objectif initial.

Qu'en pense tu staple ?
 

Staple1600

XLDnaute Barbatruc
Re : Macro pour encadrer de maniere simple une base de donnees

Re

Ce que j'en pense ? Rien de particulier
J'attends de savoir le contexte.
Quels sont ces chiffres?
A quoi servent-ils ?

Pour formater le code VBA:
[NOPARSE]
Code:
[/NOPARSE][COLOR=darkred][B]Ici ton code VBA[/B][/COLOR][NOPARSE]
[/NOPARSE]

PS: As-tu lu le lien expliquant ce qu'est le crossposting ?
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro pour encadrer de maniere simple une base de donnees

Alors certains éléments de contexte pour le fun...Je dispose de capteurs qui au cours du temps et selon l'échantillonnage acquièrent des données. Ces données sont stockées dans un fichier texte. J'utilise ensuite Excel pour traiter ces données.

Je vais remettre en pièce jointe un fichier d'exemple. Sur la colonne 1, se trouve mes séquences. Chaque séquence commence à 0 et est incrémenté par un au cours du temps. Comme ma séquence numéro 0 dure 1000 secondes, mon capteur me donne plusieurs données à chaque instant. C'est pour cela que le chiffre 0 apparait autant de fois. C'est en quelque sorte pour indiquer que nous sommes dans la séquence 0.

Et ainsi de suite, lorsque je bascule dans une autre séquence, on incrémente de 1 et on continue d’acquérir les signaux qui correspondent à la séquence. Le souci, c'est qu'au démarrage de chaque séquence le signal est bruité et donc n'est pas exploitable. Voila pourquoi je voulais supprimer un certains nombre de lignes au début de chaque séquence et à la fin de chaque séquence. Pour ne garder que le meilleur en gros.

Maintenant je dispose d'un code me permettant de supprimer ces lignes non désirées. Il me reste toute fois à faire la moyenne pour chaque séquence. A la fin, le fichier que je veux, est un fichier ne comportant plus qu'une série d'entier réels non répétés dont les valeurs sur toutes les colonnes ont été moyennées.

Voila la suite des opérations que je souhaite mettre en place pour terminer cette macro.

Ci-joint un fichier dont je cherche justement à faire la moyenne pour le réduire
 

Pièces jointes

  • FICHIER D'APPLICATION.xls
    291.5 KB · Affichages: 32
  • FICHIER D'APPLICATION.xls
    291.5 KB · Affichages: 40
  • FICHIER D'APPLICATION.xls
    291.5 KB · Affichages: 37

Staple1600

XLDnaute Barbatruc
Re : Macro pour encadrer de maniere simple une base de donnees

Re


Des capteurs? qui captent quoi?

PS: Tu as compris comment utiliser la balise CODE ?
(Il t'est possible d'éditer tes précédents messages pour formater le code VBA
Il suffit de cliquer dans le message sur Modifier la réponse)
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro pour encadrer de maniere simple une base de donnees

Plusieurs capteurs qui détectent plusieurs choses. Cela importe peu pour la suite. Les valeurs des ces capteurs sont des données qui se sont stockées dans un fichier.

On mesure par exemple le temps, des vitesses, des forces etc...

La première colonne du fichier excel est celle qui me permet de savoir ou se trouvent les diverses séquences. C'est cette colonne la qui permet de travailler la base de donnée de manière serraine.

Je poste le code qui permet de supprimer un certains nombre de lignes. Il fonctionne très bien. Il ne me sert qu'a supprimer les lignes dont les signaux sont bruités.

Code:
Sub Macro1()
Cells.Clear ' Vide la feuille

Dim plage As Range, plage_a_supp As Range
Dim nb As Long, n As Long, i As Long, j As Long
Dim t, ii As Byte

t = Split("1 11 21 31") 'Permet de créer une petite table pour exemple
For ii = 0 To 3
Cells(t(ii), 1).Resize(10) = ii
Cells(t(ii), 2).Resize(10) = [=TRANSPOSE({1,2,3,4,5,6,7,8,9,10})]
Next ii

n = ActiveSheet.UsedRange.Rows.Count 'Compte le nombre de lignes dynamiques
nb = 4 'pour ôter 4 lignes en bas et 4 en haut

If plage Is Nothing Then
  Set plage = Range("A1")
 Set plage_a_supp = plage
End If
  For i = 2 To n + 1 ' Après-dernière ligne du tableau
   If Range("A" & i).Value = Range("A" & i - 1).Value Then
    Set plage = Union(plage, Range("A" & i))
 Else
If plage.Rows.Count >= nb * 2 Then
  For j = 1 To nb
   Set plage_a_supp = Union(plage_a_supp, plage(j, 1), plage(plage.Rows.Count + 1 - j, 1))
Next
Set plage = Range("A" & i)
If Range("A" & i).Value = "" Then Exit For
     End If
     End If
  Next
   plage_a_supp.EntireRow.Delete
End Sub

Maintenant je souhaite faire la moyenne de chaque série d'entier naturel. Et enfin supprimer les données sources qui auront permis de faire la moyenne. Je ne sais pas si je suis clair ?

N'hésite pas à me demander plus d'infos.

Ps : Oui je suis allé lire le lien sur le crossposting, et oui j'utilise les balises maintenant. Sa fonctionne même drôlement bien. Donc merci du conseil.

Je remet de nouveau le fichier si certains veulent essayer de s’attaquer à lui
 

Pièces jointes

  • FICHIER D'APPLICATION.xls
    291.5 KB · Affichages: 36
  • FICHIER D'APPLICATION.xls
    291.5 KB · Affichages: 51
  • FICHIER D'APPLICATION.xls
    291.5 KB · Affichages: 39
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro pour encadrer de maniere simple une base de donnees

Je ne suis pas sure de te suivre la ?
Mes capteur me permettent de venir remplir un base de données tout simplement. Il captent un signal électrique qui est ensuite converti en numérique puis enregistré dans mon fichier. Rien de plus.


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
 

Staple1600

XLDnaute Barbatruc
Re : Macro pour encadrer de maniere simple une base de donnees

Re


Tu pourrais alléger le début de ton code ainsi
En remplaçant :
Cells(1, 1) = "0"
à
Cells(40, 2) = "10"
par
Code:
Dim t, ii As Byte
t = Split("1 11 21 31")
For ii = 0 To 3
Cells(t(ii), 1).Resize(10) = ii
Cells(t(ii), 2).Resize(10) = [=TRANSPOSE({1,2,3,4,5,6,7,8,9,10})]
Next ii
Mieux vaut "Dimer" en Long qu'en Integer.
(Ça c'est l'explication de mes suggestions précédentes)
Pourquoi? Parce que ;)

PS: Quelle est la source de ce signal électrique ?
C'est juste pour ma gouverne.
 
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro pour encadrer de maniere simple une base de donnees

Voilà j'ai modifié le code avec tes conseils. Merci.

N'aurais tu pas une idée pour faire la moyenne de chaque séquence ? J'utiliserais bien une instruction de ce type

Code:
Formule = Application.Average(Range("A" & i, ":A" & j))

En utilisant 1 ou 2 boucle For. Mais je ne parviens pas récupérer l'indice i et j pour chaque séquence.

PS :En ce qui concerne les signaux électriques je ne pense pas en savoir bien plus. Je ne connais pas leur tension électrique ni tous les descriptif. Dsl. C'est sur du 220V, mais ensuite c'est redimensionné et ce n'est pas moi qui ai cablé.

Voici le dernier code en date
Code:
Sub Macro1()
Cells.Clear ' Vide la feuille

Dim plage As Range, plage_a_supp As Range 
Dim nb As Long, n As Long, i As Long, j As Long
Dim t, ii As Byte

t = Split("1 11 21 31") 'Permet de créer une petite table pour exemple
For ii = 0 To 3
Cells(t(ii), 1).Resize(10) = ii
Cells(t(ii), 2).Resize(10) = [=TRANSPOSE({1,2,3,4,5,6,7,8,9,10})]
Next ii

n = ActiveSheet.UsedRange.Rows.Count 'Compte le nombre de lignes dynamiques
nb = 4 'pour ôter 4 lignes en bas et 4 en haut

If plage Is Nothing Then
  Set plage = Range("A1")
 Set plage_a_supp = plage
End If
  For i = 2 To n + 1 ' Après-dernière ligne du tableau
   If Range("A" & i).Value = Range("A" & i - 1).Value Then
    Set plage = Union(plage, Range("A" & i))
 Else
If plage.Rows.Count >= nb * 2 Then
  For j = 1 To nb
   Set plage_a_supp = Union(plage_a_supp, plage(j, 1), plage(plage.Rows.Count + 1 - j, 1))
Next
Set plage = Range("A" & i)
If Range("A" & i).Value = "" Then Exit For
     End If
     End If
  Next
   plage_a_supp.EntireRow.Delete
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Macro pour encadrer de maniere simple une base de donnees

Re


Si tu le souhaites, fais aussi le changement dans ton message (il prendra moins de place ;) )

Tu as compris le fonctionnement de Resize?

Cela pourrait être utile pour la suite...

PS: Toujours pour ma gouverne, quelle est la finalité de ton classeur ?
En gros, akoissasser ?
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Macro pour encadrer de maniere simple une base de donnees

Bonjour à tous,

voir fichier joint pour les moyennes des différentes colonnes en fonction du nombre en colonne A
pour plus de confort visuel , il serait préférable de mettre cela dans une autre feuille

à+
Philippe
 

Pièces jointes

  • 111.zip
    93.8 KB · Affichages: 19
  • 111.zip
    93.8 KB · Affichages: 16
  • 111.zip
    93.8 KB · Affichages: 15

Staple1600

XLDnaute Barbatruc
Re : Macro pour encadrer de maniere simple une base de donnees

Re,Bonsoir phlaurent


SERIEUXETCOOL
N'aurais tu pas une idée pour faire la moyenne de chaque séquence ?
Non pas vraiment
Je tenais juste compagnie en attendant (et en te distillant quelques conseils) qu'un autre membre du forum passe ici

Voila c'est fait.

Bonne continuation ;)

PS: Merci d'avoir utiliser les balises CODE et d'avoir pris le temps d'éditer tes messages.
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro pour encadrer de maniere simple une base de donnees

Les changements ont été fait.

Pour être franc je n'ai pas compris exactement la fonction Resize. Je suis trop débutant pour ces fonctions la. J'irais voir l'aide associée à cette fonction.

Je passe déjà bcp de temps pour essayer de résoudre le petit soucis de moyenne. L'optimisation passera après. A moins que tu sous entende que la fonction Resize pourrais me servir pour mon problème de moyenne ??? Sa fait trop d'infos d'un coup pour moi la.

La finalité de ma Macro : Lancer la Macro, qui me demande ensuite d'ouvrir le fichier qui contient les données brutes. Cette Macro supprime ensuite un certains paquets de ligne (Partie numéro une de ce post). Ensuite, la Macro réduit automatiquement la base de données en faisant la moyenne de chaque série pour passer en valeurs moyennées et en se débarrassant des milliers de lignes qui ne me sont pas utiles.
De plus une grosse partie de mise en forme est déjà faite. Je placerais donc les données de manière adéquate. Et je commencerais à réaliser des opérations sur toutes ces données pour compléter des colonnes qui n'attendent que sa. Je terminerais par le tracé de plusieurs graphe synthétisant tout sa.

Voila en gros à quoi sa me sert. Sa m'évitera tout un tas de calcul fastidieux et sa me fera passer d'un dépouillement de plusieurs heures à beaucoup moins (je l'espère, car vu comme je galère pour programmer^^). La programmation est certes "fastidieuse" mais une fois bien implémentée, j'obtiens du presse bouton.
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Macro pour encadrer de maniere simple une base de donnees

Bonsoir Phlaurent,

Merci pour ton fichier Excel. Effectivement sa à l'air de marcher. Je m'attendais à un code que je pourrais intégrer à ma Macro déjà existante.

La comme sa, je reste encore perdu. Je ne sais toujours pas comment implémenter cela dans mon programme déjà existant.

Il ne faut pas oublier que la série d'entier naturels est variable. Ainsi que le nombre de ligne de ma base de données. Donc sa complique encore un peu.


Un grand merci pour ton aide en tout cas. Je vais voir si je m'en sors avec ton fichier mais j'ai des doutes.
 

Discussions similaires

Réponses
22
Affichages
690

Statistiques des forums

Discussions
311 729
Messages
2 081 966
Membres
101 852
dernier inscrit
dthi16088