Maximum spécial

boris.le-goff

XLDnaute Nouveau
Bonjour tout le monde,

J'aimerais vous présenter mon problème, auquel je ne trouve pas de réponses après multiples grillages de neurones :

J'ai un compteur, qui monte de zéro à un chiffre, puis redescend (avant de redescendre à zéro il peut encore remonter s'il en a envi) à zéro.
J'aimerais donner un ordre à excel :
Quand le compteur est >0, je voudrais la valeur maximale, jusqu'à ce qu'il revienne à 0.
Dit autrement, à chaque fois que mon système s'enclenche et qu'il quitte le zéro, j'aimerais avoir la valeur maximale pendant cette intervalle où il a quitté le zéro. Et cela donc à chaque fois qu'il le quitte.

Dit encore autrement, sur un ensemble de données, je ne veux pas savoir LE max d'un ensemble de données, mais tout les max de chaque petit ensemble de données qui sera plus grand que zéro.

Par exemple dans l'exemple*que j'ai mis tout en bas, j'aimerais obtenir le résultat uniquement
7
3
5

Voici les données*

0
0
0
0
1
2
3
4
5
6
7
6
5
4
3
2
3
4
5
6
5
4
3
2
1
2
3
2
1
0
0
0
0
0
1
2
3
2
1
0
0
0
0
1
2
3
4
5
4
3
4
3
2
1
0
0

Si mon explication est nulle ou mérite précision, ou si elle est claire et impossible à réaliser, n'hésitez pas à me le dire !

Boris
 

Épaf

XLDnaute Occasionnel
Re : Maximum spécial

Avec une boucle do loop while, on peut éviter la double boucle For Next ainsi que la suppression des lignes contenant 0 ;)
Ce qui n'enlève pas le mérite de mutzik (rapidité, exactitude, maîtrise, etc...) :D
 

boris.le-goff

XLDnaute Nouveau
Re : Maximum spécial

C'est tout bonnement impressionant ! Aussi rapidemment, et surtout je pensais pas être clair du tout.
Oui ça marche ! Merci Mutzik pour ton aide de qualité ! :)
Les macros ne me dérangent absolument pas.

Après le problème est que le problème que je vous ai exposé précedemment avait quelques dizaines de nombres.
Là je traite avec 32000 nombres.
La macro met 1s pour 20 nombres.
Donc 27 minutes pour les 32000 nombres.

Après je vois une solution :
98% des nombres sont des 0. Et la macro réfléchit à la même vitesse quand il y a des 0 pendant 10 000 cases.
Alors je pourrais supprimer tout les 0, et après avoir la même macro, mais au lieu de "je veux les maximum quand ça démarre de 0", dire "je veux les maximums quand ça passe 1"

Quand pensez-vous ?
 

Jocelyn

XLDnaute Barbatruc
Re : Maximum spécial

Bonjour le Forum,
Bonjour boris.le-goff, Dugenou, Épaf, mutzik,

Bien que je pense que la solution de mutzik soit et de loin la meilleur, juste pour le fun et pour monter la puissance des formules matricielle un exemple par formule sans colonnes supplémentaires.

Jocelyn
 

Pièces jointes

  • Max spécial.xls
    17 KB · Affichages: 54
Dernière édition:

Épaf

XLDnaute Occasionnel
Re : Maximum spécial

1 secondes pour 50000 lignes, c'est pas mieux ?

Code:
Sub Test()
Dim derlig As Long, NoLig As Long, NoLig2 As Long, valeur As Long, valmax As Long
    derlig = Split(Worksheets("feuil1").UsedRange.Address, "$")(4)
    Do
        NoLig = NoLig + 1
        valeur = Range("A" & NoLig)
        If valmax < valeur Then valmax = valeur
        If valeur = 0 And valmax <> 0 Then
            NoLig2 = NoLig2 + 1
            Range("B" & NoLig) = valmax
            valmax = 0
        End If
    Loop While NoLig <= derlig
End Sub
A adapter
Bonne journée

Edit
En cas de besoin, un tri final sur la colonne B rassemble les données sur les premières lignes
 
Dernière édition:

boris.le-goff

XLDnaute Nouveau
Re : Maximum spécial

Jocelyn, ta formule est très rapide, effectivement. En 10 secondes j'obtiens mes résultats ! Bravo !

Epaf, j'ai essayé de mettre le code à la place du code contenu dans la macro du fichier excel de Mutzig, et ça n'a rien donné. Je suppose que c'est normal, c'est juste que moi et les macros ça fait 2 !


Est-ce que ce site marche aux dons ?
Si oui, comment faire ?
Si non, Merci encore à tous !

Boris
 

Épaf

XLDnaute Occasionnel
Re : Maximum spécial

J'ai corrigé un petite erreur (utilisation de NoLIg à la place de NoLig2 pour placer le ValMax :eek: ) ici -> ***
Code:
Sub Test()
Option Explicit

Dim derlig As Long, NoLig As Long, NoLig2 As Long, valeur As Long, valmax As Long
    derlig = Split(Worksheets("feuil1").UsedRange.Address, "$")(4)
    NoLig2 = 10 'on fixe le N° de ligne du premier résultat à 10
    Do
        NoLig = NoLig + 1
        valeur = Range("A" & NoLig) 'lecture de la donnée de la ligne, colonne A
        If valmax < valeur Then valmax = valeur
        If valeur = 0 And valmax <> 0 Then
            Range("B" & NoLig2) = valmax '***
            valmax = 0
            NoLig2 = NoLig2 + 1
        End If
        valeur = 0
    Loop While NoLig <= derlig
End Sub
 

Discussions similaires

Réponses
5
Affichages
154
Réponses
7
Affichages
361

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87