Somme glissante sur une colonne et condition

C'est la pub...

Tu veux diviser le résultat final de chaque ville par la valeur "Période" : ok.

Je regarde à la fin du film... Madame est endormie... Chuuuuuuut...

Comme ceci ?

  • en déclarant une variable iTime%
  • initialisation de la variable
iTime = CInt(Cells(2, iSheet))

- division dans tPluv, formatée à 2 décimales

If CInt(tPluv(x, 1)) >= 1 Then tPluv(x, 1) = Format(CDbl(tPluv(x, 1)) / iTime, "0.00")

Pour plus de décimales, adapter ceci...

If CInt(tPluv(x, 1)) >= 1 Then tPluv(x, 1) = Format(CDbl(tPluv(x, 1)) / iTime, "0.00")

Private Sub cmdGO_Click()
'
Dim tTab, tPluv, iStep%, iTime%, lgRow&, lgIdx&, dblTot#, dblTemp#, sCol$
'
Me.cmdGO.BackColor = &HC0&
Dummy = DoEvents()
Application.ScreenUpdating = False                                              'évitons les scintillements d'écran
'
iCol = Range("A" & Rows.Count).End(xlUp).Row - 4                                        'nombre de villes calculé sur le nombre de lignes en 'INDICATEUR' [A:A]
Range("B5").Resize(iCol, Cells(1, Columns.Count).End(xlToLeft).Column - 1).Value = 0    'mise à 0 du tableau-résultat en 'INDICATEUR'
'
For iSheet = 2 To Cells(1, Columns.Count).End(xlToLeft).Column                  'on parcourt les feuilles telles qu'indiquées en ligne 1
    For k = 1 To Sheets.Count                                                   'boucle de vérification de l'existence de la feuille ciblée par iSheet
        If Sheets(k).Name = CStr(Cells(1, iSheet)) Then                         'le calcul se fait si la feuille existe
            iStep = CInt(Cells(4, iSheet))                                      'valeur du Step pour cette feuille
            dblTot = CDbl(Cells(3, iSheet))                                     'valeur du Seuil pour cette feuille
            iTime = CInt(Cells(2, iSheet))                                    'valeur de la Période
            tPluv = Cells(5, iSheet).Resize(iCol, 1).Value                      'préparation du tableau de résultats pour cette feuille
            With Worksheets(CStr(Cells(1, iSheet)))                             'prises d'info dans la feuille à traiter
                lgRow = .Range("A" & Rows.Count).End(xlUp).Row - 4              'nombre de lignes de datas
                tTab = .Range("B5").Resize(lgRow, iCol).Value                   'mise en tableau des datas
            End With
            For x = 1 To UBound(tTab, 2)
                lgIdx = 0                                                       'valeur-repère pour calcul CELLULES
                For y = 1 To UBound(tTab, 1) - (iStep - 1)
                    dblTemp = 0
                    For Z = 0 To iStep - 1
                        dblTemp = dblTemp + CDbl(tTab(y + Z, x))
                    Next
                    If dblTemp >= dblTot Then
                        'tPluv(x, 1) = CInt(tPluv(x, 1)) + 1                                                'instruction BLOCS non-utilisée... pfff...
                        tPluv(x, 1) = CInt(tPluv(x, 1)) + IIf(lgIdx < y, iStep, (y + iStep - 1) - lgIdx)    'calcul CELLULES
                        lgIdx = y + iStep - 1
                    End If
                Next
                If CInt(tPluv(x, 1)) >= 1 Then tPluv(x, 1) = Format(CDbl(tPluv(x, 1)) / iTime, "0.00")      'division du résultat par Période avec 2 décimales
            Next
            Cells(5, iSheet).Resize(iCol, 1).Value = tPluv                      'affichage des résultats de la feuille traitée
            Exit For
        End If
    Next
Next
Range("B5").Resize(iCol, iSheet - 2).Borders.LineStyle = xlContinuous   'bordures
sCol = Split(Columns(iCol).Address(ColumnAbsolute:=False), ":")(1)
Range("B:" & sCol).HorizontalAlignment = xlHAlignCenter
'
Application.ScreenUpdating = True
Me.cmdGO.BackColor = &HC000&
'
End Sub

Je peux faire dodo, maintenant ?

A+

Je peux faire dodo, maintenant ?

