Boucles imbriquées

Résolu
Prunett Messages postés 31 Statut Membre -  
 Prunett -
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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  2. Prunett Messages postés 31 Statut Membre
     
    Voici le lien http://www.cjoint.com/data3/3DxkKB92WkC.htm
    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bien reçu, merci,
    je regarde dès que...
    0
    1. Prunett Messages postés 31 Statut Membre
       
      Merci beaucoup
      0
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Et voilà
    proposition:
    https://www.cjoint.com/?3DxnSE1S3Rf

    tu dis
    0
    1. Prunett Messages postés 31 Statut Membre
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    - 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. Prunett Messages postés 31 Statut Membre
       
      Merci beaucoup !
      0
    2. Prunett Messages postés 31 Statut Membre
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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. Prunett Messages postés 31 Statut Membre
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour Prunette
    ci joint tableau complèté avec calcul de la moyenne
    testé avec succès
    https://www.cjoint.com/?3Ebly31pcBH
    0
    1. Prunett
       
      Merci beaucoup !
      0