Somme glissante sur une colonne et condition

Re...

Et aussi est-ce que les deux valeur seuils peuvent être prises en compte dans la colonne concernée, c-à-d B3:B4, C3:C4, D3:D4 etc...?

Comprends pas!

Il faut recopier les valeurs-seuils à chaque colonne ET/OU tu auras des valeurs-seuils différentes pour chaque ville sur lesquelles le calcul doit se baser ?

A+

Salut Curulis57!

Merci pour ta réponse.

Ne passe pas ton temps à reproduire le code dans toutes les feuilles : inutile!!

J'intégrerai l'ensemble des feuilles dans une seule et même boucle commandée par le bouton.

Ok super!

Je n'ai pas encore regardé le fichier : bien illustré comme demandé?

Oui je pense que c'est bon. Le fichier est quasiment le même, j'ai simplement limité le nombre de lignes de données à 50 par rapport au poids.

Où as-tu besoin des valeurs-blocs?

Non pour les blocs c'est bon j'ai fait un fichier avec le code d'Yvouille

Style télégramme - Stop

Il faut recopier les valeurs-seuils à chaque colonne ET/OU tu auras des valeurs-seuils différentes pour chaque ville sur lesquelles le calcul doit se baser ?

Non les valeurs seuils sont les mêmes. Mais sur mon fichier (et donc celui que je t'ai envoyé aussi) les valeurs seuils sont reprises dans chaque colonne exactement comme la première colonne de résultats que tu m'as envoyée (j'ai fait comme ça au cas ou éventuellement il faudrait une valeur différente pour une ville). Je précise si t'as pas encore vu le fichier que tous les résultats sont dans la même feuille donc il y a une colonne de résultat par ville.

Donc c'est mieux de supprimer ces deux lignes de valeurs seuil et de faire uniquement deux cellules de valeurs seuils valable pour toutes les villes en faite? Ça ne change rien pour moi...

es résultats sont dans la même feuille donc il y a une colonne de résultat par ville.

Non je voulais dire une COLONNE de résultats par feuille de données (les feuilles HIST- et FUT-) et pas par ville!! Il y a une LIGNE de résultats par ville!

J'avais "traduit"...

Salut Maroon,

voilà, voilà...

La macro s'attend à des comportements intelligents de la part des utilisateurs !!

  • même nombre de villes dans chaque feuille que stipulé dans 'INDICATEUR' ;
  • ces villes sont classées dans le même ordre que dans 'INDICATEUR' ;
  • si création d'une nouvelle feuille, prière de faire attention à la similitude d'eaurtaugrâfe pour être reconnue.

! Si tu penses que cela peut-être utile !

Fonctions supplémentaires possibles si tu modifies une ou plusieurs valeurs-seuil :

  • un double-clic sur 1 colonne recalculerait cette colonne uniquement ;
  • une multi-sélection horizontale unique recalculerait les seules colonnes ciblées ;
  • une multi-sélection de plusieurs colonnes non-contigües (avec CTRL) recalculerait les seules colonnes ciblées.

À toi de voir...

Private Sub cmdGO_Click()
'
Dim tTab, tPluv, iStep%, lgRow&, lgIdx&, dblTot#, dblTemp#
'
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).Clear        'nettoyage '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
            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                  'nombre de lignes de datas
                tTab = .Range("B2").Resize(lgRow - 1, 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
            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
'
Application.ScreenUpdating = True
Me.cmdGO.BackColor = &HC000&
'
End Sub

Suite au prochain épisode!

A+

13maroon.xlsm (173.54 Ko)

Salut Curulis57!!

La macro s'attend à des comportements intelligents de la part des utilisateurs !!

  • même nombre de villes dans chaque feuille que stipulé dans 'INDICATEUR' ;
  • ces villes sont classées dans le même ordre que dans 'INDICATEUR' ;
  • si création d'une nouvelle feuille, prière de faire attention à la similitude d'eaurtaugrâfe pour être reconnue.

Bien noté, pas de problème!

Fonctions supplémentaires possibles si tu modifies une ou plusieurs valeurs-seuil :

  • un double-clic sur 1 colonne recalculerait cette colonne uniquement ;
  • une multi-sélection horizontale unique recalculerait les seules colonnes ciblées ;
  • une multi-sélection de plusieurs colonnes non-contigües (avec CTRL) recalculerait les seules colonnes ciblées.

Dans la quasi-totalité des situations je vais appliquer les mêmes valeurs à toutes les feuilles, donc si je dois éventuellement mettre des valeurs différentes ça me dérangera pas de tout relancer (je dis ça mais pour l'instant je n'ai pas encore testé sur le fichier qui contient toutes mes lignes )

Je me suis aperçu que la macro prend en compte toutes les lignes des feuilles de données plutôt qu'à partir de la ligne 5 mais ça je suis entrain d'essayer de décrypter le code pour savoir quoi changer.

Par contre j'avais prévu d'ajouter une division par 365.2425 pour que le résultat corresponde aux valeurs par /an mais j'essaye de placer cette constante un peu partout dans le code et pour l'instant j'ai pas trouvé le bon endroit (j'espère que c'est pas le détail qui change tout!! ) mais je devrais finir par trouver.

Bon en dehors de ça je te dis un grand MERCI! parce que ton travail me tire d'une situation très compliquée!!!

Une fois que j'aurai finis ce que je fais, je prendrai le temps pour essayer de mieux comprendre ton code et toutes les fonctions (merci pour les commentaires) parce que je pense surement rencontrer encore ce genre de situations!

Or donc,

Correction

prend en compte toutes les lignes des feuilles de données plutôt qu'à partir de la ligne 5

                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

ajouter une division par 365.2425

Tu veux diviser les résultats récoltés dans tPluv pour chaque feuille par 365.2425 ? Confirme, stp...

La première valeur-Bloc, au fond, où doit-elle aller? Tu m'as parlé d'un autre fichier : si tu m'en dis plus, ne pourrait-on pas faire d'une pierre deux coups?

A+

C'est bon pour la ligne de début de lecture des feuilles!!

Il suffisait de remplacer 1 par 2 dans cette ligne:

For iSheet = 2 To Cells(1, Columns.Count).End(xlToLeft).Column

Je cherchais au mauvaise endroit!

C'était déjà sur 2 !!

For iSheet = 2 To Cells(1, Columns.Count).End(xlToLeft).Column

Correction: 2 par 5

C'était déjà sur 2 !!

Oui je voulais dire 2 par 5!!

On parle des mêmes lignes, j'espère !!

            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

Oui en fait c'est moi qui me suis trompé, je viens de m'en rendre compte!

J'ai changé B2 en B5 et ça marche! C'est bizzare j'étais persuadé d'avoir essayé ça dès le début et que ça n'avait pas fonctionné

En tout cas c'est bon maintenant merci!!

Tu as bien modifié ceci ?

lgRow = .Range("A" & Rows.Count).End(xlUp).Row - 4

Oui c'est bon désolé je me suis emmêles les pinceaux

C'est bon j'ai fait la rectification:

lgRow = .Range("A" & Rows.Count).End(xlUp).Row - 4                
tTab = .Range("B2").Resize(lgRow, iCol).Value 

Mais c'est bizarre ça avait l'air de fonctionner aussi avec :

lgRow = .Range("A" & Rows.Count).End(xlUp).Row                 
tTab = .Range("B2").Resize(lgRow - 4 , iCol).Value 

Par contre j'ai essayé la division dans le code et ça me donne des choses bizarres...

En fait il faut que je divise par la ligne 2 de chaque colonne et pas par 365.

Au début je pensais que c'était dans cette ligne :

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

Mais ça ne donne rien et puis j'ai essayé un peu partout

Je regarde demain... ou très tard ce soir !

Un peu de détente avec madame devant un bon film !

A+

Bien reçu!!

Merci encore!

Si je trouve j'envoie un message...

J'ai l'impression d'avoir testé la division par 34 après chaque lettre du code mais sans obtenir le bon résultat

C'est dans un premier temps pour voir ou il faut "agir" parce qu'en fait il faudrait que les valeurs soient divisées par la ligne 2 "PERIODE" de chaque colonne (comme elles ne sont pas identiques...).

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?

Rechercher des sujets similaires à "somme glissante colonne condition"