Occurrence après condition

Bonsoir à tous,

J'aurai besoin de votre aide pour un petit souci. Je vous explique ma problèmatique.

Dans le fichier joint, la colonne A contient des valeurs, ici on dit que c'est des températures (+ de 1000 lignes).

La colonne B contient une formule qui quand la valeur dans A est supérieure ou égale à 30 écrit "SUP".

La colonne C calcule le nombre de cellule vide entre deux "SUP" (je l'ai reprise d'un ancien fichier).

Si on dit qu'entre deux valeurs SUP on appelle cela une série, le but est de savoir, par exemple, après une série de 0, selon mes données, il y a eu 85 séries de 0, 106 séries de 1 etc... etc... jusqu'à 20. L'objectif est donc de compléter les valeurs "x fois " dans le tableau dans la feuille 1.

Merci beaucoup pour votre aide

Bonne soirée

Quik

Pièce jointe

Bonsoir,

personnellement je n'ai pas compris votre paragraphe de 3 lignes...

@ bientôt

LouReeD

Bonjour,

Je vais essayer de reformuler avec un exemple concret. Si on prend en compte que les 28 premières lignes et on regarde que la colonne C.

Pour chaque valeurs contenue dans la colonne C, c'est à dire pour les 28 premières lignes: 0, le 1, le 2 et le 3 (appelons ces valeurs X), on cherche à savoir quelles sont les valeurs qui viennent directement après chaque X.

Pour les 28 premières lignes si on regarde quelles valeurs viennent après le 0, il y a une fois le 0 (en ligne 2), une fois le 2 (en ligne 25) et deux fois le 3 (en ligne 3 et 15).

Pour le 1, cela donne : une fois le 2 (en ligne 21) et c'est tout car il n'y a pas d'autre 1 dans les 28 premières lignes de la colonne C
Pour le 2, cela donne : trois fois le 0 ( en ligne 14, 24 et 28)
Pour le 3, cela donne : une fois le 1 (en ligne 19), une fois le 2 (en ligne 11) et une fois le 3 (en ligne 7)

Je voudrais avoir cela de manière automatique pour toutes les valeurs X. C'est à dire toute la colonne C mais sans aucun doublon. Dans mon fichier joint j'ai mis jusqu'à 20 pour donner une limite mais idéalement cette valeur devrait dépendre de la colonne C.

Est-ce plus clair ainsi ?

Merci d'avance

Bonne journée

Bonsoir,

c'est très clair ! Merci ! YAPLUKA comme dirait galopin01

@ bientôt

LouReeD

Bonsoir,