Oui tout à fait!! Je suis entrain de le tester sur mon fichier de base et tout semble fonctionner comme sur des roulettes

Franchement super!!

Je te confirme si tout fonctionne...

CONFIRMATION DEFINITIVE: TOUT FONCTIONNE!!!

Après cette ligne :

Cells(5, iSheet).Resize(iCol, 1).Value = tPluv

j'ai rajouté ces deux lignes:

Cells(5, iSheet).Resize(iCol, 1).NumberFormat = "0.00"
Cells(5, iSheet).Resize(iCol, 1).FormulaLocal = Cells(5, iSheet).Resize(iCol, 1).Value

Parce que les résultats n'étaient pas au format nombre et ça me gênait pour faire des calculs à partir du tableau de résultat.

Pour le nombre de décimale j'ai testé avec "0.000" et "0.0000" mais ça me donne des résultats bizarres... J'ai testé par curiosité parce qu'il y a déjà 2 chiffres après la virgules et même 1 chiffre me suffit largement!!

ET BEN L'AMI MERCI ENCORE!!

J'espère qu'un jour je pourrai t'être utile!!...

Salut Maroon,

la nuit porte conseil, dit-on...

Ça ne m'a pas réveillé mais je me suis rendu compte avoir (encore) compliqué quelque chose de simple.

- Je découpais tPluv en autant de feuilles à calculer !!

C'est rectifié et le temps de calcul est sensiblement meilleur, même sur 50 lignes.

tPluv = Range("A5").Resize(iCol, Cells(1, Columns.Count).End(xlToLeft).Column).Value        'préparation du tableau de résultats

- J'avais déjà utilisé FormulaLocal pour afficher un tableau contenant... des formules. Mais je ne me doutais pas que, dans ce cas, cela éliminerait le petit triangle vert "Erreur" !! Bon à savoir !

Sois content : tu viens de me rendre service !

Range("B5").Resize(iCol, iSheet - 2).NumberFormat = "0.00"                  'format nombre
Range("A5").Resize(iCol, iSheet - 1).FormulaLocal = tPluv                   'affichage des résultats
  • Tu avais remarqué, j'imagine, que j'avais bloqué les volets sur [B5].
  • Enfin, j'ai créé une MFC qui met la couleur de fonte sur BLANC pour les résultats = 0 : meilleure visibilité !
Les valeurs sont toujours bien présentes pour tes calculs mais tu effaces cette MFC si ça te gêne, bien sûr.

Bon, sans rire maintenant : le calcul des blocs ! Quid ?

A+

1maroon.xlsm (213.96 Ko)

Salut Curulis57!

la nuit porte conseil, dit-on...

Ça ne m'a pas réveillé mais je me suis rendu compte avoir (encore) compliqué quelque chose de simple.

- Je découpais tPluv en autant de feuilles à calculer !!

C'est rectifié et le temps de calcul est sensiblement meilleur, même sur 50 lignes.

Oui effectivement et je crois comprendre la logique enfin la logique globale parce que j'avoue que cette partie

CInt(tPluv(x, iSheet)) + IIf(lgIdx < y, iStep, (y + iStep - 1) - lgIdx) 

reste encore un mystère...

Sois content : tu viens de me rendre service !

Lol Ok

- Tu avais remarqué, j'imagine, que j'avais bloqué les volets sur [B5].

Oui tout à fait mais j'avoue qu'un quart de seconde après je me suis dit que c'est moi qui l'avais fait sans m'en souvenir mais faut dire que je ne vois pas qu'elle ligne le fait... avec l'enregistreur de macro il donne la ligne
ActiveWindow.FreezePanes

que je ne vois pas dans le code

- Enfin, j'ai créé une MFC qui met la couleur de fonte sur BLANC pour les résultats = 0 : meilleure visibilité !

Ok cool! Mais c'est bizarre ça le fait bien sur le fichier exemple que tu m'as renvoyé mais pas sur mon fichier original, c'est peut-être une histoire de format qu'il y a sur mes feuilles, je vais voir...

Bon, sans rire maintenant : le calcul des blocs ! Quid ?

Ben en fait c'est bon parce que c'est un résultat dont j'avais besoin que pour deux situations précises et j'ai pu le faire avec le code d'Yvouille, par contre le temps de traitement était de 15-20min! (peut-être parce que je l'ai simplement copié/collé pour chaque feuille à traiter... Si j'avais à l'utiliser souvent je crois que je t'aurais encore embêté

