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 Décoder messages sous VBA
    Bonjour le forum
    Ayant toujours trouvé de l’aide sur ce forum, je reviens cette fois-ci avec un nouveau sujet, en effet je cherche via une macro VBA à décoder le message ci-dessous:

    081544Z 0818/0824 23015KT 9999 SCT020 TN18/2608Z TX26/2617Z BECMG 0822/0824 29007KT 5000 BECMG 0906/0908 35005KT 7000 BKN020 PROB30 TEMPO 0912/0914 19010KT 9999 OVC010 TEMPO 0922/0924 12005KT =
    La façon dont je souhaiterais le décoder par VBA:

    081544Z 0818/0924 23015KT 9999 SCT020 TN18/2608Z TX26/2617Z =
    Groupe1
    Date issued= 08JUIN
    Time issued = 15h44
    Date de début de validité = 08JUIN
    Heure de début de validité = 18h00
    Date de fin de validité = 09JUIN
    Heure de fin de validité = 24h00
    wind=230
    Force=15
    Visibility=9999

    BECMG 0822/0824 29007KT 5000=
    Groupe2
    BECMG
    08Juin
    22h00
    08Juin
    24h00
    wind=290
    Force=07
    Visibility=5000

    BECMG 0906/0908 35005KT 7000 BKN020 =
    Groupe3
    BECMG
    09Juin
    06h00
    09Juin
    08h00
    wind=350
    Force=05
    Visibility= 7000
    Ceiling= 2000 (BKN020 = 20x100=2000)

    PROB30 TEMPO 0912/0914 19010KT 9999 OVC010 =
    Groupe4
    PROB30 TEMPO 0912/0914 19010KT 9999 OVC010 (message non décodé car le groupe commence par PROB30 TEMPO)

    TEMPO 0922/0924 12005KT =
    Groupe5
    TEMPO
    09Juin
    22h00
    09Juin
    24h00
    wind=120
    Force=05
    Le groupe 1 commence toujours de la même manière « Date, Time of issue, heure etc... » le groupe 1 s’arrête dès qu’il y a un mot clé (voir ci-dessous)

    Les mots-clés suivants annoncent à chaque fois un changement de groupe « BECMG ou PROB40 ou PROB30 ou PROB30 TEMPO ou PROB40 TEMPO ou TEMPO ou FM »

    Dans les groupes ci-dessus, deux doivent être ignorés « PROB30 TEMPO et PROB40 TEMPO », donc inutile de les décoder.

    Voir plus haut: dans l’exemple ci-dessus le Groupe4 n’a pas été décodé.

    Par avance merci beaucoup.

    Bien cordialement
    MU

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    en fait si tu regarde bien la structure de ta chaine et le résultat que tu souhaite obtenir tu donne toi même la réponse

    commence par splitter ta chaine par les chaines alpha que tu désigne
    et re split les segments par les espace
    le reste te sera facile
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  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
    Bonjour Patrick
    Je te remercie pour ton retour.
    Je suis complètement à l’arrêt j’ai essayé plusieurs solutions en vain, aurais-tu un code à me proposer stp?
    Par avance 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
    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...
    "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
    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

  6. #6
    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 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

  7. #7
    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
    Salut.

    Il faudrait déjà trouver ce qui permet de créer les groupes. Apparemment, ils ne sont pas de longueurs identiques. Dès lors, quelle est la logique pour découper les groupes?

    A partir de là, il sera possible de couper l'info complète en segments et, comme le dit Patrick, de récupérer les infos séparées par les espaces puis les traiter.

    Peux-tu donner la "syntaxe" de tes informations?
    "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...
    ---------------

  8. #8
    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 Patrick,

    Merci pour ton retour.

    En effet comme mentionné plus haut les groupes ne dépendent pas de la longueur des syntaxes mais des mots clés :

    Les mots-clés suivants annoncent à chaque fois un changement de groupe « BECMG ou PROB40 ou PROB30 ou PROB30 TEMPO ou PROB40 TEMPO ou TEMPO ou FM »

    Par avance merci.
    Mu

  9. #9
    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
    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...
    "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...
    ---------------

  10. #10
    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 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:

    Nom : EXEMPLE.png
