Comment afficher mes résultats d'un tableau sur une feuille [Résolu/Fermé]

Signaler
Messages postés
30
Date d'inscription
jeudi 5 mars 2015
Statut
Membre
Dernière intervention
12 mai 2015
-
 Paf -
Bonjour,

Je dois réaliser un programme calculant heure par heure le confort thermique des occupants.
Je pense avoir réalisé un tableau récupérant mes données qui varient sur l'année (température et pression).
Maintenant, j'aimerai pouvoir calculer 3 paramètres (les uns en fonction des autres) sur l'ensemble de l'année et de les afficher dans ma feuille excel

Avant d'essayer de programmer heure par heure avec des données qui changent, j'avais réalisé mon programme pour des valeurs données et vérifier que celui-ci fonctionnait.

Le début de code que j'ai réalisé est :
'Déclaration des variables pour calcul TCL
Dim mét As Integer
Dim travail As Integer
Dim ICL As Single
Dim FCL As Single
Dim temp_ext As Single
Dim temp_moy_parois As Single
Dim pression_vap_sat As Single
Dim vitesse_relative_lair As Single
Dim TCL As Single
Dim coef_transfert_chaleur As Single

'Valeurs des variables
mét = Worksheets("confort thermique").Cells(7, 6)
travail = Worksheets("confort thermique").Cells(8, 6)
ICL = Worksheets("confort thermique").Cells(9, 6)
temp_moy_parois = Worksheets("confort thermique").Cells(12, 6)
vitesse_relative_lair = Worksheets("confort thermique").Cells(14, 6)
coef_transfert_chaleur = 12.1 * (vitesse_relative_lair) ^ (1 / 2)

'Calcul du rapport surface habillée par rapport à la surface du corps nu FCL
If ICL <= 0.078 Then
FCL = 1 + 1.29 * ICL
Else: FCL = 1.05 + 0.645 * ICL
End If

FCL = Application.WorksheetFunction.Round(FCL, 2)
Worksheets("Résultat").Cells(10, 15) = FCL

'Déclaration tableau données météorologique
Dim tab_météo(9, 1)

'Enregistrement des valeurs dans le tableau
For i = 0 To 9
tab_météo(i, 0) = Range("D" & i + 2)
tab_météo(i, 1) = Range("E" & i + 2)

'Calcul de TCL
' On se ramène a une équation du deuxième degré ax²+bc+c=0
' Déclaration des variables a,b et c

A = -3.96 * 10 ^ -8 * 447174 * ICL * FCL
B = -(3.96 * 10 ^ -8 * 81385668 * ICL * FCL + ICL * FCL * coef_transfert_chaleur + 1)
C = 35.7 - 0.028 * (mét - travail) - 0.0000000396 * ICL * FCL * (273 ^ 4 - (temp_moy_parois + 273) ^ 4) + ICL * FCL * coef_transfert_chaleur * tab_météo(1, 0)

'Calcul de delta
Delta = B ^ 2 - (4 * A * C)

' Recherche des solutions

Select Case (Delta)

Case Is > 0
X1 = (-B - (Delta) ^ 0.5) / (2 * A)
X2 = (-B + (Delta) ^ 0.5) / (2 * A)

X1 = Application.WorksheetFunction.Round(X1, 2)
X2 = Application.WorksheetFunction.Round(X2, 2)


Case Is = 0

X0 = -B / (2 * A)

X0 = Application.WorksheetFunction.Round(X0, 2)


Case Else

MsgBox ("impossible de calculer la température avec ce programme !")

End Select

'Valeur de TCL

If X1 > X2 Then
TCL = X1
Else: TCL = X2

End If

Dim tab_TCL(9) As Variant

For TCL = 0 To 9
tab_TCL(TCL) = TCL
Next TCL


Range(Cells(2, 7), Cells(UBound(tab_TCL, 1), 1 + UBound(Ta_TCL, 2))) = tab_TCL

Worksheets("Résultat").Cells(11, 15) = TCL

Next


