IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Décoder messages sous VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    Merci beaucoup à tous les deux pour vos propositions.


    Cependant nouvelle extraction ce matin avec un deuxième cas de figure que j'ai complètement omis de prendre en compte:

    100500Z 1006/1112 25007KT CAVOK PROB30 TEMPO 1006/1008
    VRB03KT BKN008 PROB40 TEMPO 1008/1011 4000 RA BKN020 BKN060TCU BECMG
    1011/1014 SCT025 TEMPO 1014/1018 24012G22KT -SHRA SCT030CB
    BECMG 1018/1021 VRB03KT CAVOK BECMG 1104/1106 BKN006 PROB40
    TEMPO 1106/1108 BKN012 BECMG 1108/1111 17007KT SCT025=



    Splitter en plusieurs groupes:

    Groupe1
    100500Z 1006/1112 25007KT CAVOK ("CAVOK"= 9999 représente la visibilité parfois il est codé de cette manière)

    Groupe2
    PROB30 TEMPO 1006/1008 VRB03KT BKN008 (VRB=000 représente "secteur vent" parfois il est codé de cette manière)


    Groupe3
    PROB40 TEMPO 1008/1011 4000 RA BKN020 BKN060TCU (ici j'ai deux BKN contrairement au premier cas de figure je dois tout de même effecter le calcul pour le "ciel" (BKN020 = 20 X 100 =2000) (BKN060TCU=60X100=6000)

    Groupe4
    BECMG 1011/1014 SCT025 (ce cas de figure je n'ai pas de "vent ni de visibilité" ni de "ciel" donc doit être ignoré car l'info n'est pas intéressante à traiter, il faut savoir que dans chaque groupe je cherche à extraire et traiter l'info vent, force, visibilité et ciel c'est principalement ce que je recherche dans chaque groupe.

    Groupe5
    TEMPO 1014/1018 24012G22KT -SHRA SCT030CB (ici j'ai uniquement l'info vent "24012G22KT" cela m'intéresse je le splitte comme suit: secteur vent = 240, force vent=22 étant donné qu'il y a un "G" je dois le splitter de cette manière

    Groupe6
    BECMG 1018/1021 VRB03KT CAVOK (VRB03KT = secteur vent =000 force=3; visibilité "CAVOK"=9999

    Groupe7
    BECMG 1104/1106 BKN006 (Pas d'info vent ni visibilité mais j'ai une info "CIEL" que je dois traiter (BKN006 = 6X100= 600)

    Groupe8
    PROB40TEMPO 1106/1108 BKN012 (doit être ignoré car commençant par PROB40 TEMPO)

    Groupe9
    BECMG 1108/1111 17007KT SCT025= (Je traite uniquement l'info vent =secteur vent=170, force vent=7


    Pierre,

    y aurait-il possibilité d'adapter ton code pour prendre en compte le cas de figure ci-dessus s'il te plaît?
    Est ce possible de faire un code sans tenir compte des positions dans les groupes qui sont amenées à changer selon les extractions?

    Les seules positions qui ne changeront pas sont les mots-clés "PROB30, PROB40 TEMPO, BECMG etc... qui seront toujours suivis par la date et l'heure (ex:BECMG 1108/1111 ; PROB40 TEMPO 1106/1108 ...)

    J'ai essayé de faire marcher ton code avec cette nouvelle extraction mais cela ne fonctionne pas étant donné que certaines positions dans les groupes ont changé et nous n'avions pas pris en compte ce nouveau cas de figure.

    Par avance merci beaucoup.
    Mu

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Ok.

    A mon avis, il faudra mettre les chaines quotidiennes dans un tableau avec la date devant et on pourra alors traiter la chaine complète. A toi de préciser ce que sont les OVC et les SCT comme types de données... Pour savoir quand il faut les gérer, on peut le faire après, et les extraire comme les autres l'ont été. De toute façons, c'est peanuts de devoir tenir compte de cela car cela se fera dans le tableau Excel final.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    Pierre,

    En effet j'ai oublié de préciser, les OVC sont de la même famille que les BKN, de ce fait nous pouvons les extraire dans la colonne "CIEL".

    Concernant le Groupe1 je viens de voir qu'il y aurait une possibilité de mettre un code quatre lettres devant pour faciliter l'identification ex: LFPO 081544Z 0818/0824 23015KT 9999 SCT020 TN18/2608Z TX26/2617Z
    Cependant le code quatre lettres ne sera jamais identique et variera en fonction des messages reçus.

    qu'en penses-tu?

    Merci
    Mu

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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à).

    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...
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    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

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    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

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    L'avantage de la programmation par modules comme je l'ai proposée, c'est que tu as peu de choses à modifier pour adapter chaque situation

    Par contre, il faudrait définir quand tu as une donnée "Visibility". Parfois c'est CADOK et parfois c'est une suite de 4 chiffres? initialement, je positionnais la visibilité après KT mais apparemment, au vu du deuxième groupe que tu as mentionné, ce n'est pas le cas. Il serait intéressant que tu détailles comment chaque propriété est définie. Une suite de quatre chiffres encadrés par des espaces ou en fin de chaine représente-t-elle toujours la visibilité?

    Pour le vent, il "suffit" de modifier setWindForce mais comme on a plusieurs cas de figure et que tu dévoiles de nouveaux cas au fur et à mesure, il sera peut-être intéressant de travailler en créant un array des blocs et en passant l'array plutôt que le segment. Je l'ai fait pour le vent, il faudra voir si c'est payant de généraliser.(pas testé car en attente de la suite). Quoi qu'il en soit, c'est toujours dans les petites procédures qui traitent une propriété que cela se joue, quelle que soit la manière d'extraire les données à l'intérieur de chaque procédure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Sub SetWindForce(ByRef G As Group, ByVal Values)
      Dim Pos As Long
      Dim Value As String
      Dim Counter As Long
     
      Do While Counter <= UBound(Values) And Value = ""
        If InStr(1, Values(Counter), "KT") > 0 Then Value = Values(Counter)
        Counter = Counter + 1
      Loop
      If Value <> "" Then
        Pos = InStr(1, Value, "VRB")
        If Pos > 0 Then
          G.Wind = "000"
          G.Force = Mid(Value, Pos + 3, 2)
        ElseIf InStr(1, Value, "G") Then
          G.Wind = Left(Value, 3)
          G.Force = Mid(Value, InStr(1, Value, "G") + 1, 2)
        Else
          Pos = InStr(1, Value, "KT")
          If Pos > 0 Then
            G.Wind = Mid(Value, Pos - 5, 3)
            G.Force = Mid(Value, Pos - 2, 2)
          End If
        End If
    End Sub
    Dans le groupe 3, tu as donc 2BKN. Tu peux en avoir plus que deux? Le premier n'est pas suffixé, le second l'est avec CTU... Ca a une importance?

    Groupe 4 , on ne traite pas à ce stade, on verra après

    Groupe5, il faut juste adapter la procédure setWindForce (ok, voir groupe 2, je suppose)


    Groupes suivants: Ok, à mon avis, pas traités à ce stade

    Pour ce qui est des OVC à extraire dans certains cas, pour moi, on les extrait dans tous les cas et on voit en Excel après... Peux-tu me dire à quoi ça correspond (terminologie)? => Plafond? Autre chose? Quoi qu'il en soit, ce sera un SetOvc(...) qui règlera l'affaire... Il faut ajouter la variable dans le type personnalisé, et il faut ajouter le transfert dans Excel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SetOvc(ByRef G As Group, ByVal Data As String)
      Dim Pos As Long
     
      Pos = InStr(1, Data, "OVC")
      If Pos > 0 Then G.OVC = Mid(Data, Pos + 3, 3)
    End Sub



    Peux-tu donner les réponses à ces questions?


    Il faudrait aussi essayer de donner un segment avec les données complètes que l'on peut avoir. As-tu d'autres infos à communiquer?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    Pierre,

    tu trouveras ci-après les réponses à tes questions, en te remerciant:

    Par contre, il faudrait définir quand tu as une donnée "Visibility". Parfois c'est CAVOK et parfois c'est une suite de 4 chiffres? initialement, je positionnais la visibilité après KT mais apparemment, au vu du deuxième groupe que tu as mentionné, ce n'est pas le cas. Il serait intéressant que tu détailles comment chaque propriété est définie. Une suite de quatre chiffres encadrés par des espaces ou en fin de chaine représente-t-elle toujours la visibilité?

    Oui concernant la visibilité, c'est à chaque fois une suite de quatre chiffres ou du "CAVOK" qui est égal à "9999"


    Dans le groupe 3, tu as donc 2BKN. Tu peux en avoir plus que deux? Le premier n'est pas suffixé, le second l'est avec CTU... Ca a une importance?
    oui je peux en avoir plus que deux et le suffixe n'a aucune importance (CTU doit être ignoré).

    Pour ce qui est des OVC à extraire dans certains cas, pour moi, on les extrait dans tous les cas et on voit en Excel après... Peux-tu me dire à quoi ça correspond (terminologie)? => Plafond? Autre chose? Quoi qu'il en soit, ce sera un SetOvc(...) qui règlera l'affaire... Il faut ajouter la variable dans le type personnalisé, et il faut ajouter le transfert dans Excel.

    OVC "overcast" c'est du plafond
    BKN "broken" c'est du plafond
    NSC "non significant cloud" c'est du plafond
    SCT "scatered"= doit être ignoré
    FEW = doit être ignoré


    Ci-après quelques exemples d'extraction de ce matin:

    101100Z 1012/1112 32012KT 9999 FEW030 BECMG 1019/1021
    33007KT TEMPO 1021/1106 BKN030 BECMG 1106/1109 35017KT TEMPO
    1109/1112 34020G30KT=

    101105Z 1012/1112 VRB05KT 9999 FEW030 TEMPO 1012/1020
    17010KT FEW020 BKN035=

    101100Z 1012/1112 VRB06KT 9999 FEW035 TX18/1014Z
    TN08/1106Z PROB40 TEMPO 1012/1019 32010KT SCT030TCU TEMPO
    1102/1108 3000 -RA BR BKN010 BECMG 1107/1109 01010KT=


    101100Z 1012/1112 35007KT 9999 FEW025 TEMPO 1015/1019
    VRB03KT -SHRA SCT020CB PROB40 TEMPO 1016/1019 5000 SHRA=


    Cordialement,
    MU

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Peux-tu avoir en même temps un (des) BKN et d'autres plafonds? Je suppose que non pour un même segment... As-tu besoin du type de plafond (BKN, OVC, ...)?
    Comment comptes-tu analyser les résultats lorsque tu as plusieurs bkn? Les mettre dans différentes colonnes du tableau reprenant les données de chaque "groupe" ne me semble guère productif pour les analyser? Faut-il aussi multiplier les autres plafonds par 100? Je suppose que oui.

    Tu sembles avoir la main sur certaines possibilités d'extraction...Sais-tu par exemple modifier les données pour que ce qui les identifie arrive en tête? Parfois, tu as la donnée après son identifiant (BKN, ...) parfois après (190.07KT)... Ce serait évidemment plus pratique s'il y avait une certaine norme...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    Peux-tu avoir en même temps un (des) BKN et d'autres plafonds?
    Comment comptes-tu analyser les résultats lorsque tu as plusieurs bkn? Les mettre dans différentes colonnes du tableau reprenant les données de chaque "groupe" ne me semble guère productif pour les analyser? Faut-il aussi multiplier les autres plafonds par 100? Je suppose que oui.

    Je dois prendre en compte le plus restrictif des plafonds "BKN ou OVC", il se peut dès fois que je n'en ai pas du tout voire marqué "NSC" , si pas de plafond on peut mettre une valeur nulle "0".

    Pour répondre plus précisément à ta question si j'ai deux "BKN" dans un même groupe je dois considérer la plus petite valeur (ex=BKN020 (20 X100=2000) et BKN060TCU (60X100=6000) = plus petite des deux 2000



    Tu sembles avoir la main sur certaines possibilités d'extraction...Sais-tu par exemple modifier les données pour que ce qui les identifie arrive en tête? Parfois, tu as la donnée après son identifiant (BKN, ...) parfois après (190.07KT)... Ce serait évidemment plus pratique s'il y avait une certaine norme...


    Cependant je n'ai pas la main pour faire une modif telle que décrite ci-dessus.

    Merci pour tout
    MU

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Muret31 Voir le message
    [...]

    Je dois prendre en compte le plus restrictif des plafonds "BKN ou OVC", il se peut dès fois que je n'en ai pas du tout voire marqué "NSC" , si pas de plafond on peut mettre une valeur nulle "0".

    Pour répondre plus précisément à ta question si j'ai deux "BKN" dans un même groupe je dois considérer la plus petite valeur (ex=BKN020 (20 X100=2000) et BKN060TCU (60X100=6000) = plus petite des deux 2000[...]
    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?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Et le type de plafond, tu en as besoin?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    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

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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

    Nom : 2019-06-10_191623.png
Affichages : 188
Taille : 48,9 Ko

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    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

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    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

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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...

    Nom : 2019-06-10_213046.png
Affichages : 134
Taille : 10,9 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #20
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    "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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/06/2009, 14h05
  2. Réponses: 8
    Dernier message: 07/10/2004, 11h08
  3. (VBA-A] Requete access sous VBA
    Par vanima dans le forum VBA Access
    Réponses: 12
    Dernier message: 20/07/2004, 16h07
  4. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39
  5. Réponses: 7
    Dernier message: 29/10/2002, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo