Deux variables dans même colonne

Fermé
Messages postés
8
Date d'inscription
mardi 26 avril 2016
Statut
Membre
Dernière intervention
12 mai 2016
-
Messages postés
8
Date d'inscription
mardi 26 avril 2016
Statut
Membre
Dernière intervention
12 mai 2016
-
Bonjour,

Je travaille actuellement sur des relevés de température et d'hygrométrie qui sont répertoriés dans l'ordre chronologique dans une feuille Excel.
En Colonne B j'ai les temps t (format dd/mm/yy hh:mm), en C l'hygrométrie et en D la température. Pour chaque instant t de la colonne B il y a une valeur d'hygrométrie et de température.

J'ai imposé une première condition sur l'hygrométrie :
si l'hygrométrie est inférieure à 45% ou supérieure à 60%, les cellules de temps correspondantes (colonne B) sont coloriées d'une certaine couleur.

J'aimerais maintenant repéré les moments pour lesquelles l'humidité varie de plus de 10% en moins de 24h. (La première condition est de borner l'hygrométrie entre 45 et 60% et la seconde est de limiter à 10% maximum les variations d'hygrométrie sur toute période de 24h). Mon outil sert donc à identifier tous les moments où ces deux conditions ne sont pas remplies.

Pour cette deuxième condition, j'ai pensé faire de la manière suivante :

- 1) Rechercher dans la colonne B, les couples de cellules pour lesquels la différence de valeur est supérieure ou égale à 10. (Hygro2 - Hygro1 >=10)
- 2) Sélectionner parmi ces couples ceux pour lesquels la différence de temps (t2-t1) est inférieur à 24h. Je précise que les données sont données dans l'ordre chronologique.
- 3) Envoyer un message sur la feuille excel dans une case adjacente (en colonne E par exemple) "de t2 à t1 l'hygrométrie à varier de plus de 10%", ou "en Xheures l'hygrométrie à varier de plus de 10%" avec X <= 24h.

Ou sinon combiner les étapes 1) et 2) avec un "If Hygro2 - Hygro1 >=10 & t2 - t1 <= 24h" Then ...
Ce qui me semble plus judicieux vu le nombre important de lignes que j'ai à traiter.

Cependant, je n'ai pas réussi à obtenir des résultats corrects pour le moment.
Cela peut paraître simple mais voici le code que j'ai écris :

""
Sheets(2).Activate

Dernligne102 = Range("C" & Rows.Count).End(xlUp).Row

For jj = 2 To Dernligne102
For kk = 2 To Dernligne102

jj<>kk

x = Cells(jj, 3).Value
y = Cells(kk, 3).Value
z = Cells(jj, 2).Value
p = Cells(kk, 2).Value

If (x - y) >= 10 And (z - p) <= 24 Then
'Correspond à si variations d'hygrométrie supérieur à 10% et variation de température inférieur à 24h

Cells(jj, 2).Interior.ColorIndex = 35
Cells(kk, 2).Interior.ColorIndex = 35
'Je colorie les cellules, mais on peut également mettre un texte en face des cellules concernées
End If

Next kk
Next jj

""
Ce code a fait planté Excel. Trop de données à traiter? Faux? J'ai entre 5 et 10000 lignes dans ma colonne (et je devrai ultérieurement répéter cette opération sur une cinquantaine de colonne).
Je ne suis pas sûr que la condition (z-p) <= 24 soit bien comprise à cause du format des dates en dd/mm/yy hh:mm.

J'espère avoir été assez compréhensible dans cette explication, pensez-vous qu'il est possible de faire un code assez semblable et qui puisse traiter toutes ces informations.

Merci beaucoup pour votre aide

3 réponses

Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Bonjour,

Tu pourrais utiliser des formules et des MFC
Pour détecter un écart >10% :
=(MAX($C1:$C48)-MIN($C1:$C48))>10%
où C1:C48 représente une plage de 24h (ici une mesure toutes les 30 min)
Messages postés
8
Date d'inscription
mardi 26 avril 2016
Statut
Membre
Dernière intervention
12 mai 2016

