je viens de rajouter mon fichier.
Version imprimable
je viens de rajouter mon fichier.
Ok. Avec ton fichier, je comprends...
La table des chaines brutes ne peut pas contenir des lignes vides. Il ne s'agit pas de vider les lignes, mais de les supprimer. Sinon, le code essaie d'extraire des caractères d'une chaine vide et fatalement, ça plante...
Si tu supprimes bien tes lignes et que tu mets la date, ça passera...
Pourrais-tu s'il te plaît me joindre le fichier avec les lignes supprimées et la date rajoutée stp, visiblement ça plante toujours chez moi :)
Merci
En effet je viens de tester à nouveau avec les lignes supprimées et cela fonctionne parfaitement.
Merci infiniment Pierre je t'ai bien usé aujourd'hui :)
Je regarderai plus tard pour d'autres modifications mais pour le moment je vais pouvoir me débrouiller.
Merci encore et excellente soirée.
MU
Pas de quoi...
Il est certain qu'une fois que cela fonctionne, il faut "débusquer" les pièges et mettre des tests de cohérences. Dans la boucle qui traite les chaines brutes, on devrait normalement tester que la chaine n'est pas vide. On devrait aussi mettre des sécurités dans chaque procédure Set... du group pour vérifier que l'on peut effectivement traiter la donnée. Ici, je suis parti du principe que c'est un processus informatique qui crée les chaines et donc que les segments sont cohérents. Mais cela n'empêche pas qu'il faille mettre des sécurités pour ne pas buguer... ;)
Merci Pierre,
Depuis hier je me régale, ça marche tellement bien que je vais faire mon "rloud" je cherche le moyen de virer tous les PROB30 TEMPO et PROB40 TEMPO dans le tableau, ces derniers sont inutiles et me polluent le tableau :)
et cerise sur le gâteau après réflexion ce serait mieux d'avoir le code lettre 4 lettres comme dans l'exemple ci-dessous:
Pièce jointe 482637
Ci-après un exemple d'extraction avec le code 4 lettre qui change à chaque fois:
TLPL 111700Z 1118/1224 05015KT 9999 SCT014 TEMPO 1122/1208 8000=
Promis je ne t'embête plus après :)
Merci et bonne soirée
MU
Voici un fichier modifié. Comme tu avais parlé dès le début de devoir exclure les segments contenant certains mots-clé, c'était déjà prévu dans le tableau (colonne Utilisé). Il suffit de mettre ceux que tu ne veux pas à FAUX.
Pour déterminer si un segment doit être repris ou pas, on utilise une fonction perso qui récupère la valeur de Utilisé pour un mot-clé donné. Cette fonction perso utilise EVALUATE avec INDEX/MATCH.
Pour l'ajout des quatre premières lettres comme nom, c'est réalisé avant de traiter les groupes puisque c'est le même nom pour tous les segments d'une chaine donnée. Par contre, comme cela a amené à ajouter une colonne en deuxième position dans le tableau final, il aurait fallu décaler tous les index de 1 dans la fonction qui renvoie les données dans la table. J'ai donc adapté cette fonction pour qu'elle retrouve la position de la colonne grâce à son nom. Cela implique que si on modifie l'ordre des colonnes, on ne doit pas modifier la fonction. Par contre, cela "fige" les noms de colonne dans la table des segments.Code:
1
2
3
4
5
6
7
8 Function KeyWordIsUsed(Keyword As String) As Boolean Dim Result Dim Formula As String Formula = "iferror(index(t_bornes[Utilisé],match(""" & Keyword & """,t_bornes[Borne],0))*-1,0)" Result = Evaluate(Formula) KeyWordIsUsed = Result 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 Sub PutGroupInTable(Group As Group) Dim NewRow As ListRow If Group.Position > 0 Then Set NewRow = Range("t_Groupes").ListObject.ListRows.Add() With Group NewRow.Range(NewRow.Parent.ListColumns("Position").Index).Value = .Position NewRow.Range(NewRow.Parent.ListColumns("Nom").Index).Value = .Name NewRow.Range(NewRow.Parent.ListColumns("Mot-Clé").Index).Value = .Keyword NewRow.Range(NewRow.Parent.ListColumns("Date").Index).Value = .Date_Issued NewRow.Range(NewRow.Parent.ListColumns("Heure").Index).Value = .Time_Issued NewRow.Range(NewRow.Parent.ListColumns("Date Début Validité").Index).Value = .ValidityBeginDate NewRow.Range(NewRow.Parent.ListColumns("Heure Début Validité").Index).Value = .ValidityBeginTime NewRow.Range(NewRow.Parent.ListColumns("Date Fin Validité").Index).Value = .ValidityEndDate NewRow.Range(NewRow.Parent.ListColumns("Heure Fin Validité").Index).Value = .ValidityEndTime NewRow.Range(NewRow.Parent.ListColumns("Secteur vent").Index).Value = .Wind NewRow.Range(NewRow.Parent.ListColumns("Force vent").Index).Value = .Force NewRow.Range(NewRow.Parent.ListColumns("Visibilité").Index).Value = .Visibility NewRow.Range(NewRow.Parent.ListColumns("Ciel").Index).Value = .Ceiling NewRow.Range(NewRow.Parent.ListColumns("Plafond").Index).Value = .Overcast End With End If End Sub
Bonjour Pierre,
C'est impeccable, le fichier marche très très bien avec tes dernières modifications.
Merci infiniment pour ta disponibilité et surtout ton goût du partage.
Bonne journée
MU
Bonsoir Pierre mon sauveur:)
CYQX 141138Z 1412/1512 34010KT 5SM -DZ BR BKN004 OVC008
TEMPO 1412/1415 P6SM NSW SCT008 OVC012 FM141500 06005KT P6SM BKN030
TEMPO 1415/1418 BKN020 BECMG 1416/1418 11012KT FM141800 11012KT P6SM
SCT120 FM150200 13010KT P6SM FEW008 SCT180
PROB40 1502/1512 2SM BR OVC003 RMK NXT FCST BY 141800Z=
J'ai testé toutes les possibilités et tout fonctionne sauf un cas :) celui ci-dessus
1) le jour et l'heure après le FM est écrit différemment c'est à dire:
FM141500 = 14JUIN 15H00
2)Autre chose l'exemple ci-dessus la visibilité est exprimée en "SM" ex: "P6SM" et je voudrais juste extraire le chiffre "6" entre le "P" et le "SM", dès que j'ai la visibilité en "SM" j'aimerais extraire le chiffre entre le "P" et le "SM" pour info c'est toujours écrit de cette manière.
j'aime l'extraire dans la colonne visibilité.
3)Cerise sur le gâteau :) j'aimerais pouvoir faire un tri dans le tableau d'extraction c'est à dire si je mets deux plages horaires exemple 12H17 - 14H55 j'aimerais qu'il m'affiche uniquement les infos entre 12H17 ET 14H55
Par avance merci et bon début de week-end.
MU
Je pense qu'à un moment il faut raison garder.
Ce n'est pas normal de devoir patcher constamment un code informatique pour y faire entrer toutes les exceptions. On n'en sort plus et le code final n'est plus ni lisible ni compréhensible. N'est-il vraiment pas possible de faire en sorte que FM soit suivi d'un espace? Ca n'a pas de sens que certains mots-clés soient suivis d'un espace et pas d'autres. Il deviendrait judicieux de voir d'abord s'il n'y a pas moyen de corriger à la source.
Pour ce qui est de la visibilité, mon code est normalement suffisamment lisible et clair pour que tu vois où il faut modifier et ce qu'il faut adapter. Je me doute, vu la tournure de la discussion, que le vba n'est pas ta tasse de thé, mais il faut pouvoir tendre vers une relative autonomie, à un moment donné. J'ai, je crois, suffisamment expliquer chaque étape de la démarche et de la mise en place du code pour que tu puisses au moins tenter quelque chose par toi-même. Ici, on dépasse l'assistance pour faire du développement (je me fais payer par mes clients pour cela).
Pour ce qui est de l'extraction par plage horaire, je suis très dubitatif, comme je l'étais déjà pour l'exclusion de certains mots-clé. Sauf à avoir des dizaines de milliers de chaines qui produiraient des centaines de milliers de segments, je pense qu'il est plus intéressant de laisser extraire tous les segments par le process actuel, puis d'utiliser Excel et ses outils (filtres, notamment) pour décider de ce que tu prends ou pas. Sinon, ça sert à quoi d'utiliser Excel?
Bonjour Pierre
Je te remercie beaucoup pour ton retour et ton aide depuis le début.
En effet ton code est largement exploitable à l’ heure actuelle sauf le cas 1 et 2 sur mon précédent message qui n’était pas prévu.
En ce qui concerne le FM malheureusement je ne peux pas rajouter un espace.
Je comprends tout à fait ta position.
Merci beaucoup
MU
Je ne comprends pas comment on peut en arriver à avoir des extractions aussi pourries. Après, on s'étonne d'avoir du code fragile, que la maintenance coûte cher et on râle sur... le dernier qui a travaillé sur l'outil, alors qu'on devrait pendre la personne qui a produit des extractions aussi pourries... ;)
Pour le problème de FM, on peut, si on est certain que FM ne se trouve nulle part ailleurs dans un segment avec une autre signification, traiter le problème en remplaçant dans le segment à traiter "FM" par "FM "...
J'ai placé cela dans la procédure Extract, juste avant d'envoyer le segment pour traitement... DataItem = Replace(DataItem, "FM", "FM ").
Pour la visibilité, vu l'architecture du code, il suffit d'aller dans la proc SetVisibility et de traiter ce nouveau cas. Pour ma part, au vu des exceptions, ça commence à devenir du code poubelle...
Au passage, dans le premier segment de la chaine que tu as fournie, je vois 5SM mais pas de P devant. Encore une nouvelle exception pondue par le génie qui a généré les chaines? On ne peut pas lui interdire à vie de toucher à un programme informatique? On gagnerait du temps, je pense... (et je suis sérieux, là).Code:
1
2
3
4
5
6
7
8
9
10
11
12 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 ElseIf Values(Counter) Like "P?SM" Then G.Visibility = Mid(Values(Counter), 2, 1) End If Counter = Counter + 1 Loop End Sub
Pour ce qui est des extractions en fonction de l'heure ou de tout autre considération, je reste sur ma position qu'il faut faire cela après traitement des segments, grâce aux filtres et autres outils d'Excel. Ca n'a pas de sens de réinventer la roue alors qu'Excel dispose de tous les outils nécessaires à l'analyse des données. Ou alors, il ne faut pas utiliser Excel...
Pierre,
Tu as tout à fait raison, et encore une fois je te dis merci.
Je viens de tester le dernier il fonctionne parfaitement.
Avec tous tes codes j'ai largement de quoi faire maintenant, reste plus qu'à...
Tu es the Boss!!!
Je te souhaite un excellent week-end.
MU