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 :

Boucle VBA pour lire des éléments d'une chaine de caractères SQL


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Par défaut Boucle VBA pour lire des éléments d'une chaine de caractères SQL
    Bonjour à tous,

    J'ai 2 TextBoxs, la première qui reçoit une chaine de caractère brute, et la deuxième qui affiche cette même chaîne de caractère mais beaucoup plus agréable et lisible, après un clic sur un bouton.
    Cette chaine de caractère est en fait un code SQL qui provient de MS-ACCESS.

    Je cherche à créer une boucle en VBA qui va lire par exemple tout ce qui se situe entre SELECT et FROM dans la TextBox1 et qui va me l'afficher avec des retours chariots après chaque élément dans la TextBox 2.
    La boucle doit détecter le mot-clé SELECT et s'effectuer tant que le mot-clé "FROM" n'a pas été rencontré. Dès lors que le mot est rencontré, la boucle s'arrête et passe à ce qui se situe entre FROM et WHERE, c'est-à-dire "bouclé" jusqu'à la rencontre du mot clé "WHERE" et ainsi de suite, de manière à dérouler la requête et permettre d'améliorer sa lisibilité.

    Pour l'instant, j'ai réalisé ceci, mais ce n'est pas une solution optimale car je risque de ne pas traiter le cas de certaines requêtes SQL complexes à déchiffrer.

    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
    Sub Test()
     
    ' déclaration des variables
    Dim aFormerSQLString() As String     ' Récupère la chaine SQL non lisible
    Dim astrMotCles(27) As String          ' Variable tableau qui contient les éléments (mots clés, attributs, etc.) de la syntaxe SQL
    Dim intCptSQLString As Integer         ' Entier compteur
    Dim strNewSQLString As String         ' Affiche la chaine SQL lisible
     
     ' Mot Clés de la syntaxe SQL
     astrMotCles(1) = "SELECT"
     astrMotCles(2) = "INTO"
     astrMotCles(3) = "FROM"
     astrMotCles(4) = "WHERE"
     astrMotCles(5) = "GROUP"
     astrMotCles(6) = "HAVING"
     astrMotCles(7) = "ORDER"
     astrMotCles(27) = "INSERT"
     
     ' Attributs placés après l'instruction SELECT
     astrMotCles(8) = "ALL"
     astrMotCles(9) = "DISTINCT"
     astrMotCles(10) = "DISTINCTROW"
     astrMotCles(11) = "TOP"
     astrMotCles(12) = "PERCENT"
     
     ' Attributs de la clause FROM
     astrMotCles(13) = "INNER"
     astrMotCles(14) = "LEFT"
     astrMotCles(15) = "RIGHT"
     
     ' Paramètres de la clause WHERE
     astrMotCles(16) = "AND"
     astrMotCles(17) = "OR"
     astrMotCles(18) = "XOR"
     astrMotCles(19) = "BETWEEN"
     astrMotCles(20) = "IN"
     
     ' Autres mots
     astrMotCles(21) = "AS"
     astrMotCles(22) = "As"
     astrMotCles(23) = "In"
     astrMotCles(24) = "ON"
     astrMotCles(25) = "On"
     astrMotCles(26) = "And"
     
     
        ' Suppression des retours chariots contenus dans la chaine SQL d'origine
        UserForm1.TextBox1.Value = Replace(UserForm1.TextBox1.Value, vbCrLf, " ")
     
        ' Découpe la chaine en fonction des espaces " "
        ' Le résultat de la fonction Split est stocké dans un Tableau appelé aFormerSQLString
        aFormerSQLString = Split(UserForm1.TextBox1.Value, " ")
     
     
    ' Boucle sur le Tbl pour visualiser le résultat
    For intCptSQLString = LBound(aFormerSQLString) To UBound(aFormerSQLString)
     
        ' Conditions sur les éléments de syntaxe du langage SQL
        Select Case aFormerSQLString(intCptSQLString)
     
            Case Is = astrMotCles(1), astrMotCles(2)
                strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & Chr(13)
     
            Case Is = astrMotCles(8), astrMotCles(9), astrMotCles(10), astrMotCles(11), astrMotCles(12)
                strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & Chr(13)
     
            Case Is = astrMotCles(27)
                strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & " " & aFormerSQLString(intCptSQLString + 1) & Chr(13)
                intCptSQLString = intCptSQLString + 1
     
            Case Is = astrMotCles(3), astrMotCles(4), astrMotCles(6)
                strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & Chr(13)
     
            Case Is = astrMotCles(5), astrMotCles(7), astrMotCles(13), astrMotCles(14), astrMotCles(15)
                strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & " " & aFormerSQLString(intCptSQLString + 1) & Chr(13)
                intCptSQLString = intCptSQLString + 1
     
            Case Is = astrMotCles(16), astrMotCles(17), astrMotCles(18), astrMotCles(26)
               strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & " "
     
            Case Is = astrMotCles(19), astrMotCles(20)
               strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & " "
     
            Case Is = astrMotCles(21), astrMotCles(22), astrMotCles(23), astrMotCles(24), astrMotCles(25)
                strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & " "
     
            Case Is = "="
               strNewSQLString = strNewSQLString & aFormerSQLString(intCptSQLString) & " "
     
            Case Else
                strNewSQLString = strNewSQLString & StrConv(aFormerSQLString(intCptSQLString), vbLowerCase) & Chr(13)
     
        End Select
     
    Next intCptSQLString
     
    ' Espace après chaque parenthèse pour améliorer la lisibilité de la chaine SQL
    strNewSQLString = Replace(strNewSQLString, "(", " " + "(" + " ")
    strNewSQLString = Replace(strNewSQLString, ")", " " + ")")
     
     
    UserForm1.TextBox2.Value = strNewSQLString
     
    End Sub

    J'ai tenté avec des Boucles While, mais le résultat n'était pas très concluant...

    Si vous pouviez m'aider, ça serait super !!
    Je vous remercie d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Sosthy10,

    Utilise la fonction Split sur le caractère " " (espace) entre les chaines caractères "SELECT" et "WHERE". Idem entre "WHERE" et ce que tu souhaites... (et ainsi de suite).
    Si tu trouves dans le tableau de sortie les éléments que tu as énuméré dans ton tableau d'entré, ne les prends pas en compte.
    Les autres, te permettront d'avoir les valeurs que tu souhaites, il me semble.

    Voila ce que je ferais !

    Cordialement,
    Kimy

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ou A Bonjour,
    Moi perso j'utiliserais un multipages avec comme. Onglets le type de requête (sélection,ajou,mise a jours,delete)

    Pour la sélection, un liste des champs avec 2 bouton ajouter /mise a jour de la liste, supprime de la liste (*,X) et un texbox.

    Si je click sur la liste je donne au texbox la valeur de la lise et au tag le listeindex.

    La même chose pour la close where champ ,where valeur et where opérateur.

    A la mise a jour des liste gu peux mettre a jour un label.cation avec ta requête au format SQL!

    Tu peux même imaginer que la liste where est alimenté par un combox qui reprends les champs de ta liste, une combobex opérateur (=,<,>,<>),un texteboxe valeur 3 comme case a cocher (texte,numérique,date et un combobox ("","End","Or")

    A arrivé il ne te reste plus qu'à balayer tes listes pour écrire ta requête.

    Attention je n'ai pas parlé du groupe by et order by, etc...
    Dernière modification par Invité ; 10/07/2015 à 18h01.

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour.

    Il faut d'abord commencer par déterminer ce que tu vises comme résultat.

    Est-ce ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT field_1
    FROM table_1
    UNION [ALL]
    SELECT field_a
    FROM table_a
    ;
    ou ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    field_1
    FROM
    table_1
    union
    [all]
    SELECT
    field_a
    FROM
    table_a
    ;

  5. #5
    Membre habitué
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juin 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Juin 2015
    Messages : 8
    Par défaut
    Citation Envoyé par Docmarti Voir le message
    Bonjour.

    Il faut d'abord commencer par déterminer ce que tu vises comme résultat.

    Est-ce ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT field_1
    FROM table_1
    UNION [ALL]
    SELECT field_a
    FROM table_a
    ;
    ou ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    field_1
    FROM
    table_1
    union
    [all]
    SELECT
    field_a
    FROM
    table_a
    ;

    Bonjour Docmarti,

    La forme que je vise est bien la 2ème. (Un saut de ligne après chaque élément, y compris les éléments séparés par une virgule)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    dans mon post précédant, j'étai à coté de la plaque, je vais tenter de me rattraper!
    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
     
    Sub test()
    Sql = SQ & " SLECT Categories.Categories, Fournisseurs.Fournisseurs, Count(Fournisseurs.Fournisseurs) AS CompteDeFournisseurs "
    Sql = Sql & "FROM Categories INNER JOIN Fournisseurs ON Categories.id = Fournisseurs.id "
    Sql = Sql & "WHERE (((Fournisseurs.Fournisseurs) = 'Fournisseurs')) "
    Sql = Sql & "GROUP BY Categories.Categories, Fournisseurs.Fournisseurs "
    Sql = Sql & "HAVING (((Count(Fournisseurs.Fournisseurs))>1));"
     
    t1 = Array("SELECT ", " INTO ", " FROM ", " WHERE ", " GROUP ", " HAVING ", " ORDER ", " INSERT ", " JOIN ", " ALL ", " DISTINCT ", " DISTINCTROW ", " TOP ", " PERCENT ", " INNER ", " LEFT ", " RIGHT ", " AND ", " OR ", " XOR ", " BETWEEN ", " IN ", " AS ", " As ", " In ", " ON ", " On ", " And")
    t2 = Array(Chr(10) & "SELECT ", Chr(10) & " INTO ", Chr(10) & " FROM ", Chr(10) & " WHERE ", Chr(10) & " GROUP ", Chr(10) & " HAVING ", Chr(10) & " ORDER ", Chr(10) & " INSERT ", Chr(10) & " ALL ", Chr(10) & " DISTINCT ", Chr(10) & " DISTINCTROW ", Chr(10) & " TOP ", Chr(10) & " PERCENT ", Chr(10) & " INNER ", Chr(10) & " JOIN ", Chr(10) & " LEFT ", Chr(10) & " RIGHT ", Chr(10) & " AND ", Chr(10) & " OR ", Chr(10) & " XOR ", Chr(10) & " BETWEEN ", Chr(10) & " IN ", Chr(10) & " AS ", Chr(10) & " As ", Chr(10) & " In ", Chr(10) & " ON ", Chr(10) & " On ", Chr(10) & " Andchr(10) & ")
     
    For i = 0 To UBound(t1)
    Sql = Replace(Sql, t1(i), t2(i))
     
    Next
    Sql = Replace(Sql, Chr(10) & Chr(10), "")
    Debug.Print Sql
    End Sub

  7. #7
    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 heu
    Bonjour
    il y a la fonction split sur une chaine de caractères mais si tu doit faire une série il se peut que le count soit différent ce qui peut engendrer des bugs
    je te conseil une astuce toute simple
    dans un array tu met tout des reperes
    et une boucle sur tout les array avec un replace (tontexte,repere(X),repere(x) & vbcrlf )
    le resuktat sera que tu aura un saut de ligne a chaque repere de ton array

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    texte= "roberta select  a pris sa reverse bicyclette pour aller chercher ses select course" 
    texte=replace(replace(texte,"select", vbcrlf),"reverse", vbcrlf) 
    le résultat sera
    roberta
    a pris sa
    bicyclette pour aller chercher ses
    course
    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

  8. #8
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 124
    Par défaut
    Salut

    2 pistes:

    • Ce que tu veux faire s'appelle de parsing, fait quelques recherches ça pourrait te donner des idée je pense.
    • Sinon tu as également les expressions régulières qui permettent un travail plus fin que la fonction Split.


    Bonne soirée

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une autre option est l'utilisation de la fonction Instr qui permet de connaître le début de chaque commande, clause de la requête et la fonction Mid pourra ainsi découper les différents éléments de cette requête.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [XL-2010] Boucle vba pour classer des critères
    Par RomBon dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 19/08/2014, 09h33
  2. Code vba pour créer des éléments de formulaires
    Par Novice_vba dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/02/2014, 09h00
  3. JAR utilisé pour lire des fichiers par une application
    Par flow10000 dans le forum Entrée/Sortie
    Réponses: 22
    Dernier message: 12/05/2013, 22h54
  4. Fonction pour lire des fichiers dans une archive MPQ
    Par MegaBigBoss dans le forum Débuter
    Réponses: 0
    Dernier message: 28/01/2012, 22h02
  5. Réponses: 10
    Dernier message: 20/02/2008, 11h57

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