Affichages : 133
Taille : 13,0 Ko

    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

  11. #11
    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
    Moi, c'est Pierre... Ca me ferait plaisir qu'on ne confonde pas.

    Oups, je n'avais pas lu ton message en entier. Désolé. C'est qui l'inventeur génial de cette extraction ? Il faudrait un caractère spécifique pour séparer les blocs. C'est encore un stagiaire qui a pondu n'importe quoi?

    Ton premier groupe ne commence pas par un des sigles que tu renseignes. Est-ce normal?

    @Patrick

    Citation Envoyé par patricktoulon Voir le message
    [...]

    commence par splitter ta chaine par les chaines alpha que tu désigne[...]
    Vachement curieux de voir comment tu vas splitter les segments alors que les mots-clé sont différents et que leur ordre d'apparition n'est pas défini. Mais bien sûr yaka faire comme tu dis. Dingue
    "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...
    ---------------

  12. #12
    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,

    Désolé de t’avoir confondu en effet j’avais bien identifié ton prénom 😉.

    Le premier groupe commence toujours par la date et l’heure: 081544Z (ex: 08juin 15h44) c’est par la suite qu’il faudra intégrer les séparateurs de groupe pour le 2, 3, 4 etc... (BECMG, PROB30 TEMPO, PROB40 TEMPO, TEMPO etc...)

    Par avance merci.
    Mu

  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
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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 : 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
    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
    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...
    ---------------

  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
    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

  15. #15
    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
    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

  16. #16
    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 d'abord une histoire de réflexion et de mise en place d'outils. Je facilite le travail en plaçant les mots-clé dans une table de données et en les triant. Le tri a ici toute son importance! Il faut commencer par les mots-clé qui en incluent d'autres. Pour faciliter la démarche, j'ai également mis la chaine complète dans un tableau. Je donne le code pour une chaine, mais il suffira de boucler sur les chaines présentes dans le tableau pour réaliser le travail sur un groupe de chaines.

    Nom : 2019-06-10_075609.png
