Et le type de plafond, tu en as besoin?
Version imprimable
Et le type de plafond, tu en as besoin?
Ok. C'est déjà plus raisonnable. Donc, la règle est de prendre le plus restrictif de tous les plafonds (BKN, OVC, NSC, ...) que l'on trouve dans un segment, c'est bien ça?
"NSC" n'est pas tout à fait considéré comme un plafond mais nous annonce qu'il y en a pas donc la comparaison se fait uniquement entre "BKN" et "OVC" dans un segment, la plus part du temps nous avons uniquement un seul des deux, le cas d'avoir deux "BKN" ou "OVC" dans un segment est assez rare.
Concernant le type de plafond, si je peux l'avoir c'est mieux sinon je me débrouillerai.
Merci encore
MU
Voici un truc à tester sous toutes les coutures... et encore à tester et retester avec des nouvelles chaines brutes... On ne teste jamais assez ce genre de truc
Pour tester, vider le tableau des groupes, vider la colonne Extrait? du tableau des données. Si cellule rouge dans le tableau des données, la remettre à automatique avant le test suivant
Pièce jointe 482327
Quelques petites choses ont changé...
Dans les tables Excel, j'ai ajouté une colonne Plafond pour recevoir le plus petit plafond renseigné. J'ai également ajouté, dans le tableau des données brutes, une colonne pour la date et une pour le statut du transfert.
Le type personnalisé a été enrichi, notamment pour en ajoutant le plafond
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Public Type Group Ceiling As Long Date_Issued As String Force As Long KeyWord As String Overcast As String Position As Long Time_Issued As Date ValidityBeginDate As String ValidityBeginTime As Date ValidityEndDate As String ValidityEndTime As Date Visibility As Long Wind As Long End Type
La procédure qui traite le transfert boucle sur le tableau des données brutes, en testant si la ligne a déjà été traitée. Si erreur durant le traitement, le Catch s'en charge et met en rouge la colonne de la chaine brute qui pose problème. Sinon, on met le statut Traité à VRAI.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Sub Extract() Dim Cell As Range Dim Counter As Long Dim Data As String Dim Datas Dim Groups() As Group Dim IssuedDate As String Dim IssuedTime As Date Dim NewGroup As Group Dim Separators Application.ScreenUpdating = False For Each Cell In Range("t_Datas[Donnée]") On Error GoTo Catch If Cell(1, 3) <> True Then Data = Cell.Value IssuedDate = Cell(1, 2).Value IssuedTime = Mid(Data, 3, 2) / 24 + Mid(Data, 5, 2) / 1440 Data = Replace(Data, Left(Data, 8), "") Separators = getArrayFromCells(Range("t_Bornes[Borne]")) Datas = getDatas(Data, Separators, ";") ReDim Groups(UBound(Datas)) For Counter = 0 To UBound(Datas) Groups(Counter) = getGroup(Trim(Datas(Counter)), IssuedDate, IssuedTime, Counter + 1) Next PutGroupsInTable Groups Catch: If Err <> 0 Then Cell.Interior.Color = vbRed Else Cell(1, 3).Value = True End If End If Next Application.ScreenUpdating = True End Sub
La segmentation n'a pas bougé. Si d'autres mots-clé (à un mot, deux mots ou x mots) venaient à apparaître, il suffirait de les ajouter en triant sur les plus longs d'abord. Attention bien entendu que un (petit) mot-clé ne peut pas correspondre à une chaine contenue à l'intérieur d'un segment (cela va de soi mais je préfère le dire). Donc, pas de mot-clé KT ou OVC ou autre...
L'extraction de certaines propriétés d'un segment a été modifiée et, au lieu de recevoir le segment, reçoit le tableau des propriétés. Cela permet un traitement plus aisé de la propriété. Il serait concevable et même souhaitable de généraliser le processus à toutes les propriétés, histoire de normaliser les process. Cela facilite la maintenance et l'évolution, même si dans certains cas les traitements pourraient être un chouia plus lents. Je préfère de loin une maintenance et une évolution aisées à un code qui gagne quelques millisecondes.
GetGroup a donc été adapté pour passer soit le segment en string, soit le segment en tableau.
A titre d'exemple, deux propriétés qui utilisent le segment en array plutôt qu'en string. La première sort de la boucle dès que possible, la seconde est obligée de parcourir tout l'array pour récupérer la plus petite valeur. Evidemment, pas d'Exit Do dans le premier cas, mais une sortie propre de la boucle ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Function getGroup(ByRef Data, ByVal IssuedDate As String, IssuedTime As Date, ByVal Position) As Group Dim G As Group Dim Values Values = Split(Data, " ") G.Position = Position G.Date_Issued = IssuedDate G.Time_Issued = IssuedTime SetCeiling G, Data SetKeyWord G, Data SetOvercast G, Values setValidities G, Data SetVisibility G, Values SetWindForce G, Values getGroup = G End Function
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub SetVisibility(ByRef G As Group, ByVal Values) Dim Counter As Long Do While Counter <= UBound(Values) And G.Visibility = 0 If Len(Values(Counter)) = 4 And IsNumeric(Values(Counter)) Then G.Visibility = Values(Counter) * 1 Counter = Counter + 1 Loop End Sub Sub SetOvercast(ByRef G As Group, ByVal Values) Dim Counter As Long Dim Value Dim Pos As Long For Counter = 0 To UBound(Values) If InStr(1, Values(Counter), "BKN") > 0 Or InStr(1, Values(Counter), "OVC") > 0 Then If Mid(Values(Counter), 4, 3) < Value Or IsEmpty(Value) Then Value = Mid(Values(Counter), 4, 3) End If Next If Not IsEmpty(Value) Then G.Overcast = Value End Sub
Pierre,
ça marche impeccable, un seul souci quand je vide le tableau des groupes (toutes les données extraites) et redémarre la macro je n'ai aucune donnée extraite dans le tableau des groupes, cela ne marche que si je ne vide pas le tableau des groupes et rajoute une nouvelle ligne d'extraction dans données, j'ai aussi remarqué qu'en cas de rajout d'une nouvelle ligne de données et après avoir démarré la macro, le tableau des groupes s'alimente sauf la colonne date.
Merci beaucoup!
MU
N'oublie pas de supprimer les VRAI dans la colonne Extrait? des chaines brutes, car les lignes à VRAI ne sont pas traitées. Il faut aussi compléter la colonne DATE du tableau des chaines brutes.
il restera un problème qui n'a pas encore été traité (en plus des bugs et adaptations éventuelles). C'est le problème du débordement sur le mois suivant pour les Validités des chaines récupérées en fin de mois. En effet, un Issue Date au 30/06/2019 va probablement donner certaines validités au 01 juillet. Ce problème n'est actuellement pas traité, mais normalement, si tu as compris le code que j'ai proposé, il te serait relativement aisé de pouvoir adapter le code. Sinon, reviens.
en effet j'avais oublié de vider la colonne des "statut" vrai, et maintenant j'ai une ligne des données qui est en rouge :)
C'est qu'il y a un cas non prévu... Peux-tu montrer la chaine qui pose problème?
Pour pouvoir trouver le problème, il faut désactiver temporairement la gestion des erreurs... Va dans les options du VBE et mets la gestion d'erreur sur "Toutes les erreurs"... Le code s'arrêtera sur la ligne de code qui pose problème...
Pièce jointe 482354
"IssuedTime = Mid(Data, 3, 2) / 24 + Mid(Data, 5, 2) / 1440" j'ai une erreur d'execution sur cette ligne
j'ai vidé les groupes et essayé de garder une ligne de données
Donne la chaine brute qui a posé le problème. Apparemment, le tout début de la chaine n'est pas correct. La chaine devrait commencer par le jour et l'heure puis Z => jjhhmmZ
J'avais essayé cette extraction:
101700Z 1018/1124 05016KT 9000 FEW013=
sinon tu peux essayer celle là aussi:
101710Z 1018/1124 23008KT 9999 FEW030
PROB40 TEMPO 1021/1103 08020G35KT 3000 TSRA SCT030 FEW033CB=
Je n'ai eu aucun souci avec cette ligne. Es-tu sûr qu'il n'y a pas un espace au tout début de la chaine? Si ta chaine démarre bien avec une bonne séquence pour les issue, ça ne saurait pas buguer là où tu le dis.
Pièce jointe 482356
Pas eu de soucis non plus...
Pièce jointe 482360
si je vide tous les groupes et rajoute en A2 cette extraction brute:
101710Z 1018/1124 23008KT 9999 FEW030 PROB40 TEMPO 1021/1103 08020G35KT 3000 TSRA SCT030 FEW033CB=
j'ai les lignes A3 et A4 qui sont rouges.
Ca n'a rien à voir avec ce qui bloque chez toi pour l'instant, mais au début, je n'extrayais que des strings, et donc la IssuedDate était en string. Dès lors, il y a une inversion des jours/mois dans la date (j'ai changé en date par la suite sur base de la nouvelle colonne Date...).
Dans le code, au début du module, dans la définition du type de données, il faut modifier la ligne pour Date_Issued en Date_Issued As Date
Pas chez moi... Quelle est la ligne en jaune dans le code, celle sur laquelle le code s'arrête?
Dès que je vide tout le tableau de groupe, et toutes extractions brutes avec la colonnes des "vrai" et que je rajoute à nouveau une nouvelle extraction brute en A2 , le code s'arrête sur cette ligne:
IssuedTime = Mid(Data, 3, 2) / 24 + Mid(Data, 5, 2) / 1440
Je ne vois pas ce qui peut bloquer sur cette ligne si ta chaine commence bien par 101710Z (sans aucun espace devant)...
Mets une copie d'écran du tableau des chaines brutes et poste ton fichier stp...
Lorsque la ligne est jaune, passe ta souris sur le mot Data pour voir la chaine qui est contenue dans cette variable et poste-là. Tu peux aussi afficher les variables locales (menu Affichage) pour la voir dans le panneau qui va s'afficher à droite...
As-tu essayé de vider tous les groupes, date et extrait? et toutes les extractions brutes et de rajouter uniquement une nouvelle ligne d'extraction brute et faire marcher la macro?
Merci
MU
Oui. Le problème ne vient pas du fait que les tableaux sont remplis ou vides... Vu le code qui pose problème chez toi, je suis pratiquement certain qu'il y a un espace en tout début de chaine... Ou alors, il y a un O à la place d'un 0... Mais la chaine que tu m'as donnée fonctionne, même sur un tableau vidé...
Pièce jointe 482362