Création d'un outil de correction de données avec moyennes flottante
Bonjour à toutes et à tous.
Je suis actuellement en stage et l'une de mes missions consiste à analyser les données de compteurs de passage à certains endroits.
Or ces compteurs ne sont pas très performants, ils ont tendance à s'emballer pour différentes raisons ce qui produit des données parfois très éloignées de la réalité.
J'ai donc mis en place un protocole de correction des données que jusqu'alors j'effectuais à la main. Mais la taille de mes bases de données est telle que cette partie de mon stage bouffe tout mon temps, m’empêchant de remplir mes autres missions.
J'ai découverts Excel VBA il y a quelques heures et malgré mes recherches je n'ai pas trouvé de tuto me permettant de réaliser mon protocole.
Voici mon idée :
("n" étant le numéro de cellule, le seuil de valeur aberrante est déjà fixé mais est différents pour chaque compteurs et "H" étant la colonne)
Dans la feuille 3,
Si la cellule Hn > (seuil valeur aberrante) alors la remplir en jaune
Si la cellule Hn > (seuil valeur aberrante) et H(n+170) < (seuil valeur aberrante)
Alors remplacer Hn par la moyenne de H(n-170) et H(n+170) arrondit à l’entier inférieur
Si moyenne de H(n-170) et H(n+170) arrondit à l’entier inférieur = 0
Alors remplacer moyenne de H(n-170) et H(n+170) arrondit à l’entier inférieur par 1
Si H(n+170) > (seuil de valeur aberrante)
Alors remplacer Hn par 1
Je ne peux malheureusement pas vous transmettre de fichier, ces données étant confidentielles mais globalement il s'agit de base de données comptant les passage devant les compteurs toutes les heures depuis 2010.
Merci d'avance pour votre coup de main, et pour me permettre de mieux utiliser ces outils !
A Bientôt
Ugo
bonjour,
une proposition, vérifier les hypothèses (ce qu'il faut faire quand n<170 n>dernière ligne -170)
Sub aargh()
'("n" étant le numéro de cellule, le seuil de valeur aberrante est déjà fixé mais est différents pour chaque compteurs et "H" étant la colonne)
'Dans la feuille 3,
'
'Si la cellule Hn > (seuil valeur aberrante) alors la remplir en jaune
'
'Si la cellule Hn > (seuil valeur aberrante) et H(n+170) < (seuil valeur aberrante)
'
'Alors remplacer Hn par la moyenne de H(n-170) et H(n+170) arrondit à l’entier inférieur
'
'Si moyenne de H(n-170) et H(n+170) arrondit à l’entier inférieur = 0
'
'Alors remplacer moyenne de H(n-170) et H(n+170) arrondit à l’entier inférieur par 1
'
'Si H(n+170) > (seuil de valeur aberrante)
'
'Alors remplacer Hn par 1
vab = 800 'valeur aberrante <- à adapter
With Sheets("feuil3")
dl = .Cells(Rows.Count, 8).End(xlUp).Row 'ligne dernière mesure
For i = 1 To dl
hn = .Cells(i, 8)
hnp170 = .Cells(Application.Min(dl, i + 170), 8) 'hn+170 vérifier hypothèse si n>dl on prend dl pour n+170
hnm170 = .Cells(Application.Max(1, i - 170), 8) 'hn-170 vérifier hypothèse si n<170 on prend 1 pour n-170
If hn > vab Then
.Cells(i, 8).Interior.Color = vbYellow
If hnp170 < vab Then
mh = Int((hnp170 + hnm170) / 2)
If mh = 0 Then
nouveauHn = 1
Else
nouveauHn = mh
End If
Else 'hnp170>vab
nouveauHn = 1
End If
.Cells(i, 8) = nouveauHn
End If
Next i
End With
End SubBonjour,
Merci beaucoup pour cette réponse rapide, je semble comprendre la logique mais quand j'utilise ce code apparait juste un pop-up "UserForm2" et rien ne se passe.
J'ai essayé de simplifier le code en supprimant des variables (en gros j'ai écrit en tout chiffres les valeurs aberrantes et la dernière ligne du tableur) mais rien y fait toujours ce satané pop-up sans modification dans mon tableur.
Pour ce qui est des hypothèses émises lorsque "n-170" ou "n+170" est en dehors du tableau, il n'est pas nécessaire de les détailler puisque il n'y a pas de cas d'anomalie vers ces dates là.
Avez-vous une idée de la raison de ce pop-up ?
Merci d'avance
Ugo
Re-bonjour,
Ne tenez pas compte du message d'avant, j'ai réussi à régler le problème, j'avais tout simplement oublié de sélectionner le document.
Mais, un autre problème vient d'apparaître, j'ai maintenant un autre pop-up : "l'indice n'appartient pas à la sélection"
Je continue mes recherches mais si vous savez déjà comment le régler je vous écoute !
Merci d'avance
Ugo
bonjour,
"l'indice n'appartient pas à la sélection"
quelle est l'instruction qui provoque cette erreur ?
si c'est With Sheets("feuil3")
c'est que la feuillle feuil3 n'existe pas dans le classeur. Sinon, c'est sur une instruction .cells(), c'est que le numéro de ligne ou de colonne n'est pas valide (<1)
Re-re-bonjour !
On a réussi, ENFIN, j'ai réussi à débugger le macro !
Tout fonctionne parfaitement
voici l'algo final, expliqué pour les prochains stagiaires
Sub CorrectionRomain() 'le sub est la procédure, remplacez "CorrectionRomain" par le nom du site
With Sheets("correction") 'Nom du feuillet à corriger, par défaut "correction" dans votre fichier excel
dl = .Cells(Rows.Count, 8).End(xlUp).Row 'formule permettant d'identifier la dernière cellule non vide du tableau ligne dernière mesure
For i = 2 To dl 'i est votre numéro de ligne
hn = .Cells(i, 8) '8 est le numéro de votre colonne par défaut H dans votre fichier excel
hnp170 = .Cells(Application.Min(dl, i + 170), 8)
hnm170 = .Cells(Application.Max(1, i - 170), 8)
If hn > 300 Then 'remplacer "300" par le seuil de valeur aberrante de votre site
.Cells(i, 8).Interior.Color = vbYellow 'colorie les cellules en jaune pour une vérification visuelle
If hnp170 < 300 Then
mh = Int((hnp170 + hnm170) / 2)
If mh = 0 Then
nouveauHn = 1
Else
nouveauHn = mh
End If
Else 'hnp170>vab
nouveauHn = 1
End If
.Cells(i, 8) = nouveauHn
End If
Next i
End With
End SubMerci beaucoup, pour moi et pour les prochains stagiaires qui auront à faire la mise à jour des données !
Puis-je avoir votre nom pour les remerciements de mon mémoire ?
Remercie les contributeurs du site Excel pratique !