voici le code (ou plutôt un des codes car je n'ai pas "la vérité" ! ) :

Sub LouReeD()
    Dim ValMax, CelDeb, CelDebAdr, TabSortie(), DerLigne, Fin As Boolean, I, J
    DerLigne = ActiveSheet.Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
    ValMax = Application.WorksheetFunction.Max(ActiveSheet.Range("C:C"))
    ReDim TabSortie(ValMax + 1, ValMax + 1)
    For I = 0 To ValMax
        Set CelDeb = Range("C:C").Find(I, LookIn:=xlValues)
        If Not CelDeb Is Nothing Then
            CelDebAdr = CelDeb.Address
            Do
                J = CelDeb.Row + 1
                Do
                    If Cells(J, 3).Value2 <> "" Then
                        TabSortie(I, Cells(J, 3).Value) = TabSortie(I, Cells(J, 3).Value) + 1
                        Exit Do
                    End If
                    J = J + 1
                    If J >= DerLigne Then Fin = True: Exit Do
                Loop
                If Fin Then Exit Do
                Set CelDeb = ActiveSheet.Range("C:C").FindNext(CelDeb)
            Loop While CelDeb.Address <> CelDebAdr
        End If
    Next I
    Range("G4").Resize(UBound(TabSortie, 2), UBound(TabSortie, 1)) = Application.Transpose(TabSortie)
End Sub

Le principe :

On cherche pour commencer la dernière ligne utilisée de la colonne A afin de stopper le scan lorsque l'on arrive à cette ligne.
Ensuite on cherche la valeur d'occurrence maximale, ATTENTION ! ici il peut y avoir une erreur sur votre fichier car l'avant dernière formule donne une valeur pour "rejoindre" la dernière ligne de votre zone de recherche, il faudrait voir à modifier vos formules afin que celles-ci s'adaptent à la taille de la colonne.
on redimensionne le tableau de sortie avec autant de colonnes que de ligne et cela en correspondance de ValMax+1, en effet si valmax = 9, on a bien 10 données ! Donc il faut dimensionner à 10 index le tableau et un Dim Tableau(9) va seulement de 0 à 8 !
On commence une boucle de 0 à valmax afin de rechercher toutes ces occurrences.
On utilise Find pour chercher la première occurrence "i"
On met en mémoire l'adresse de la cellule trouvée si évidemment il y en a une.
J prend la valeur de la ligne de cette cellule, on boucle sur les lignes du dessous jusqu'à trouver la valeur qui suit l'occurrence en cours. On remplie le tableau de sortie en incrémentant le nombre de fois que l'on a trouver cette valeur. On utilise ensuite FindNext pour trouver la cellule suivante qui contient "i" et on sort de la boucle au moment où l'adresse de cette nouvelle cellule est égale à l'adresse de la première.
La boucle des occurrence augmente de 1, i passe à i+1et c'est reparti pour un tour !
A la fin on intègre le tableau de sortie à partir de la cellule G4.

@ bientôt

LouReeD

Bonjour et bonne année !!

Merci pour votre macro et vos explications.

Malheureusement, ils semblent y avoir un souci mais je n'arrive pas à trouver où :/

Je vous met en pièce jointe le fichier que j'obtient avec en plus les colonnes D et E qui "vérifie" grossièrement le tableau créé par la macro.

Merci !

En effet je suis étourdi !

La variable FIN doit être initialisée à FAUX à l'issue de la première recherche de la valeur de I=0
Donc il faut ajouter avant le "Next I" ceci : Fin = False

Pour que les valeurs soient "vraiment" exactes il faut aussi remplacer ceci :
Set CelDeb = Range("C:C").Find(I, LookIn:=xlValues)

Par :
Set CelDeb = Range("C1:C" & DerLigne).Find(I, LookIn:=xlValues)

Et il faut insérer une ligne au-dessus du tableau de données, sinon il manque une valeur de "0" où l'on doit trouver 74 et non pas 73 ! j'ai constaté que Find recherche à partir de la ligne 2 comme si nativement il travaillait dans iun tableau avec entête, tant est si bien que le "0" de la première ligne il ne le trouve pas !

@ bientôt

LouReeD

Bonsoir,

sur le fichier exemple, la procédure modifiée met un peu plus de deux secondes pour s'exécuter !
Quel horreur !
Ci dessous un code qui met en mémoire VBA la colonne sur laquelle on fait les recherches, du coup on n'utilise plus la fonction FIND qui fait des accès feuille à chaque fois, ce qui permet de faire tourner la procédure 100 fois plus vite (0.02 secondes, voir moins quelque fois...)

Le code de la nouvelle procédure :

Sub LouReeDMemVBA()
    Dim DerLigne, ColData(), TabSortie(), LigneTest As Long, LigneVal As Long
    DerLigne = ActiveSheet.Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
    ColData = Range("C1:C" & DerLigne).Value
    ValMax = Application.WorksheetFunction.Max(ActiveSheet.Range("C:C"))
    ReDim TabSortie(ValMax + 1, ValMax + 1)
    LigneTest = 1
    LigneVal = 1
    For I = 0 To ValMax
        Do
            If ColData(LigneVal, 1) = I Then
                LigneTest = LigneVal + 1
                Do
                    If ColData(LigneTest, 1) <> "" Then
                        TabSortie(I, ColData(LigneTest, 1)) = TabSortie(I, ColData(LigneTest, 1)) + 1
                        LigneVal = LigneTest - 1
                        Exit Do
                    End If
                    LigneTest = LigneTest + 1
                Loop While LigneTest < UBound(ColData, 1)
            End If
            LigneVal = LigneVal + 1
        Loop While LigneVal < UBound(ColData, 1)
        LigneTest = 1
        LigneVal = 1
    Next I
    Range("Debresultat").Resize(UBound(TabSortie, 2), UBound(TabSortie, 1)) = Application.Transpose(TabSortie)
End Sub

@ bientôt

LouReeD

Merci beaucoup c'est exactement ce que je souhaitai !

Je clos le sujet. Encore merci !

Bonne soirée

Quik

Bonsoir,

à une lettre près, la macro va avec votre avatar ! Quick !

Merci pour vos remerciements !

@ bientôt

LouReeD

Rechercher des sujets similaires à "occurrence condition"