Affichages : 315
Taille : 6,7 Ko


    Extraire les séquences

    On n'a pas de séparateur facile pour le split? On en crée un en complétant les mots-clé par un séparateur défini. Comme certains mots-clé en contiennent d'autres, il faut les remplacer dans un ordre spécifique (par exemple, Prob30 Tempo avant Prob30 et Tempo).

    On a besoin d'une fonction qui renvoie un array concernant les séquences. Elle reçoit la chaîne à découper, un tableau (array) avec les mots-clé dans le bon ordre et un séparateur unique). La difficulté ici réside dans le fait que certains mots-clé en composent d'autres (Tempo => PROB30 TEMPO). L'astuce consiste donc à remplacer chaque mot-clé par un générique incrémenté. On va le faire précéder du séparateur choisi (ici, le ; ) ET on va remplacer l'espace des mots-clé composés par un _. Puis on remplace les mots-clé génériques incrémentés par leur valeur de début (avec le _ à la place de l'espace pour les mots-clé composés). Attention qu'à ce stade les mots-clé composés conservent le underscore. C'est important pour la suite afin de retrouver plus facilement le mot-clé en début de séquence. C'était la partie la plus complexe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function getDatas(ByVal Value As String, ByVal Separators, ByVal separator As String)
      Dim Cell As Range
      Dim Counter As Long
     
      For Counter = 1 To Range("t_Bornes[borne]").Count
        Value = Replace(Value, Range("t_Bornes[borne]")(Counter).Value, separator & "Group" & Counter)
      Next
      For Counter = 1 To Range("t_Bornes[borne]").Count
        Value = Replace(Value, "Group" & Counter, Replace(Range("t_Bornes[borne]")(Counter).Value, " ", "_"))
      Next
      getDatas = Split(Value, separator)
    End Function
    Extraire les données d'un segment

    On va d'abord créer un type personnalisé pour récupérer les données de chaque segment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Type Group
      Ceiling As Long
      Date_Issued As String
      Force As Long
      KeyWord 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
    L'idée est de traiter chaque segment dans une boucle en créant un Group (la variable perso) puis en lui affectant les valeurs.
    Vu que les segments ne sont pas séquencés de la même manière, on va créer une procédure pour chaque partie à extraire. Chaque procédure recevra un Group en ByRef et lui affectera les données qui le concernent.

    Par exemple, pour le vent, on crée la procédure suivante, qui reçoit une variable Group et son segment pour valoriser Wind et Force. On effectuera la même démarche pour les autres données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub SetWindForce(G As Group, ByVal Data As String)
      Dim Pos As Long
      Dim Value As String
     
      Pos = InStr(Data, "KT")
      If Pos > 0 Then
        G.Wind = Mid(Data, Pos - 5, 3)
        G.Force = Mid(Data, Pos - 2, 2)
      End If
    End Sub
    Pour les mots-clé et les validités, il a fallu tenir compte de la position du segment dans le tableau, puisque le segment 1 n'a pas de mot-clé. On n'extrait donc pas le mot-clé pour ce segment, et la position des validités est différente dans le segment 1 par rapport aux autres segments. On voit ici qu'il est important de d'abord définir la position du groupe dans la chaine de départ car on se sert de cela pour extraire ces données.
    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
    Sub SetKeyWord(ByRef G As Group, ByVal Data As String)
      If G.Position > 1 Then G.KeyWord = Replace(Left(Data, InStr(1, Data, " ") - 1), "_", " ")
    End Sub
     
    Sub setValidities(ByRef G As Group, ByVal Data As String)
      Dim Pos As Long
     
      If G.Position = 1 Then
        Pos = 1
      Else
        Pos = InStr(1, Data, " ") + 1
      End If
      With G
        .ValidityBeginDate = Mid(Data, Pos, 2)
        .ValidityBeginTime = Mid(Data, Pos + 2, 2) / 24
        .ValidityEndDate = Mid(Data, Pos + 5, 2)
        .ValidityEndTime = IIf(Mid(Data, Pos + 7, 2) = "24", TimeSerial(23, 59, 59), Mid(Data, Pos + 7, 2) / 24)
      End With
    End Sub
    Dès lors, valoriser la variable de type Groupe revient à appeler les différentes procédures permettant d'extraire une donnée spécifique du segment. Ce que fait la fonction qui reçoit un segment et sa position et qui retourne une variable Group valorisée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function getGroup(ByRef Data, ByVal IssuedDate As String, IssuedTime As Date, ByVal Position) As Group
      Dim G As Group
     
      G.Position = Position
      G.Date_Issued = IssuedDate
      G.Time_Issued = IssuedTime
      SetCeiling G, Data
      SetKeyWord G, Data
      setValidities G, Data
      SetVisibility G, Data
      SetWindForce G, Data
      getGroup = G
    End Function


    A la fin, on a un tableau de Group et on en fait ce qu'on veut. Ici, je les ai poussés dans une table de données. Pour ce transfert, je n'ai pas fait dans la dentelle, il y a plus pro. Ici, c'est juste à titre exemplatif que j'ai réalisé cette partie du code, pour visualiser les extractions et les vérifier.

    Nom : 2019-06-10_105428.png
Affichages : 332
Taille : 11,7 Ko


    Il reste quelques questions:
    • Est-ce normal que le premier groupe n'ait pas de mot-clé?
    • Les OVC et SCT ne doivent pas être extraits? S'ils doivent l'être, il faudra procéder comme pour l'extraction des autres données;
    • Pour les dates, comment détermines-tu le mois de juin et l'année?


    Tu devras adapter le traitement en fonction des réponses que tu fourniras.

    Attention!! Ce code est donné à des fins pédagogiques. A toi à le compléter et surtout à le tester avec des jeux de donnés réelles pour débusquer les éventuels soucis, cas non présents dans l'unique chaine donnée ici, etc, etc...




    Voici le code actuel du traitement:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    Option Explicit
     
    Public Type Group
      Ceiling As Long
      Date_Issued As String
      Force As Long
      KeyWord 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
     
    Function getArrayFromCells(Cells As Range)
      Dim Counter As Long
      Dim t()
     
      ReDim t(1 To Cells.Count)
      For Counter = 1 To UBound(t)
        t(Counter) = Cells(Counter).Value
      Next
      getArrayFromCells = t
    End Function
     
    Sub Extract()
      Dim Separators
      Dim Data As String
      Dim Datas
      Dim IssuedDate As String
      Dim IssuedTime As Date
      Dim Counter As Long
      Dim NewGroup As Group
      Dim Groups() As Group
     
      Data = Feuil2.Range("a2").Value
      IssuedDate = Left(Data, 2)
      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
    End Sub
     
    Sub PutGroupsInTable(ByRef Groups() As Group)
      Dim Counter As Long
     
      For Counter = LBound(Groups) To UBound(Groups)
        PutGroupInTable Groups(Counter)
      Next
    End Sub
     
    Sub PutGroupInTable(Group As Group)
      Dim NewRow As ListRow
     
      Set NewRow = Range("t_Groupes").ListObject.ListRows.Add()
      With Group
        NewRow.Range(1).Value = .Position
        NewRow.Range(2).Value = .KeyWord
        NewRow.Range(3).Value = .Date_Issued
        NewRow.Range(4).Value = .Time_Issued
        NewRow.Range(5).Value = .ValidityBeginDate
        NewRow.Range(6).Value = .ValidityBeginTime
        NewRow.Range(7).Value = .ValidityEndDate
        NewRow.Range(8).Value = .ValidityEndTime
        NewRow.Range(9).Value = .Wind
        NewRow.Range(10).Value = .Force
        NewRow.Range(11).Value = .Visibility
        NewRow.Range(12).Value = .Ceiling
      End With
     
    End Sub
     
    Function getDatas(ByVal Value As String, ByVal Separators, ByVal separator As String)
      Dim Cell As Range
      Dim Counter As Long
     
      For Counter = 1 To Range("t_Bornes[borne]").Count
        Value = Replace(Value, Range("t_Bornes[borne]")(Counter).Value, separator & "Group" & Counter)
      Next
      For Counter = 1 To Range("t_Bornes[borne]").Count
        Value = Replace(Value, "Group" & Counter, Replace(Range("t_Bornes[borne]")(Counter).Value, " ", "_"))
      Next
      getDatas = Split(Value, separator)
    End Function
     
    Function getGroup(ByRef Data, ByVal IssuedDate As String, IssuedTime As Date, ByVal Position) As Group
      Dim G As Group
     
      G.Position = Position
      G.Date_Issued = IssuedDate
      G.Time_Issued = IssuedTime
      SetCeiling G, Data
      SetKeyWord G, Data
      setValidities G, Data
      SetVisibility G, Data
      SetWindForce G, Data
      getGroup = G
    End Function
     
    Sub SetCeiling(ByRef G As Group, ByVal Data As String)
      Dim Pos As Long
     
      Pos = InStr(1, Data, "BKN")
      If Pos > 0 Then G.Ceiling = Mid(Data, Pos + 4, 2) * 100
    End Sub
     
    Sub SetKeyWord(ByRef G As Group, ByVal Data As String)
      If G.Position > 1 Then G.KeyWord = Replace(Left(Data, InStr(1, Data, " ") - 1), "_", " ")
    End Sub
     
    Sub setValidities(ByRef G As Group, ByVal Data As String)
      Dim Pos As Long
     
      If G.Position = 1 Then
        Pos = 1
      Else
        Pos = InStr(1, Data, " ") + 1
      End If
      With G
        .ValidityBeginDate = Mid(Data, Pos, 2)
        .ValidityBeginTime = Mid(Data, Pos + 2, 2) / 24
        .ValidityEndDate = Mid(Data, Pos + 5, 2)
        .ValidityEndTime = IIf(Mid(Data, Pos + 7, 2) = "24", TimeSerial(23, 59, 59), Mid(Data, Pos + 7, 2) / 24)
      End With
    End Sub
     
    Sub SetVisibility(ByRef G As Group, ByVal Data As String)
      Dim Pos As Long
     
      Pos = InStr(1, Data, "KT")
      If Pos > 0 And Pos < Len(Data) - 6 Then G.Visibility = Mid(Data, Pos + 3, 4)
    End Sub
     
    Sub SetWindForce(ByRef G As Group, ByVal Data As String)
      Dim Pos As Long
     
      Pos = InStr(1, Data, "KT")
      If Pos > 0 Then
        G.Wind = Mid(Data, Pos - 5, 3)
        G.Force = Mid(Data, Pos - 2, 2)
      End If
    End Sub

    Reste à déterminer comment on fixe le mois et l'année pour récupérer des dates intéressantes et exploitables.
    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...
    ---------------

  17. #17
    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 pour ton retour et ta proposition très intéressante.

    Tu trouveras ci-après les réponses à tes questions:

    Est-ce normal que le premier groupe n'ait pas de mot-clé?
    Oui tout à fait le premier groupe n'a jamais de mot-clé on le reconnaît par le début de la syntaxe (date+heure)

    Les OVC et SCT ne doivent pas être extraits? S'ils doivent l'être, il faudra procéder comme pour l'extraction des autres données;
    Les OVC doivent être extraits seulement s'ils sont précédés de "PROB30, PROB40, BECMG, TEMPO, FM) uniquement et doivent être ignorés s'ils sont précédés de "PROB30 TEMPO et PROB40 TEMPO"

    Les SCT ne sont jamais extraits.


    Pour les dates, comment détermines-tu le mois de juin et l'année?

    Etant donné que c'est un message reçu tous les jours, nous devons considérer la date, le mois et l'année en cours au moment de la réception.
    Exemple Groupe1:
    081544Z 0818/0824 23015KT 9999 SCT020 TN18/2608Z TX26/2617Z ( time of issue 08juin 15H44)


    J'espère avoir répondu à tes question et reste à ta dispo pour toute info complémentaire.

    Je teste ta proposition de suite et reviens vers toi rapidement.

    Merci encore,
    Mu

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour pierre
    Vachement curieux de voir comment tu vas découper tes segments à coup de Split.
    en premier lieu déterminer les séparateurs
    pour cela nous avons déjà un problèmes avec les expressions simples et composées du genre (pro30 /pro30 tempo/tempo)
    il nous faut donc redéfinir ses séparateurs
    ensuite a ses séparateurs il faut ajouter un caractère unique qui servira de point de repère pour le split global de la chaine en un coup !!


    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
    Sub TEST()
     'la chaine
    chaine = "081544Z 0818/0824 23015KT 9999 SCT020 TN18/2608Z TX26/2617Z BECMG 0822/0824 29007KT 5000 BECMG 0906/0908 35005KT 7000 BKN020 PROB30 TEMPO 0912/0914 19010KT 9999 OVC010 TEMPO 0922/0924 12005KT = "
    '
    'l'array tel quel
    sep = Array("PROB30 TEMPO", "PROB40 TEMPO", "BECMG", "PROB40", "PROB30", "TEMPO", "FM")
    '
    'la redéfinition des separateurs et remplacement dans la chaine par les new séparateurs
    For i = LBound(sep) To UBound(sep)
    chaine = Replace(chaine, " " & sep(i), "*" & Replace(sep(i), " ", "_"))
    sep(i) = " " & Replace(sep(i), " ", "_") & " "
    Next
    'résultat
    Debug.Print "Array transformé : "
    Debug.Print Join(sep, "|")
    Debug.Print "-------------------"
    Debug.Print "les lignes"
    Debug.Print Join(Split(chaine, "*"), vbCrLf)
    End Sub
    Nom : Capture.JPG
Affichages : 338
Taille : 121,8 Ko

    REMARQUE importante : tout les expressions composées sont en premier dans l'array

    en version simplifiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub TEST()
    'la chaine
    chaine = "081544Z 0818/0824 23015KT 9999 SCT020 TN18/2608Z TX26/2617Z BECMG 0822/0824 29007KT 5000 BECMG 0906/0908 35005KT 7000 BKN020 PROB30 TEMPO 0912/0914 19010KT 9999 OVC010 TEMPO 0922/0924 12005KT = "
    'l'array tel quel
    sep = Array("PROB30 TEMPO", "PROB40 TEMPO", "BECMG", "PROB40", "PROB30", "TEMPO", "FM")
    'la redéfinition des separateurs et remplacement dans la chaine par les new separateurs
    For i = LBound(sep) To UBound(sep)
    chaine = Replace(chaine, " " & sep(i), "*" & Replace(sep(i), " ", "_"))
    Next
    'résultat
    Debug.Print "les lignes"
    Debug.Print Join(Split(chaine, "*"), vbCrLf)
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  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
    Citation Envoyé par patricktoulon Voir le message
    [...]
    Tout cela a déjà été dit, c'est la solution que j'ai proposée ce matin... C'est assez facile de venir après pour dire la même chose... Tu vas faire le perroquet?
    "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
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    c'est comme ca que je l'entendais depuis le début
    je n'ai pas regardé tes propositions j'ai juste vu des captures de TS (j'ai pas voulu te suivre sur ce chemin)
    tu m'a dis je suis curieux ben voila
    je fait sans TS
    sans vouloir t'offenser je n'ai pas eu besoins de toi sur ce coup la instr,instrrev,mid,split,etc... je pense savoir les utiliser et en exploiter les capacités
    et ca n'est pas le premier exercice du même genre (avec une chaine complètement désordonné et ou aucun repère)que l'on voit

    edit:

    bon je viens de lire ta proposition et effectivement on a le même raisonnement sur les expression composées qui doivent être en premier replacées
    c'est la tout le principe en fait

    et même si on voulais pas trier les expressions sachant qu'il y a les 2 simples pour une composée on remplace les doubles caractères déterminant les repères du split par un seul
    dans cet exemple je vais jusqu'à 3 mots pour une expression pouvant déterminer un groupe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TEST()
    'la chaine
    chaine = "081544Z 0818/0824 23015KT 9999 SCT020 TN18/2608Z TX26/2617Z BECMG 0822/0824 29007KT 5000 BECMG 0906/0908 35005KT 7000 BKN020 PROB30 TEMPO 0912/0914 19010KT 9999 OVC010 TEMPO 0922/0924 12005KT = "
    'l'array tel quel
    sep = Array("BECMG", "PROB40", "PROB30", "TEMPO", "FM", "PROB30 TEMPO", "PROB40 TEMPO")
    'remplacement ses expressions par une Etoile et remplacement des multiples Etoiles obtenues par une seule (expression jusqu'à 3 mots )
    For i = LBound(sep) To UBound(sep)
    chaine = Replace(Replace(Replace(chaine, sep(i), "*"), "* *", "*"), "* * *", "*")
    Next
    'résultat
    Debug.Print Join(Split(chaine, "*"), vbCrLf)
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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