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 :

MACRO : Extractions base de données texte, recherche multicritères avec interrogation


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    salarié
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : salarié
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Par défaut MACRO : Extractions base de données texte, recherche multicritères avec interrogation
    Bonjour à tous

    J'ai déjà créé des macros, mais là celle là ......J'ai besoin de vos lumières

    voilà j'ai une base de données texte qui change (le nombres de lignes varie disons toutes les semaines). Fichier en TXT.

    Je voudrais faire une macro dans Excel comme suit :

    avec question qui me demande ou se trouve le fichier de données

    La macro ouvre le fichier txt sous excel

    elle demande (car je dois pouvoir changer à chaque fois) le texte compris dans certaines colonnes de données (par exemple colonne A, je veux qu'il extrait les lignes comportant le texte par exemple ART, sachant que le texte peut etre mARTin donc je désire l'extraire car mARTin contient ART).

    qu'elle me demande également pour la colonne B avec même type de critères (je veux qu'il extrait les lignes comportant le texte par exemple BLE, sachant que le texte peut etre mangeaBLE.

    qu'elle extrait donc ces données trouvées avec critères de textes dans colonne A et B (et voir aussi une autre) comme vu ci dessus

    Puis qu'elle l'enregitre dans une feuille de calcul Excel, mais surtout dans un fichier texte (comme la base de données source de départ), bien entendu en me demandant le nom du fichier d'enregistrement.

    voici, voilà, j'espère avoir été clair

    j'ai oublié de dire que le fichiers sources, comporte en ligne de texte, environ 4000 lignes (donc assez lourd), en txt le fichier fait environ 1,3 Mo

    Merci bcp bcp d'avance pour vos lumières, car là je plante un pneu.....

  2. #2
    Membre éprouvé
    Homme Profil pro
    Back Office Marchés
    Inscrit en
    Mars 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Back Office Marchés
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 65
    Par défaut
    Bonjour,

    Tu plantes un peu ? As tu déjà écrit un peu de code ? Ta demande n'est pas très claire. Tu veux que le programme extraie tous les mots de la colonne A mais un peu plus loin tu indiques que le programme doit extraire des lignes depuis un critère dans la colonne B. Pas pareil ça non ? Un petit exemple ne ferait pas de mal...

    En ce qui concerne :
    1) "avec question qui me demande ou se trouve le fichier de données" : regarde la méthode GetOpenFileName dans F1 ou bien dans les tutoriels.
    2) "La macro ouvre le fichier txt sous excel " : regarde la méthode OpenText de l'objet Workbooks ou bien essaie le code suivant extrait du tuto de JM Rabilloud :

    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
    Dim NumFichier As Integer, TabLigne() As String, TabCol() As String, _
    Recup As String, NomFichier as String
    Dim cmpt1 As Long, cmpt2 As Long
    Dim Classeur As Workbook
     
    NumFichier = FreeFile
     
        Open NomFichier For Binary Access Read As #NumFichier
            Recup = String(LOF(NumFichier), " ")
            Get #NumFichier, , Recup
        Close #NumFichier
     
    Set Classeur = Workbooks.Add
        Classeur.Activate
            With Classeur.Worksheets(1).Range("a1")
                TabLigne = Split(Recup, vbCrLf)
                    For cmpt1 = 0 To UBound(TabLigne)
                        TabCol = Split(TabLigne(cmpt1), ",")
                    For cmpt2 = 0 To UBound(TabCol)
                .Offset(cmpt1, cmpt2).Value = TabCol(cmpt2)
            Next cmpt2
        Next cmpt1
    End With
    ça, ça marche tout le temps.

    Pour le reste, j'attend de voir ton code et tes explications.

  3. #3
    Membre régulier
    Femme Profil pro
    salarié
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : salarié
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Par défaut
    Bonjour

    Merci bcp Golonne

    j'ai un message d'érreur en ce qui concerne la macro
    Erreur de compilation: Instruction incorrecte à l'extérieur d'une procédure
    il surligne en jaune FreeFile

    Oui je me suis mal exprimé
    non je n'ai jamais développé en VBa

    J'ai juste créé macro par enregistrement, d'ou mon pb pour le dossier en cours

    Voilà j'ai des données en txt, des lignes d'enregistrements
    le nb d'enregistrement change régulièrement et le nom du fichier aussi

    je voudrais avoir un bouton relié à une macro qui ouvre ce document sous excel
    bien sur qui sépare une ligne d'enregistrement par colonne

    ensuite je dois extraire certains enregistrements mais pas tous
    donc par critères, qui peuvent varié, sinon ce serait trop simple...,
    mais ça on verra aprés.....

    Merci bcp bcp

    je suis débordé et pa le temps de m'y pencher sérieux... et c'est urgent... bref pas le top quoi.......

  4. #4
    Membre éprouvé
    Homme Profil pro
    Back Office Marchés
    Inscrit en
    Mars 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Back Office Marchés
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 65
    Par défaut
    Bonjour Moi,

    Ton programme doit démarrer par l'instruction Sub et finir par l'instruction End Sub

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub OuvrirFichierTexte()
    ....
    'Ici le code
    ...
    End Sub
    Essaye ça pour l'ouverture du fichier texte :

    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
    Option Explicit
     
    Sub OuvreTxtSousExcel()
    Dim Source As String, Filtre As String
    Dim NumFichier As Integer
    Dim TabLigne() As String, TabCol() As String
    Dim Recup As String
    Dim Cmpt1 As Long, Cmpt2 As Long
    Dim Classeur As Workbook
     
    ' Ouvrir une boite de dialogue pour sélectionner le fichier .txt
    Filtre = "Fichiers texte (*.txt),*.txt"
    Source = Application.GetOpenFilename(Filtre, Title:="Sélection du fichier")
    Application.ScreenUpdating = False
     
    'Convertir le fichier texte en classeur Excel
        NumFichier = FreeFile
     
        Open Source For Binary Access Read As #NumFichier
            Recup = String(LOF(NumFichier), " ")
            Get #NumFichier, , Recup
        Close #NumFichier
     
    Set Classeur = Workbooks.Add
        Classeur.Activate
            With Classeur.Worksheets(1).Cells(1, 1)
                TabLigne = Split(Recup, vbCrLf)
                    For Cmpt1 = 0 To UBound(TabLigne)
                        TabCol = Split(TabLigne(Cmpt1), ",")
                            For Cmpt2 = 0 To UBound(TabCol)
                                .Offset(Cmpt1, Cmpt2).Value = TabCol(Cmpt2)
                            Next Cmpt2
                    Next Cmpt1
            End With
     
    Set Classeur = Nothing
     
    Application.ScreenUpdating = True
    End Sub
    C'est testé et ça doit marcher quelque soit la taille du fichier si ton séparateur est une virgule. Sinon modifie la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabCol = Split(TabLigne(Cmpt1), " ici tu indiques ton séparateur ")
    Pour la suite je vais jeter un oeil si tu attaches un txt en exemple et la liste des critères d'extraction.

    Mais lis les tutoriels et l'aide en ligne (F1) ça t'aidera à comprendre le code.

    Cordialement,

    Golonne

  5. #5
    Membre régulier
    Femme Profil pro
    salarié
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : salarié
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Par défaut
    Merci bcp cela fonctionne test effectué pour l'ouverture du fichier TXT.

    Oui j'avais bien mis le sub, mais erreur deux entrées je suppose.

    Par contre, je pense que ce que je veux n'ai pas gérable en vb sur Excel.

    Je m'explique :

    d'une part il faut que je sois sur 2007 car 2003 n'a pas assez de ligne, mon fichier en fait 760 000.

    J'ai un fichier txt toujours sur la même forme, qui change tous les 15 jours, le nombres de ligne change, mais la forme est toujours la même, c'est à dire que chaque ligne fait 132 caractères.


    Pour l'ouverture et la macro c'est ok, car aprés mes tests d'ouverture depuis msquerry, j'ai vu que je dois importer sans diviser par colonne.
    Mes 132 caractères se retrouvent dans une seule colonne, aucun pb.

    Ensuite je dois pouvoir trier mes lignes pour n'en extraire que certaines.

    Et enregistrer en txt ces lignes extraites (mes tests me donne en txt ok mais avec des CR LF à la fin de chaque ligne, je voudrais que des LF. Mais bon ça on verra après.

    Mais pb, les critères varient, je dois donc avoir une invite pour demander le critères choisi ou une liste de choix.

    Voici un exemple de deux lignes (j'peux pô envoyer les 760 000 lignes... lol...) :

    SAFRD AKW DN111380VDH N04534295E008061778 N04534295E008061778W0021002000 UYO 000231104
    SAFRD AKW DN2S UU W002000162 000241104


    Quand j'importe en txt, les espaces sont respectés entre les caractères et quand je reexporte également, donc c'est tout bon ;-)
    ouf déjà ça

    mes critères se situent entre des caractères, j'ai testé la fonction TROUVE.
    Cela fonctionne mais j'ai des soucis d'enchainement pour ma macro etc..... j'suis pas assez bonne....... bouhhhhhhh


    Alors voilà....
    CRITERE 1 :
    Je dois rechercher les caractères 1, 2 et 3 de chaque ligne (par exemple AFR pour mes deux lignes d'exemple ci dessus)

    CRITERE 2 :
    Je dois rechercher le caractère 5 de chaque ligne (par exemple ici D)

    CRITERE 3 :
    Je dois rechercher le caractère 6 de chaque ligne

    CRITERE 4 :
    recherche caractères 11 et 12 de chaque ligne


    CRITERE 5 :
    rechercher le caractère 13 de chaque ligne



    Donc avec une invite demandant chacun des 6 critères qu'on recherche, en sachant qu'un peut etre laissé libre.
    par ex, j'aurais critère 1, 2, 3, 5, 6 our je voudrais trouvé pour un texte mais le 4 je le laisse libre, sans critères.

    la macro doit lancer ses recherches pour resortir (uniquement les lignes correspondantes aux critères choisis.
    puis copier /coller sur une autre feuille ou autre fichier) ça ok pas de pb.



    Voici, voilà exactement ce dont j'ai besoin.

    Donc ouverture fichier txt, c'est résolu, merci bcp car pendant ce temps j'ai chercher sur le restant, et fait des tests déjà de recherches simples etc...

    mais là je pêche.....

    j'ai testé avec RECHERCHE, mais a priori ce n'est pas la bonne idée
    avec TROUVE cela fonctionnait mieux, mais aprés comme dire pour multicritères !..... parmis ces lignes trouvée,s tu recherches xx caractères puis parmis celles là.....


    Je me demande si en VB c'est possible ?...
    sinon quel type de programme pourrait etre capable de faire cela?

    MERCI bcp par avance

  6. #6
    Membre éprouvé
    Homme Profil pro
    Back Office Marchés
    Inscrit en
    Mars 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Back Office Marchés
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 65
    Par défaut
    Salut Moi,

    760000 lignes il vaut mieux avoir 2007 ou 2010 en effet, si tu passes par Excel, mais si j'ai bien compris ta demande, a priori on peut même se passer d'Excel tout court (sauf pour lancer la macro of course puisqu'on est en VBA)

    Je reformule ta demande avant de coder, n'hésite pas à préciser si je me trompe.

    1) Ouvrir le fichier FichierTxtSource
    2) Sélectionner les critères
    a) 'abc' des trois premiers caractères de la ligne
    b) 'd' du cinquième caractère de la ligne
    c) 'e' du sixième caractère de la ligne
    d) 'fg' du onzième et douzième caractère de la ligne
    e) 'h' du 13ème caractère de la ligne
    3) Pour chaque ligne du fichier
    Vérifier qu'il a 4 critères sur 5 de remplis
    a) si tous les critères correspondent conserver la ligne
    b) si tous les critères sauf 1 correspondent conserver la ligne
    Ecrire la ligne dans FichierTxtCible
    Ligne suivante

    Ca te semble correct ?

    Guillaume

Discussions similaires

  1. [XL-2010] Problème extraction base de données
    Par DanRoz dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/03/2013, 15h52
  2. Lenteur avec Macro Excel + base de données
    Par _Remy_ dans le forum VB.NET
    Réponses: 4
    Dernier message: 07/08/2009, 10h38
  3. macro excel (base de donnée)
    Par hugo59330 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/07/2009, 13h41
  4. Base de donnée personnelle & recherche
    Par remy67 dans le forum MySQL
    Réponses: 3
    Dernier message: 04/01/2009, 20h31
  5. Réponses: 10
    Dernier message: 17/05/2006, 15h32

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