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 :

Récupérer des valeurs d'un fichier dat


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut Récupérer des valeurs d'un fichier dat
    Bonjour,

    Il faut que je récupère dans un fichier excel certaines valeurs qui sont stockées dans un fichier dat (que j'ouvre avec le blocnote)
    Les données se présentent comme suit :
    $
    0001710602 060 22.11.07 01.04 08:38
    0489 376 2003 0513
    0489 401 2674 0585
    0480 492 7948 0583
    0467 422 5108 0561
    0520 373 1655 0278
    $
    5000221105 001 22.11.07 01.04 10:33
    0423 342 0186 0281
    0422 378 1601 0424
    0459 369 5558 0319
    0364 304 1060 0445
    Je veux récupérer les 4 premiers chiffres des valeurs qui sont sous la ligne qui commence par un 5 soit : 0423, 0422, 0459, 0364
    je ne sais pas si c'est clair mais c'est pas facile à expliquer

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Tu commences par importer le fichier texte dans Excel en précisant le type de délimiteur (espaces, dans ce cas ci), ce qui te créera une feuille nommée comme ton fichier texte, sans l'extension.
    Dans cette feuille, tu cherches la cellule qui contient la valeur référence. Par la suite, tu n'as qu'à copier les valeurs situées en dessous et à la droite de cette cellule dans une autre feuille que tu nommes comme tu veux.
    Voila pour la description des opérations. Pour ce qui est du code, ça c'est ton boulot.

    À moins que tu ne saches vraiment pas comment utiliser VBA...

  3. #3
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    ... à moins que je ne sache pas utiliser vba.... ça me correspond bien!!
    effectivement, je commence à m'y intéresser car je m'aperçois que ça pourrait résoudre pas mal de problème que je rencontre au quotidien.
    Donc je veux bien un petit coup de pouce pour démarrer!
    merci

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Le problème est que c'est plus qu'un petit bout de code que tu demandes. Je vais voir ce que je peux faire, sans promesse.

  5. #5
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    merci

  6. #6
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bonjour

    En supposant que tu n'as que 6 lignes entre chaque $.
    Adapte le chemin et teste
    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
    Sub recherche5()
    Open "C:\Users\Fred\Desktop\1.dat" For Input As #1
    While Not EOF(1)
    Line Input #1, a$
      If Left(a$, 1) Like "5" Then
        For i = 1 To 5
          Line Input #1, a$
          If i = 1 Then text1 = Left(a$, 4) Else text1 = text1 & ", " & Left(a$, 4)
        Next
      End If
    Wend
    Close #1
    Debug.Print text1
    MsgBox text1
    End Sub
    cordialement

  7. #7
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    Merci pour ce code mais le problème est que je n'ai pas forcément 6lignes avant et je peux avoir plusieurs séquences à récupérer. je joint un exemple complet de fichier dat
    Fichiers attachés Fichiers attachés

  8. #8
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    re

    que dois tu récupérer dans
    $
    5000221105 001 22.11.07 01.04 10:33
    0423 342 0186 0281
    $
    5001710701 012 22.11.07 99.04 10:13
    0417 338 0488 0439
    0313 327 0328 0395
    0423 328 0272 0359
    0434 337 0602 0116
    0426 351 0367 0231
    0413 304 0283 0309
    0413 306 0210 0339
    0473 368 0216 0261
    0476 326 0103 0105
    0440 337 0312 0323
    0454 379 0256 0421
    0418 336 0466 0389
    $
    et sous quelle forme, une seule chaîne?

    0423, 0417, 0313,...
    ou

    0423
    0417, 0313,...
    @+

  9. #9
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bon, ce sera sur plusieurs lignes.
    ce n'est certainement pas optimisé mais je crois que ça marche.

    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 recherche5()
    Dim maStr As String, a$ 
    Dim i As Integer
    Dim T As Variant
    Open "C:\Users\Fred\Desktop\MGMPLDAT.txt" For Input As #1
    While Not EOF(1)
      Line Input #1, a$
       If Left(a$, 1) Like "5" And Len(a$) = 35 Then 'à vérifier pour le 35
          Do
            Line Input #1, a$
            maStr = maStr & ", " & Left(a$, 4)
          Loop Until a$ = "$"
      End If
    Wend
    Close #1
     
    maStr = Right(maStr, Len(maStr) - 2)
    maStr = Left(maStr, Len(maStr) - 3)
    T = Split(maStr, ", $,")
     
    For i = 0 To UBound(T)
      Debug.Print T(i)
      MsgBox T(i)
    Next i
    End Sub
    cordialement

  10. #10
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    Merci pour le code, j'ai même réussi à l'adapter pour coller mes valeurs dans des cellules, le seul problème est que j'ai les $ qui subistent! voici ce que j'ai fait:
    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
    Private Sub CommandButton1_Click()
    Dim maStr As String, a$
    Dim i As Integer
    Dim T As Variant
    l = 3
    Open "C:\Documents and Settings\VALERIE\Mes documents\MGMPLDAT.DAT" For Input As #1
    While Not EOF(1)
      Line Input #1, a$
       If Left(a$, 1) Like "5" And Len(a$) = 35 Then 'à vérifier pour le 35
          Do
            Line Input #1, a$
            Range("B" & l).Value = Left(a$, 4)
          l = l + 1
          Loop Until a$ = "$"
      End If
    Wend
    Close #1
     
    End Sub

  11. #11
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bonour,

    dans le code que e t'ai laissé, il y avait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    maStr = Right(maStr, Len(maStr) - 2)
    maStr = Left(maStr, Len(maStr) - 3)
    T = Split(maStr, ", $,")
    C'est ce qui retire les $

    @+

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Petite précision: Le $ dans
    devrait disparaitre. Il ne sert que lors de la déclaration de la variable (Dim) pour préciser au compilateur qu'il s'agit d'une variable de type String. Pour faire référence à la variable partout ailleurs dans le code, il faut écrire simplement a.

    Voici ton code remanié de façon à s'y retrouver facilement (avec des noms de variables plus éloquants) :
    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
     
    Sub RecupererDonneesDansFichierTexte()
        Dim sRef As String
        Dim sLigne As String
        Dim nLigne As Integer
        Dim sNomFichier As String
        Dim sDelimiteur As String
        Dim sColonne As String
     
        sNomFichier = "C:\Documents and Settings\VALERIE\Mes documents\MGMPLDAT.DAT"
        sRef = "0000000005"
        sDelimiteur = "$"
        sColonne = "B"
     
        nLigne = 3
        Open sNomFichier For Input As #1
        While Not EOF(1)
            Line Input #1, sLigne
            If Left(sLigne, Len(sRef)) = sRef Then
                Do
                    Line Input #1, sLigne
                    If sLigne = sDelimiteur Then Exit Do
                    Range(sColonne & CStr(nLigne)).Value = "'" & Left(sLigne, 4)
                    nLigne = nLigne + 1
                Loop
            End If
        Wend
        Close #1
        ActiveSheet.Name = sRef
    End Sub
    NB : Tu remarqueras que j'ajoute un ' avant l'entrée dans Excel de façon à conserver le 0 en préfixe de chaque donnée.

    Note de modif : J'ai remplacé le Like par =.

  13. #13
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut
    bonjour Singular, elnipal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    maStr = Right(maStr, Len(maStr) - 2)
    maStr = Left(maStr, Len(maStr) - 3)
    T = Split(maStr, ", $,")
     
    For i = 0 To UBound(T)
     Range("B" & i + 2).Value = T(i)
      'MsgBox T(i)
    Next i
    doit donner ce que tu demandes.

    Tu peux aussi faire un replace dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B" & l).Value =  "'" & Replace(Left(a$, 4), "$","")
    @+

  14. #14
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    j'ai fait ça et ça marche:
    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
    Private Sub CommandButton1_Click()
    Dim maStr As String, a$
    Dim i As Integer
    Dim T As Variant
    l = 3
    Open "E:\MGMPLDAT.DAT" For Input As #1
    While Not EOF(1)
      Line Input #1, a$
       If Left(a$, 1) Like "5" And Len(a$) = 35 Then 'à vérifier pour le 35
          Do
            Line Input #1, a$
            If Left(a$, 1) Like "0" Then
            Range("B" & l).Value = (Left(a$, 4) / 10)
            End If
            l = l + 1
            If Left(a$, 1) Like "$" Then l = l - 1
          Loop Until a$ = "$"
      End If
    Wend
    Close #1
     
    End Sub

  15. #15
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Je vois pas ce que le code que je t'ai donné ne faisait pas, elnipal. J'ai tenté de limiter le nombre de comparaisons au minimum et même essayé de garder la forme originale des données.

    Une des lignes de ton code qui me chicote particulièrement est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Left(a$, 1) Like "5" And Len(a$) = 35 Then 'à vérifier pour le 35
    Pourquoi un Like quand tu as un numéro de référence précis à chercher?

    C'est dangereux de rechercher des valeurs nébuleuses quand tu peux faire autrement.

  16. #16
    Membre éprouvé
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Points : 1 207
    Points
    1 207
    Par défaut Parti trop vite
    Bonour Singular,

    Cette ligne est là car
    Citation Envoyé par elnipal Voir le message
    Je veux récupérer les 4 premiers chiffres des valeurs qui sont sous la ligne qui commence par un 5 soit : 0423, 0422, 0459, 0364
    Mais comme je l'ai écrit ce code n'est pas optimisé, ton code est plus synthétique

    Cordialement

  17. #17
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Ah! Bien vu, fred65200

  18. #18
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    je n'ai peut être pas été très clair dans mes explications: je veux récupérer mes données à la suite les unes des autres sans cellule vide, sans $.
    Maintenant, j'ai un autre problème! : dans mon ficher DAT, les lignes qui commencent par le 5 sont existantes dans un fichier excel mais pas forcément dans l'ordre de mon fichier DAT.
    Entre chaque lot (puisque ces lignes commençant par 5 sont des numéros de lot) j'ai un certain nombre d'articles qui est égal au nombre de données à récupérer!
    Dans le fichier xls joint, les lots sont dans le même ordre dans les 2 fichiers donc ça marche, mais ce n'est pas toujours le cas.
    Fichiers attachés Fichiers attachés

  19. #19
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Si le format final des données n'a pas à être respecté, la méthode la plus simple est :

    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
    Sub RecupererDonneesDansFichierTexte()
        Dim sRef As String
        Dim sLigne As String
        Dim nLigne As Integer
        Dim sChemin As String
        Dim sNomFichier As String
        Dim sExtFichier As String
        Dim sCheminFichier As String
        Dim sDelimiteur As String
        Dim sColonne As String
     
        sChemin = "C:\Documents and Settings\VALERIE\Mes documents\MGMPLDAT.DAT"    sNomFichier = "MGMPLDAT"
        sExtFichier = ".DAT"
        sCheminFichier = sChemin & sNomFichier & sExtFichier
        sRef = "0000000005"
        sDelimiteur = "$"
        sColonne = "B"
     
        nLigne = 3
        Open sCheminFichier For Input As #1
        While Not EOF(1)
            Line Input #1, sLigne
            If Left(sLigne, Len(sRef)) = sRef Then
                Do
                    Line Input #1, sLigne
                    If sLigne = sDelimiteur Then Exit Do
                    Range(sColonne & CStr(nLigne)).Value = "'" & sLigne
                    Range(sColonne & CStr(nLigne)).Parse Destination:=Range(sColonne & CStr(nLigne))
                    nLigne = nLigne + 1
                Loop
            End If
        Wend
        Close #1
        ActiveSheet.Name = sRef
    End Sub
    Note de modif : J'ai changé le chemin, le Like pour un =.

  20. #20
    Membre actif

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2007
    Messages : 503
    Points : 291
    Points
    291
    Billets dans le blog
    1
    Par défaut
    qu'entends-tu par format final des données?
    moi je veux juste avoir mes 4 premiers chiffres!

Discussions similaires

  1. Réponses: 13
    Dernier message: 09/11/2011, 12h06
  2. VBS, récupérer des valeurs dans un fichier texte
    Par hugodu13 dans le forum VBScript
    Réponses: 2
    Dernier message: 09/12/2010, 20h04
  3. (Débutant VB) Récupérer des valeurs d'un fichier .settings
    Par clem67 dans le forum Visual Studio
    Réponses: 2
    Dernier message: 30/10/2010, 18h28
  4. Récupérer des valeurs d'un fichier text
    Par Maaaks dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 28/04/2010, 08h45
  5. Réponses: 1
    Dernier message: 05/09/2006, 17h56

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