Boucles imbriquées

Résolu/Fermé
Prunett Messages postés 30 Date d'inscription jeudi 5 mars 2015 Statut Membre Dernière intervention 12 mai 2015 - Modifié par Whismeril le 30/04/2015 à 09:46
 Prunett - 5 mai 2015 à 16:19
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

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
23 avril 2015 à 10:09
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
Prunett Messages postés 30 Date d'inscription jeudi 5 mars 2015 Statut Membre Dernière intervention 12 mai 2015
23 avril 2015 à 10:23
Voici le lien http://www.cjoint.com/data3/3DxkKB92WkC.htm
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
23 avril 2015 à 10:54
Bien reçu, merci,
je regarde dès que...
0
Prunett Messages postés 30 Date d'inscription jeudi 5 mars 2015 Statut Membre Dernière intervention 12 mai 2015
23 avril 2015 à 11:11
Merci beaucoup
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
23 avril 2015 à 13:31
Et voilà
proposition:
https://www.cjoint.com/?3DxnSE1S3Rf

tu dis
0
Prunett Messages postés 30 Date d'inscription jeudi 5 mars 2015 Statut Membre Dernière intervention 12 mai 2015
23 avril 2015 à 13:54
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 23/04/2015 à 14:15
- 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
Prunett Messages postés 30 Date d'inscription jeudi 5 mars 2015 Statut Membre Dernière intervention 12 mai 2015
23 avril 2015 à 14:38
Merci beaucoup !
0
Prunett Messages postés 30 Date d'inscription jeudi 5 mars 2015 Statut Membre Dernière intervention 12 mai 2015
30 avril 2015 à 09:21
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
30 avril 2015 à 10:15
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
Prunett Messages postés 30 Date d'inscription jeudi 5 mars 2015 Statut Membre Dernière intervention 12 mai 2015
30 avril 2015 à 10:36
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
30 avril 2015 à 14:32
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
1 mai 2015 à 11:10
Bonjour Prunette
ci joint tableau complèté avec calcul de la moyenne
testé avec succès
https://www.cjoint.com/?3Ebly31pcBH
0
Merci beaucoup !
0