Cependant, cela ne fonctionne pas. Je suis débutante en programmation, et je n'arrive pas à prendre du recul pour corriger mon erreur.
Je ne suis pas sure d'avoir correctement affecter mes valeurs TCL aux tableaux ? Cela expliquerait peut être pourquoi j'obtiens un problème de type dans la ligne
Range(Cells(2, 7), Cells(UBound(tab_TCL, 1), 1 + UBound(Ta_TCL, 2))) = tab_TCL

Merci d'avance,

8 réponses

Bonjour ,
on déclare un tableau Dim tab_TCL(9) à une dimension
mais dans :
Range(Cells(2, 7), Cells(UBound(tab_TCL, 1), 1 + UBound(Ta_TCL, 2))) = tab_TCL 


On utilise UBound(Ta_TCL, 2) soit le nombre d'élément de la deuxième dimension du tableau Ta_TCL, qui a priori n'existe pas; et s'il s'agissait d'une erreur de frappe pour tab_TCL, ce dernier n'a qu'une dimension.

Par ailleurs,pour reporter un tableau dans une feuille, il est plus simple d'utiliser Resize.

a priori
Cells(2, 7).Resize(UBound(tab_TCL)) = tab_TCL 


A+
Re,

en relisant le code, je me pose quelques questions:
à partir de
'Enregistrement des valeurs dans le tableau
For i = 0 To 9

on remplit le tableau tab_météo qui après ne sert plus à rien
on cherche les solutions d'une équation , sans les exploiter
puis on remplit avec des valeurs de 0 à 9 le tableau tab_TCL qu'on copie ensuite dans une feuille.

Il semble qu'il manque quelque chose ?

Dite ce que vous voulez faire et joignez un fichier avec des données non sensibles,

A+
Je n'ai pas mis le code en entier.
En fait, mon tab_météo je le réutilise pour quelques valeurs dans le reste du programme que je n'ai pas mis.

Les valeurs TCL, PMV et PPD que je cherche à afficher dans la feuille excel je vais les utiliser par la suite pour étudier les plages de confort.

En ayant modifié mon code avec les remarques juste avant, cela ne fonctionne toujours pas. Je pense qu'il y a d'autres choses qui ne fonctionnent pas.

Je remets le code
ub Synthese()

'Ecriture de la ligne de titre

Range("A1") = "Mois"
Range("B1") = "Jour"
Range("C1") = "Heure"
Range("D1") = "Température extérieur"
Range("E1") = "Pression saturante"



'Mise en forme de la ligne de titre

Range("A1:E1").Interior.Color = 13434879
Range("A1:E1").Font.Bold = True
Range("A1:E1").Font.Color = 25
Range("A1:E1").Borders.Weight = 2.5

'Copie des cellules


Worksheets("Données Calcul TCL").Range("A2:E8761").Copy
Worksheets("Résultat").Activate
Worksheets("Résultat").Range("A2").Select
Worksheets("Résultat").Paste

'Nom des colonnes de Résultat

Range("G1") = "FCL"
Range("H1") = "TCL"
Range("I1") = "PMV"
Range("J1") = "PPD"

'Mise en forme des colonnes de Résultat

Range("G1:J1").Interior.Color = RGB(255, 204, 204)
Range("G1:J1").Font.Bold = True
Range("G1:J1").Font.Color = 0
Range("G1:J1").Borders.Weight = 2.5

'Déclaration des variables pour calcul TCL

Dim mét As Integer
Dim travail As Integer
Dim ICL As Single
Dim FCL As Single
Dim temp_ext As Single
Dim temp_moy_parois As Single
Dim pression_vap_sat As Single
Dim vitesse_relative_lair As Single
Dim TCL As Single
Dim coef_transfert_chaleur As Single

'Valeurs des variables

mét = Worksheets("confort thermique").Cells(7, 6)
travail = Worksheets("confort thermique").Cells(8, 6)
ICL = Worksheets("confort thermique").Cells(9, 6)
temp_moy_parois = Worksheets("confort thermique").Cells(12, 6)
vitesse_relative_lair = Worksheets("confort thermique").Cells(14, 6)
coef_transfert_chaleur = 12.1 * (vitesse_relative_lair) ^ (1 / 2)