Merci de cette réponse,

Le problème que j'ai est que les plages de 24h ne sont pas toutes de la même longueur. 1020 lignes pour la première 1100 pour la deuxième, ça varie beaucoup.
Il est possible de le faire sur une plage variable ?
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Bonjour,

Avec une plage variable :
=(MAX(DECALER(C1;0;0;EQUIV(B1+1;B1:B$100000;0)-1))-MIN(DECALER(C1;0;0;EQUIV(B1+1;B1:B$100000;0)-1)))>10%

Cordialement
Patrice
Messages postés
8
Date d'inscription
mardi 26 avril 2016
Statut
Membre
Dernière intervention
12 mai 2016

Si j'insère cette formule dans une colonne à part, les résultats que j'obtiens sont soit : FAUX soit #N/A.
J'ai du mal à comprendre pourquoi des valeurs #N/A apparaissent.
A quoi correspondent les +1 et -1 dans les EQUIV ?

Je ne saisis pas correctement le sens des fonctions DECALER et EQUIV il me semble...
Messages postés
8
Date d'inscription
mardi 26 avril 2016
Statut
Membre
Dernière intervention
12 mai 2016

J'ai remplacé 0 dans EQUIV par 1 et cela fonctionne ! Les relevés ne sont pas toujours à intervalles de temps réguliers, bien que ça soit théoriquement le cas.
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 731
Bonjour,

Explication de +1 et -1
B1 + 1 c'est B1 + un jour, c'est-à-dire le lendemain à la même heure.
...) - 1 c'est la valeur précédente.
1 jour complet, c'est toutes les valeurs depuis l'instant B1 jusqu'à l'instant qui précède la même heure le lendemain (car la même heure le lendemain, c'est déjà le jour suivant).

Avec cette formule je supposais que les mesures sont effectuées à heure fixe. Effectivement si les relevés ne sont pas effectués à heure fixe, remplacer le 0 par 1 dans Equiv, semble résoudre le problème, à condition de supprimer le -1.
Cela ne fonctionne bien que si il n'y a pas de mesure effectuée le lendemain à la même heure, sinon cette dernière mesure est intégrée à tort dans la moyenne.

Pour avoir une formule précise, il faudrait connaitre l’intervalle de temps minimum entre 2 mesures.
Messages postés
8
Date d'inscription
mardi 26 avril 2016
Statut
Membre
Dernière intervention
12 mai 2016

Bonjour,

J'ai repris votre formule et l'ai légèrement modifié pour mieux répondre à mon problème.
Elle s'écrit de la façon suivante :

=SI(OU(ABS(C2-MAX(DECALER(C2;0;0;EQUIV(B2+1;B2:B$10000;1)-1)))>10; ABS(C2-MIN(DECALER(C2;0;0;EQUIV(B2+1;B2:B$10000;1)-1>10)))); 1; 0)


Grâce à cette formule j'obtiens des 1 ou des 0 dans une colonne, dont je fais ensuite la somme dans une cellule à part.
La fonction marche, cependant j'ai remarqué que si j'intervertissais le MAX et le MIN je n'obtenais pas le même résultat (pas la même somme). Le problème provient certainement du OU, car après quelques tests j'ai cru comprendre que seul le premier terme du OU était pris en compte, le deuxième passant systématiquement à la trappe. Or normalement, les deux conditions sont testées et il en suffit d'une sur les deux pour avoir un 1 dans la cellule concernée.

Je n'arrive pas à trouver la coquille dans la formule, sauriez-vous m'aider sur ce petit problème ?

Cordialement
Antoine
Messages postés
8
Date d'inscription
mardi 26 avril 2016
Statut
Membre
Dernière intervention
12 mai 2016

Ne vous préoccupez pas, j'ai trouvé la solution. Ces fameuses parenthèses...