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 :

Comment analyser et modifier un fichier texte (Microsoft Query) via VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut Comment analyser et modifier un fichier texte (Microsoft Query) via VBA
    Salut,

    j'ai des définitions de SQL Microsot Query (extension .dqy) que je voudrais modifier en VBA excel, essentiellement pour modifier la clause WHERE en fonction des besoins de l'utilisateur.

    Exemple de contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT LST_SORM1C.PERIODE, LST_SORM1C.WSCDZT, LST_SORM1C.NOCTE, LST_SORM1C.DEPAZT, LST_SORM1C.ART, LST_SORM1C.DESCIT, LST_SORM1C.DTMVZT, LST_SORM1C.QTE, LST_SORM1C.UNMDZT, LST_SORM1C.DEM, LST_SORM1C.NOM, LST_SORM1C.PROJZT, LST_SORM1C.NLVLZT
    FROM BHARIE01.IPPAHARTRF.LST_SORM1C LST_SORM1C
    WHERE (LST_SORM1C.DEPAZT='605') OR (LST_SORM1C.DEPAZT='606')
    ORDER BY LST_SORM1C.WSCDZT, LST_SORM1C.DEPAZT, LST_SORM1C.NOCTE
    La partie en gras est celle que je voudrais récupérer et mettre à jour.

    Est-ce qu'il y un tuto ou une interface pour modifier ce genre de fichier (.dqy).

    Je suppose que cela peut se traiter en format .TXT (en espérant que les lignes ne dépassent pas 256 bytes).

    Si quelqu'un à une suggestion, je suis preneur !

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Où as-tu vu qu'une ligne de txt ne devait pas dépasser 256 caractères ?
    Si tu es certain que c'est un txt, tu peux faire ça en lisant ton texte ligne par ligne et en écrivant chaque ligne dans un nouveau txt et en remplaçant ta ligne par la nouvelle au passage.
    Signifie l'ouverture de 2 txt, l'un avec Input, l'autre avec Output.
    Pour écrire, tu utilises Print (because les parenthèses de Write)
    Quand c'est fini, tu renommes ton fichier corrigé.
    Un conseil : Fais une sauvegarde de l'original
    Pour le code, si tu en as besoin, tu demandes...
    A+

  3. #3
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,

    ne serait -il pas mieux de passer par des parametres?

    si toutefois, les champs de recherches restent identiques bien sur!

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Ben,

    si tu le proposes si gentiment, si je pouvois avoir un exemple de code qui fait cela (y compris la fonction de recherche et de remplacement de base que je peux étoffer moi-meme après).

    Autant pour moi qui croyais qu'un string c'est maxi 256 bytes .

    Attention que l'instruction à remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE (LST_SORM1C.DEPAZT='XXX')
    peut donner lieu à une clause plus complexe avec des OR du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE (LST_SORM1C.DEPAZT='605') OR (LST_SORM1C.DEPAZT='606') OR (LST_SORM1C.DEPAZT='615')

    Et encore pour ton aide et temps.

  5. #5
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Mayeukel,

    je ne comprends pas ce que tu proposes.

    Mon but est d'adapter un Query existant pour une application qui tourne sur différents PC en utilisant ce query pour sélectionner les données à montrer.

    En fait, il faut extraire les données des départements qui concernent la personne en question, et pas les autres.

    J'avais pensé au moment de l'installation avoir une routine pour adapter ce query car pour le moement je me le farçi à la paluche, mais comme on installe souvent des nouveaux pcs, je voudrais avoir un truc plus simple à installer.


  6. #6
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    dasn ms query, tu peux passer par des parametres représenté par une cellule par exemple.

    tu lui dis par exemple que parametre1 = la cellule A1
    en passant par une feuille cachée, ça devrait le faire non?

    tu es sous quelle version d'excel?

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par Godzestla
    Attention que l'instruction à remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE (LST_SORM1C.DEPAZT='XXX')
    peut donner lieu à une clause plus complexe avec des OR du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE (LST_SORM1C.DEPAZT='605') OR (LST_SORM1C.DEPAZT='606') OR (LST_SORM1C.DEPAZT='615')
    Ça, s'il s'agit bien d'un txt (re) on s'en f...
    On ne fait pas une recherche dans le texte, on teste chaque ligne. Si ton code est long, ce sera plus long... et réciproquement...
    AVANT de tester, sauvegarde ton fichier
    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
    Sub Test()
    Dim LaLigne As String
        Open "C:\TonRep\TonFichier.dqy" For Input As #1
        Open "c:\TonRep\TonFichierCorrigé.txt" For Output As #2
        Do While Not EOF(1)
            Input #1, LaLigne
            If LaLigne = "WHERE (LST_SORM1C.DEPAZT='XXX')" Then
                LaLigne = "WHERE (LST_SORM1C.DEPAZT='605') OR (LST_SORM1C.DEPAZT='606') OR (LST_SORM1C.DEPAZT='615')"
            End If
            Print #2, LaLigne
        Loop
        Close #1
        Close #2
        Kill "C:\TonRep\TonFichier.dqy"
        Name "c:\TonRep\TonFichierCorrigé.txt" As "C:\TonRep\TonFichier.dqy"
    End Sub
    Tu dis
    A+

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je vois venir la question : Si au lieux de 'XXX' tu as un nombre ou un string variable, utilise Like et ses avatars (jokers comme dirait ucfoutu "?", "#"... etc)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If LaLigne like "WHERE (LST_SORM1C.DEPAZT='" & "###" & "')" then
    'ou
    If LaLigne like "WHERE (LST_SORM1C.DEPAZT='" & "???" & "')" then

  9. #9
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Merci... mais ce n'est pas aussi simple.

    Il y a 2 problèmes :

    1)la Clause Where à remplacer n'est pas sur une seule ligne.

    Quand je fais debug.print des lignes en Input, j'obtiens
    XLODBC
    1
    DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=BHARIE01.RAE.COM;CMT=0;DBQ=CTWRK
    IPPAHARTRF;NAM=0;DFT=5;DSP=1;TFT=0;TSP=0;DEC=0;XDYNAMIC=1;RECBLOCK=2;BLOCKSIZE=32;SCROLLABLE=0;TRANSLATE=0;LAZYCLOSE=1;LIBVIEW=0;REMARKS=0;CONNTYPE=0;SORTTYPE=0;PREFETCH=0;DFTPKGLIB=QGPL;LANGUAGEID=ENU;SORTWEIGHT=0;SSL=2;SIGNON=3;MAXFIELDLEN=32;COMPRESSION=0;ALLOWUNSCHAR=0;SEARCHPATTERN=1;MGDSN=0;
    SELECT LST_SORM1C.PERIODE
    LST_SORM1C.WSCDZT
    LST_SORM1C.NOCTE
    LST_SORM1C.DEPAZT
    LST_SORM1C.ART
    LST_SORM1C.DESCIT
    LST_SORM1C.DTMVZT
    LST_SORM1C.QTE
    LST_SORM1C.UNMDZT
    LST_SORM1C.DEM
    LST_SORM1C.NOM
    LST_SORM1C.PROJZT
    LST_SORM1C.NLVLZT FROM BHARIE01.IPPAHARTRF.LST_SORM1C LST_SORM1C WHERE (LST_SORM1C.DEPAZT='XXX') ORDER BY LST_SORM1C.WSCDZT
    LST_SORM1C.DEPAZT
    LST_SORM1C.NOCTE


    PERIODE WSCDZT NOCTE DEPAZT ART DESCIT DTMVZT QTE UNMDZT DEM NOM PROJZT NLVLZT
    et je ne crois pas que tu puisses te baser sur une position relative dans le record car à mon avis la recopie dans ce post change aussi la mise en page.

    2) La virgule est considérée comme un séparateur de record en input et n'est pas réintégrée en output, mais elle est nécessaire pour le DQY car après il n'est plus réinterprétable.

    je joints les fichiers input et output pour comparaison et explication

  10. #10
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    mayekeul,

    je suis en Excel 2003.

    Mayekeul,

    tu aurais un exemple de ceci ?

    tu lui dis par exemple que parametre1 = la cellule A1
    en passant par une feuille cachée, ça devrait le faire non?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir un fichier texte sur UltraEdit via VBA
    Par mah.ngaz dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/04/2013, 16h49
  2. Comment en VBA modifier un fichier texte sans l'ouvrir dans Excel ?
    Par shadok6 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/10/2008, 13h54
  3. Réponses: 6
    Dernier message: 25/08/2008, 13h36
  4. Réponses: 1
    Dernier message: 25/08/2008, 11h57
  5. comment utiliser Notepad pour modifier un fichier texte?
    Par moon13_698 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 06/05/2006, 15h41

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