'Calcul du rapport surface habillée par rapport à la surface du corps nu FCL

If ICL <= 0.078 Then
FCL = 1 + 1.29 * ICL
Else: FCL = 1.05 + 0.645 * ICL
End If

FCL = Application.WorksheetFunction.Round(FCL, 2)
Worksheets("Résultat").Cells(10, 15) = FCL

'Déclaration tableau données météorologique

Dim tab_météo(9, 1)


'Enregistrement des valeurs dans le tableau

For i = 0 To 9

tab_météo(i, 0) = Range("D" & i + 2)
tab_météo(i, 1) = Range("E" & i + 2)

'Calcul de TCL
' On se ramène a une équation du deuxième degré ax²+bc+c=0
' Déclaration des variables a,b et c

A = -3.96 * 10 ^ -8 * 447174 * ICL * FCL
B = -(3.96 * 10 ^ -8 * 81385668 * ICL * FCL + ICL * FCL * coef_transfert_chaleur + 1)
C = 35.7 - 0.028 * (mét - travail) - 0.0000000396 * ICL * FCL * (273 ^ 4 - (temp_moy_parois + 273) ^ 4) + ICL * FCL * coef_transfert_chaleur * tab_météo(1, 0)

'Calcul de delta
Delta = B ^ 2 - (4 * A * C)


' Recherche des solutions

Select Case (Delta)

Case Is > 0
X1 = (-B - (Delta) ^ 0.5) / (2 * A)
X2 = (-B + (Delta) ^ 0.5) / (2 * A)

X1 = Application.WorksheetFunction.Round(X1, 2)
X2 = Application.WorksheetFunction.Round(X2, 2)


Case Is = 0

X0 = -B / (2 * A)

X0 = Application.WorksheetFunction.Round(X0, 2)


Case Else

MsgBox ("impossible de calculer la température avec ce programme !")

End Select


'Valeur de TCL

If X1 > X2 Then
TCL = X1
Else: TCL = X2

End If

Dim tab_TCL(9) As Variant

For TCL = 0 To 9
tab_TCL(TCL) = TCL
Next TCL


Cells(2, 7).Rezise(UBound(tab_TCL, 1)) = tab_TCL

Worksheets("Résultat").Cells(11, 15) = TCL


'Calcul du PMV :

PMV = (0.303 * Exp((-0.036 * mét)) + 0.028) * ((mét - travail) - 0.00305 * (5733 - 6.99 * (mét - travail) - tab_météo(1, 1)) - 0.42 * ((mét - travail) - 58.15) - 0.000017 * mét * (5867 - tab_météo(1, 1)) - 0.0014 * mét * (34 - tab_météo(1, 0)) - 0.0000000396 * FCL * ((TCL + 273) ^ 4 - (temp_moy_parois + 273) ^ 4) - FCL * coef_transfert_chaleur * (TCL - tab_météo(1, 0)))
PMV = Application.WorksheetFunction.Round(PMV, 2)

Worksheets("Résultat").Cells(12, 15) = PMV

'Calcul du PPD:

PPD = 100 - 95 * Exp(-0.03353 * PMV ^ 4 - 0.2199 * PMV ^ 2)
PPD = Application.WorksheetFunction.Round(PPD, 2)

Worksheets("Résultat").Cells(13, 15) = PPD


'Afficher Valeur TCL, PMV et PPD dans la feuille de calcul Résultat

Next



'Fin des travaux

Cells.EntireColumn.AutoFit
Range("G2").Select



End Sub
re,
quand je dis "dite ce que vous voulez faire", je parlais au niveau du code.

notamment avec

If X1 > X2 Then
TCL = X1
Else: TCL = X2

End If

j'ai bien compris que TCL va contenir la solution minimum

mais ensuite
        Dim tab_TCL(9) As Variant

For TCL = 0 To 9
tab_TCL(TCL) = TCL
Next TCL


TCL devient une variable pour la boucle puis le tableau va contenir les valeurs 0,1,2,3,.....,8 et 9. Puis ce tableau sera copié sur la feuille et cela 10 fois (boucle For i = 0 To 9)

