Boucles imbriquées

Résolu
Bonjour,

Dans le cadre d'un projet pour déterminer le confort thermique des occupants, je dois calculer la température maximum et minimum de chaque jours.

Dans ma feuille excel, j'ai les valeurs des températures à chaque heure de l'année (8761 lignes) et j'aimerais pouvoir calculer la valeur maximal et minimale de ces chaque jours.

J'avais pensé au code suivant :
            temp_max_1 = WorksheetFunction.Max(Worksheets("Tableau Valeur").Range("D2:D25"))
            temp_min_1 = WorksheetFunction.Min(Worksheets("Tableau Valeur").Range("D2:D25"))


Mais il va falloir que je le fasse 365 fois. Je suis sure qu'avec des boucles imbriquées je peux faire le calcul plus rapidement.

    For i = 0 To 8760
        tab_temp_ext(i) = Worksheets("Tableau Valeur").Range("D" & i + 2)
        tab_jour_année(i) = Worksheets("Tableau Valeur").Range("Z" & i + 2)

Et ensuite je ne sais pas intégrer les autres boucles pour calculer les valeurs maximales et minimales tout au long de l'année

En vous remerciant d'avance,

Edit: Précision du langage dans la coloration syntaxique.

6 réponses

  1. Contributeur
    Bonjour,
    difficile sans voir l'organisation de ton classeur
    pour essayer d'^tre efficace
    Mettre le classeur (environ 1000 à 2000 lignes) sans données confidentielles en pièce jointe sur https://www.cjoint.com/
    et coller le lien proposé dans le message de réponse
    Dans l'attente

    0
    1. Voici le lien http://www.cjoint.com/data3/3DxkKB92WkC.htm
      0
      1. Contributeur
        Bien reçu, merci,
        je regarde dès que...
        0
        1. Merci beaucoup
          0
      2. Contributeur
        Et voilà
        proposition:
        https://www.cjoint.com/?3DxnSE1S3Rf

        tu dis
        0
        1. Tout d'abord, merci

          Ensuite, j'ai plusieurs questions :

          - Dans la partie "initialisations", la ligne
          Derlig = Columns("A").Find("*", , , , , xlPrevious).Row
          , je ne comprends pas à quoi sert cette ligne, ni pourquoi il faut écrire
          .Find("*", , , , , xlPrevious).Row
          Est ce que c'est pour indiquer la fin de la colonne ? Mais si c'est pour cela, pourquoi mettre autant de virgules et que signifie xlPrevious ?

          - Dans la partie mémorisation,
          Vous écrivez
          For Lig=2 to derling Step 24
          , je vois qu'il n'y a pas beosin de déclarer Lig, mais pourquoi ?

          - Toujours dans la partie mémorisation, lorsque vous écrivez Jour=Jour+1, c'est grâce à la ligne du dessus qu'il comptabilise une journée de 24 heures (soit le step 24) ?

          - Dans la partie affichage des résultats, j'ai une erreur de type 9
          0
      3. Contributeur
        - Dans la partie affichage des résultats, j'ai une erreur de type9
        effectivement, excuse-moi,parenthèse mal placée (changement au dernier moment sans teste :-/
        correction:
        Range("H3").Resize(UBound(T_out), 4) = T_out


        qu'il n'y a pas beosin de déclarer Lig, mais pourquoi ?
        ??? lig est déclaré comme integer dans les déclarations

        Est ce que c'est pour indiquer la fin de la colonne ? oui
        Mais si c'est pour cela, pourquoi mettre autant de virgules et que signifie xlPrevious ?
        parce que xlprevious est le 6° paramêtre de la fonction et que je n'ai pas besoin du 2° au 5° ni du 7° au 9° (regarde l'aide en ligne)
        sens de recherche:
        xlprevious<==> avant
        xlnext=après
        Michel

        en espèrant que...
        0
        1. Merci beaucoup !
          0
        2. Bonjour,

          J'ai voulu réutiliser le même principe de la boucle que tu m'avais envoyé pour calculer la moyenne des températures extérieures chaque jours de l'année.

          J'ai donc écrit le code suivant :
           Sub temp_moy_24h()
          
          Dim Derlig As Integer, Nbre_jours As Integer
          Dim Lig As Integer, Jour As Integer, tab_temp_moy_ext
          Dim T_jour As Range
          Dim T_temp As Range
          
          Dim oSh As Worksheet
          Set oSh = Worksheets("Données inter PMV et DR")
          
          'Température extérieure moyenne sur 24h
          
          'initialisations
          
              Application.ScreenUpdating = False
              'nettoyage tableau résultats
              oSh.Range("AN2:AN8760").ClearContents
              Derlig = oSh.Columns("A").Find("*", , , , , xlPrevious).Row
              Nbre_jours = (Derlig - 1) / 24
              ReDim tab_temp_moy_ext(Nbre_jours, 3)
              
          '------Mémorisation des températures maxi/mini par jour/mois
          
              For Lig = 2 To Derlig Step 24
                  Jour = Jour + 1
                  Set T_jour = oSh.Range(Cells(Lig, "A"), Cells(Lig, "B"))
                  Set T_temp = oSh.Range(Cells(Lig, "D"), Cells(Lig + 23, "D"))
                  tab_temp_moy_ext(Jour, 1) = T_jour(1, 1)
                  tab_temp_moy_ext(Jour, 2) = T_jour(1, 2)
                  tab_temp_moy_ext(Jour, 3) = Application.WorksheetFunction.Average(T_temp)
          
                  
              Next
              
          '-----Restitutions des mesures
              oSh.Range("AN2").Resize(UBound(tab_temp_moy_ext), 3) = tab_temp_moy_ext
                  
          End Sub
          


          Et j'ai les problèmes suivant :
          - Tout d'abord, à cause de la ligne
          Set T_jour = oSh.Range(Cells(Lig, "A"), Cells(Lig, "B"))
          , j'ai une erreur de type 1004 : "La méthode Range de l'objet Worksheet a échoué". Lorsque j'essaie dans un autre fichier où il n'y a aucune macro il n'y a pas ce problème.
          - Ensuite, ma fonction moyenne ne fonctionne pas
          tab_temp_moy_ext(Jour, 3) = Application.WorksheetFunction.Average(T_temp)


          En vous remerciant,
          0
        3. Contributeur
          re,
          1:
          Dim T_jour As Range
          Dim T_temp As Range
          T_jour et T_temp sont des variables tableau contenant des données et non des cellules
          dim T_jour
          dim T _temp
          ou mais c'est implicite
          dim T_jour as variant
          dim T _temp as variant

          2:
          dans
          Application.WorksheetFunction.Average(T_temp)

          worksheetfunction est inutile car implicite
          Application.Average(T_temp)
          suffit. inutile d'encombrer le code

          3;
          ReDim tab_temp_moy_ext(Nbre_jours, 3)
          tel quel indique un départ d'index à 0

          à mettre avant sub
          option explicit
          option base 1

          ou
          dans la déclaration
          ReDim tab_temp_moy_ext( 1 to Nbre_jours, 1 to 3)


          la 1° méthode est préférable et "option explicit" souvent négligé est particulièrement utile
          0
        4. Re,

          Même avec les modifications ci dessus, j'ai toujours les mêmes problèmes.
          Option Explicit
          Option Base 1
          
          Sub temp_moy_24h()
          
          Dim Derlig As Integer, Nbre_jours As Integer
          Dim Lig As Integer, Jour As Integer, tab_temp_moy_ext
          Dim T_jour As Variant
          Dim T_temp As Variant
          
          Dim oSh As Worksheet
          Set oSh = Worksheets("Données inter PMV et DR")
          
          
          'Température extérieure moyenne sur 24h
          
          'initialisations
          
              Application.ScreenUpdating = False
              'nettoyage tableau résultats
              oSh.Range("AN2:AN8760").ClearContents
              Derlig = oSh.Columns("A").Find("*", , , , , xlPrevious).Row
              Nbre_jours = (Derlig - 1) / 24
              ReDim tab_temp_moy_ext(Nbre_jours, 3)
              
          '------Mémorisation des températures maxi/mini par jour/mois
          
              For Lig = 2 To Derlig Step 24
                  Jour = Jour + 1
                  Set T_jour = oSh.Range(Cells(Lig, "A"), Cells(Lig, "B"))
                  Set T_temp = oSh.Range(Cells(Lig, "D"), Cells(Lig + 23, "D"))
                  tab_temp_moy_ext(Jour, 1) = T_jour(1, 1)
                  tab_temp_moy_ext(Jour, 2) = T_jour(1, 2)
                  tab_temp_moy_ext(Jour, 3) = Application.Average(T_temp)
          
                  
              Next
              
          '-----Restitutions des mesures
              oSh.Range("AN2").Resize(UBound(tab_temp_moy_ext), 3) = tab_temp_moy_ext
                  
          End Sub
          


          Déjà une des choses que je ne comprends absolument pas, comment cela se fait-il que ce code se lance dans un autre fichier excel alors que dans mon fichier de base il trouve une erreur de type 1004.

          Et même dans l'autre fichier, je n'arrive pas à avoir la moyenne des températures.
          0
        5. Contributeur
          Pourtant, il me semble bien que ca marchait chez moi
          Comme je n'ai pas conservé mon classeur...
          remet le tien en PJ et je regardai mais quand,...
          0