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 :

Recherche de valeurs dans une chaîne de caractères


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut Recherche de valeurs dans une chaîne de caractères
    Bonjour,

    je souhaiterais lire un fichier du type (l'espace entre les 2 colonnes est une tabulation) :

    long lat
    4,55 51,34
    4,43 52,07
    4,31 52,72
    Pour cela, j'ai repris le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            Nom_fichier_couv = chemin + nom_couverture
     
            index_fichier_couv = FreeFile
            Open Nom_fichier_couv For Input As index_fichier_couv
     
     
            While Not EOF(index_fichier_couv)
                Line Input #index_fichier_couv, strLigne
            Wend
     
     
            Close index_fichier_couv
    Le problème est que je ne sais pas comment séparer les valeurs que j'obtiens dans strLigne (je cherche quelque chose comme sscanf(string, "%f", &p) en C). De plus, cette valeur peut être un mot ou un entier.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Ragrades du côté de split
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim strLigne As String
    Dim tablo() As String
    tablo = Split(strLigne, " ")
    MsgBox tablo(0)
    MsgBox tablo(1)

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par julieng31 Voir le message
    Bonjour,

    je souhaiterais lire un fichier du type (l'espace entre les 2 colonnes est une tabulation) :
    - on ne fait pas la dépense (onéreuse et injustifiée) d'un split pour si peu
    - si la séparataion n'est pas un espace, mais (comme dit) une tabulation, on ne sépare pas avec l'espace.

    A main levée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pos = InStr(lachaine, vbTab)
    MsgBox Left(lachaine, pos - 1) & vbCrLf & Mid(lachaine, pos + 1)

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour,
    Pour ma compréhension personnelle,
    je souhaiterais lire un fichier du type (l'espace entre les 2 colonnes est une tabulation) :
    La séparation vbTab est dans le fichier texte?
    Votre code ucfoutu avant importation dans excel, c'est ça?

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par mercatog Voir le message
    Bonjour,
    Pour ma compréhension personnelle,
    La séparation vbTab est dans le fichier texte?
    Votre code ucfoutu avant importation dans excel, c'est ça?
    Bonjour, mercatog

    Je n'en sais rigoureusement rien d'autre que ce qu'à écrit le demandeur
    Ceci étant dit : vbtab ou espace : on n'utilise pas abusivement la fonction Split pour si peu (même raisonnement) et à "tout bout de champ"

  6. #6
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Merci pour vos réponses. Ca progresse ! J'utilise le split, c'est plus simple à utiliser pour moi qui ne connaît pas bien le VBA. Je ne recherche pas la performance avec ce code.

    Voici mon code actuel :

    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
     
            ' Flag used to know if it is the first numerical data read
            Dim init As Integer
            init = 1
     
            ' Read file
            While Not EOF(index_fichier_couv)
                Line Input #index_fichier_couv, strLigne
                sous_ch = Split(strLigne, vbTab, 2)
                If (sous_ch(0) <> "long") Then ' Existe surement mieux pour tester si la valeur est un nombre ou non
                    ' First numerical data
                    If (init = 1) Then
                        init = 0
                        sous_ch(0) = Replace(sous_ch(0), ",", ".")
                        sous_ch(1) = Replace(sous_ch(1), ",", ".")
                        long_min = long_max = Val(sous_ch(0))
                        lat_min = lat_max = Val(sous_ch(1))
                    ' Normal case
                    Else
                        'A continuer
                    End If
                End If
            Wend
    Mon idée est de récupérer les valeurs comme chaîne de caractère, de les séparer, de remplacer la virgule par un point pour pouvoir appeler la fonction val() et obtenir des doubles. Le problème est que quand j'affiche long_min ou long_max, j'obtiens "Faux" ? D'autre part, je n'ai pas trouvé de moyen de forcer le cast à double dans val.

    Et pour la réponse à la question, le fichier d'entrée est un fichier édité à la main par l'utilisateur et il a pour consigne de séparer les champs numériques par une tabulation.

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    D'abord essaie le code de ucfoutu
    ensuite cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        long_min = long_max = Val(sous_ch(0))
                        lat_min = lat_max = Val(sous_ch(1))
    donnera faux si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long_max <> Val(sous_ch(0))
    essaie en 2 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long_min = Val(sous_ch(0))
    long_max = Val(sous_ch(0))
    pour tester si numérique, essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNumeric(TaVariable)

  8. #8
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Tu devrais déclarer toutes tes variables. Pour etre sur de bien le faire met toi en explicite.
    Ecrit
    sur la toute première ligne de ton module

    Quand tu ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long_min = long_max = Val(sous_ch(0))
    Voila ce que tu dis au programme
    Fait le test
    long_max = Val(sous_ch(0))
    qui est soit vrai soit faux
    met cette valeur dans la variable
    long_min
    Le = en programmation na RIEN a voir avec le = des maths!! (c'est pour ca que certain langage utilise == ou d'autre symbole)

    Si tu avais déclaré ta variable
    dim long_min as double

    tu aurais eu un message d'erreure et tu aurais sans doute trouvé tout seul

    De la lecture pour éviter quelque piège grossier mais fréquent
    http://mhubiche.developpez.com/Access/variables/

    Edit désolé mercatog pas rafraichi

  9. #9
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Merci beaucoup pour vos conseils, cela fonctionne très bien maintenant.

    Voici le résultat :

    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
     
            ' Flag used to know if it is the first numerical data read
            Dim init As Integer
            init = 1
     
            ' Read file
            While Not EOF(index_fichier_couv)
                Line Input #index_fichier_couv, strLigne
                sous_ch = Split(strLigne, vbTab, 2)
                If (IsNumeric(sous_ch(0)) And IsNumeric(sous_ch(1))) Then
                    ' First numerical data
                    If (init = 1) Then
                        init = 0
                        sous_ch(0) = Replace(sous_ch(0), ",", ".")
                        sous_ch(1) = Replace(sous_ch(1), ",", ".")
                        long_min = Val(sous_ch(0))
                        long_max = Val(sous_ch(0))
                        lat_min = Val(sous_ch(1))
                        lat_max = Val(sous_ch(1))
                    ' Normal case
                    Else
     
                    End If
                End If
            Wend

  10. #10
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    il semble toujours manquer la déclaration des variables, je te dis donc a très bientôt

  11. #11
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    J'ai bien lu tout ce qu'il m'a été dit et j'ai déclaré les variables ;-) Je ne les ai pas mis pour ne pas avoir un code trop long à lire.

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

Discussions similaires

  1. [Débutant] Rechercher dans une chaîne de caractères
    Par abel413 dans le forum MATLAB
    Réponses: 3
    Dernier message: 08/07/2013, 09h40
  2. Recherche d'une sous-chaîne complète dans une chaîne de caractères
    Par missmiss89 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 06/07/2011, 16h26
  3. Modifier la valeur numérique dans une chaîne de caractère
    Par ab1to dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/03/2010, 14h08
  4. Recherche dans une chaîne de caractères
    Par fasyr dans le forum Tcl/Tk
    Réponses: 2
    Dernier message: 25/02/2008, 19h33
  5. Réponses: 16
    Dernier message: 10/01/2008, 15h12

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