Je ne comprend pas bien ce que vous cherchez à faire.

et sans un classeur support pas évident de tester d'éventuelles solutions

A+
Messages postés
30
Date d'inscription
jeudi 5 mars 2015
Statut
Membre
Dernière intervention
12 mai 2015

Dans ma résolution d'équation, j'obtiens deux valeurs et je m'intéresse qu'à la plus grande des deux valeurs. Je voulais utiliser la fonction maximum, mais je n'arrivais pas à la trouver sur VBA du coup j'ai fait cette boucle.
If X1 > X2 Then
TCL = X1
Else: TCL = X2

End If


Je voulais à la base faire mon programme en entier et créer un tableau final avec TCL, PMV et PPD pour pouvoir afficher toutes ces valeurs dans ma feuille excel.

Je joints le classeur excel.
https://www.cjoint.com/?3CfuRZnsI4h

Merci beaucoup en tout cas,
>
Messages postés
30
Date d'inscription
jeudi 5 mars 2015
Statut
Membre
Dernière intervention
12 mai 2015

heu oui j'ai inversé pour le mini et le maxi, mais ça b'explique toujours pas ce que vous voulez en faire puisque à peine déterminé TCL est 'écrasé' par les valeurs 0,1,2,...

j'essaie de regarder la PJ
Messages postés
30
Date d'inscription
jeudi 5 mars 2015
Statut
Membre
Dernière intervention
12 mai 2015
> Paf
Je ne veux pas écraser mes valeurs. Je veux pouvoir utiliser TCL dans la suite de mes calculs et ensuite je voudrais que ces valeurs s'affichent dans ma feuille EXCEL,car pour la suite, je vais devoir les comparer à une constante pour déterminer si on est en condition de confort ou non.
Mais pour cette partie, je comptais faire un autre module, de peur de tout écraser.

Je ne sais pas si je plus clair.

En fait, je voulais un tableau qui reprennent toutes les valeurs de TCL et qui les affichent dans Excel
Re,

Pour revenir au sujet de cette discussion, pour copier le tableau dans la feuille: il faut utiliser resize et non rezice !!! et Application.Transpose pour mettre le tableau vertical.
Cells(2, 7).Resize(UBound(tab_TCL, 1)) = Application.Transpose(tab_TCL)



je voulais un tableau qui reprennent toutes les valeurs de TCL

Bien qu'étant dans une boucle (For i= 0 to 9)(pourquoi 9 ?) le calcul de TCL se fait sur des données fixes (prises en feuille "confort thermique") , à chaque itération on aura une seule valeur de TCL ( identique à la précédente). N'ayant qu'une valeur (par itération) difficile d'en faire un tableau 9 élément !

Faut il un TCL par ligne de donnée de la feuille "Résultats" ?
Comment se calcule le TCL les éléments de calculs sont pris où ?

A+
Messages postés
30
Date d'inscription
jeudi 5 mars 2015
Statut
Membre
Dernière intervention
12 mai 2015

Pour le TCL certes la valeur est identique pour chaque ligne. Ils se calculent avec la résolution de l'équation du second degré.
Certaines valeurs sont prises dans confort thermique (premières variables définies), d'autres sont calculées entre elles, sauf pour la valeur de la température qui elle est prise dans le tableau
'Déclaration tableau données météorologique

Dim tab_météo(9, 1)


'Enregistrement des valeurs dans le tableau

For i = 0 To 9

tab_météo(i, 0) = Range("D" & i + 2)
tab_météo(i, 1) = Range("E" & i + 2)


température est ==>
  tab_météo(i, 0) = Range("D" & i + 2)

pression est ==>
 tab_météo(i, 1) = Range("E" & i + 2)


Certes pour le TCL, je n'ai pas forcément besoin d'avoir sa valeur pour chaque ligne en revanche pour le calcul du PMV et du PPD si.

Enfin pour le PMV et le PPD les valeurs varient en fonction de la température et de la pression qui varient toutes les heures et sont sur ma feuille excel Résultat.