Une question de détail, est-ce que le bouton de lancement du code peut être activé d'une autre feuille? J'ai cru comprendre que non mais je demande quand même...

J'ai remarqué que les résultats sont 1 ou 2 unités au-dessus (2 unité au-dessus pour la "ville 1" et 1 unité au-dessus pour les autres villes) sauf quand on met le seuil à 0... j'ai l'impression que c'est dans la prise en compte de iStep non?

FAUX résultats exactes c'est moi qui vérifiais n'importe comment

Une question de détail, est-ce que le bouton de lancement du code peut être activé d'une autre feuille? J'ai cru comprendre que non mais je demande quand même...

En fait je ne comprends pas comment le code est affecté au bouton. Je sais comment ça se passe avec des macros mais là avec private_sub je comprends plus... En plus quand je clique sur le bouton en "mode création" il y a marqué "=INCORPORER("Forms.CommandButton.1";"")" alors que le nom du code c'est "cmdGO_Click()"

Salut Maroon,

ça gamberge, ça gamberge, je vois !

CInt(tPluv(x, iSheet)) + IIf(lgIdx < y, iStep, (y + iStep - 1) - lgIdx)

lgIdx est un repère correspondant, lorsque l'addition des valeurs "glissées" atteint le seuil, à la dernière position de ce bloc dans le tableau tTab.

Donc, si, par exemple, avec un iStep de 3 :

  • admettons que la boucle y soit à 8 ;
  • le bloc atteint le seuil (défini par iStep) et se termine donc à la position 10 = Bloc 8, 9, 10 ;
  • lgIdx = 10 ;
  • NEXT y arrive sur 9 (tu suis ?) et l'addition du bloc 9, 10, 11 atteint aussi le seuil ;
  • pour ne pas compter deux fois les cellules 9 et 10, lgIdx valant 10, je dois compter...
(y + iStep - 1) - lgIdx = (9 + (3 -1) - 10) = 1 qui correspond à la cellule 11

CQFD et Maroon est content ! Il a mal à la tête mais il est content : le résultat est correct !

Volets et MFC...

Dis donc, travaille un peu aussi!

Il y a des trucs que l'on peut faire sans passer par VBA surtout si ce sont des one shot.

Pour la MFC, tu dois la créer sur ton fichier : elle ne s'importera pas par l'action du saint-Esprit !

  • sélectionne d'abord les lignes 5 à 50 (pour 50 villes potentielles) ou 500 si tu préfères : ad libitum...
  • Menu 'Accueil' - 'Mise en forme conditionnelle' - Nouvelle règle - Option "uniquement aux cellules qui contiennent" - 'Valeur de la cellule' - 'égale à' - 0 -> Format - Fonte blanche... OK

Pour la commande de la macro, on peut supprimer le bouton et faire en sorte qu'un double-clic, par exemple, la démarre, quelque soit la feuille active.

A+

CQFD et Maroon est content ! Il a mal à la tête mais il est content : le résultat est correct !

Oui c'est exactement ça! Ok super merci pour cette explication! je comprends un peu mieux mais je vais revenir dessus dans deux ou trois jours pour tester tout ça moi même... quand j'aurai fini avec mon urgence. Ca faisait un moment que j'avais pas travaillé avec VBA et donc j'ai perdu les petites connaissance que j'avais mais je compte m'y remettre sérieusement...

Volets et MFC...

Dis donc, travaille un peu aussi!

Oui lol... d'habitude je cherche un peu plus avant de poser des questions bêtes... C'est sûre que je peux faire ça sans macro et seul mais je pensais qu'il y avait une ligne dans le code qui le faisait (javais pas compris) et du coup j'arrivais pas à voir de quelle ligne tu parlais...

Pour la commande de la macro, on peut supprimer le bouton et faire en sorte qu'un double-clic, par exemple, la démarre, quelque soit la feuille active.

Là je vois pas trop comment... tu parles du "Worksheet_Change(ByVal Target As Range)"que tu avais utilisé au début? Par contre c'est bon pour l'affectation des boutons avec les private sub() les choses sont devenues claires...

Là je vois pas trop comment...

!

"Aie coooonfiaaaance..." (Kââ)

Rechercher des sujets similaires à "somme glissante colonne condition"