Je souhaiterai rajouter un morceau de code me permettant de calculer PMV et PPD (qui utilisent la valeur de TCL) et les afficher dans la feuille Résultat.

Le calcul est ok normalement (il fonctionne sur la feuille confort thermique où toutes les variables sont définies comme des constantes). Dans mon module Synthèse, j'ai essayé de définir un tableau pour les colonnes température et pression que je réutilise dans la formule.

Après j'avais pris jusqu'à 9 pour voir si cela fonctionnait avant de lancer mon programme sur les 8760 lignes.
Re

pour qu'on ait une seule valeur de TCL par itération:

Rajouter dans
'Déclaration des variables pour calcul TCL
Dim Tab_TCL(9)


Supprimer
        Dim tab_TCL(9) As Variant        
For TCL = 0 To 9
tab_TCL(TCL) = TCL
Next TCL

et remplacer par
 Tab_TCL(i) = TCL


déplacer
Cells(2, 7).Resize(UBound(Tab_TCL, 1)) = Application.Transpose(Tab_TCL)
après le dernier Next de la sub

A+
Messages postés
30
Date d'inscription
jeudi 5 mars 2015
Statut
Membre
Dernière intervention
12 mai 2015

Merci, cela fonctionne :)

Cependant, j'ai une autre question : les valeurs du PMV et du PPD varient qu'est ce que je dois modifier dans mon code pour les afficher.

Je dois d'abord déclarer mes variables
Dim tab_PMV(9)
Dim tab_PPD(9)


Mais je code ça de cette manière, cela ne veut pas dire que ça affichera qu'un seul résultat ?

Et la dernière ligne de code

Cells(2, 8).Resize(UBound(Tab_PMV, 1)) = Application.Transpose(Tab_PMV)
Cells(2, 9).Resize(UBound(Tab_PPD, 1)) = Application.Transpose(Tab_PPD)


Est ce que dans ce cas là, je ne dois pas les mettre dans ma boucle For...Next ?

B
Re,

pour PMV et PPD, c'est comme pour TCL comme vous le présentiez.

déclaration des tableaux en début de Sub

puis, exemple pour PMV: (à adapter pour PPD)

remplacer

'Calcul du PMV :
PMV = (0.303 * Exp((-0.036 * mét)) + 0.028) * ((mét - travail) - ....
PMV = Application.WorksheetFunction.Round(PMV, 2)

Worksheets("Résultat").Cells(12, 15) = PMV


par
'Calcul du PMV :
PMV = (0.303 * Exp((-0.036 * mét)) + 0.028) * ((mét - travail) -...
PMV = Round(PMV, 2) 'c'est pareil et plus court

tab_PMV(i) = PMV


et après le next

Cells(2, 8).Resize(UBound(Tab_PMV, 1)) = Application.Transpose(Tab_PMV)


Plutôt que de faire un tableau par type de donnée, on pourrait envisager un seul tableau regroupant toutes les données puis faire une seule copie de ce tableau sur la feuille. Mais ce ne sera pas pour ce soir

A+
Dernière remarque pour aujourd'hui

dans
C = 35.7 - 0.028 * (mét - travail) - 0.0000000396 * ICL * FCL * (273 ^ 4 - (temp_moy_parois + 273) ^ 4) + ICL * FCL * coef_transfert_chaleur * tab_météo(1, 0)

ne serait ce pas plutôt tab_météo(i, 0) ?, sinon C aura toujours la même valeur

bonne nuit
Messages postés
30
Date d'inscription
jeudi 5 mars 2015
Statut
Membre
Dernière intervention
12 mai 2015

Merci beaucoup !

Cela fonctionne, j'avais laissé cette erreur tab_météo(1,0) au lieu de tab_météo(i,0).

Je suis intéressée pour réaliser un seul tableau. Je pensais bien que c'était réalisable mais je me perds un peu dans la déclaration des variables et son utilisation.

En tout cas, merci beaucoup, cela fonctionne !
Re bonjour

à vérifier, un seul tableau pour les 3 données,

https://www.cjoint.com/?3CgnYxvkg3C

n'étant pas inscrit je ne peux insérer de lien.

Bon Courage