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 :

Découpe chaine avec séparateur "-" dans un teste string en une ligne de code avec SPLIT


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de GESCOM2000
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 107
    Points : 79
    Points
    79
    Par défaut Découpe chaine avec séparateur "-" dans un teste string en une ligne de code avec SPLIT
    Bonsoir
    Question que je me pose avec le split?

    Montablo(1,1)="17-5-3-8-9-65-10-23"
    Maintenant j'aimerai sortir les 4 premieres valeurs comme cela "17-5-3-8"

    J'ai pas trouver plus simple....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub test
    Dim Tablo()
    dim TxtRecup5premier as string
     
    Redim Tablo(1,10,1 to 10)
    Tablo(1,1)="17-5-3-8-9-65-10-23"
    TxtRecup5premier=Split(Tablo(1, 1), "-")(0) & "-" & Split(Tablo(1, 1), "-")(1) & "-" & Split(Tablo(1, 2), "-")(1) & "-" & Split(Tablo(1, 1), "-")(3) 
     
    end sub
    Merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut ExtractFromSplit
    Citation Envoyé par GESCOM2000 Voir le message
    Bonjour,

    Voir le message de Pierre FAUCONNIER en page 2 pour harmoniser les propositions de fonctions

    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
     
    Function ExtractFromSplit_EK(ByVal MaChaine As String, ByVal PositionDebut As Integer, ByVal NbValeurs As Integer) As String
     
    Dim MonTableauDeValeurs As Variant
    Dim I As Integer
     
        MonTableauDeValeurs = Split(MaChaine, "-")
        If UBound(MonTableauDeValeurs) >= PositionDebut + NbValeurs - 2 Then
           For I = PositionDebut - 1 To PositionDebut + NbValeurs - 2
               ExtractFromSplit_EK = ExtractFromSplit_EK & MonTableauDeValeurs(I) & "-"
           Next I
           ExtractFromSplit_EK = Mid(ExtractFromSplit_EK, 1, Len(ExtractFromSplit_EK) - 1)
        Else
           ExtractFromSplit_EK = "Chaîne non valide"
        End If
     
    End Function
     
     
    Sub TestExtractFromSplit_EK()
     
    Dim TxtRecup1_4 As String
     
         TxtRecup1_4 = ExtractFromSplit_EK("17-5-3-8-9-65-10-23", 4, 3)
         MsgBox TxtRecup1_4
     
    End Sub
    Proposition du message d'origine :

    Je verrais bien cette fonction :

    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
     
    Function LesNPremiers(ByVal MaChaine As String, ByVal NbValeurs As Integer) As String
     
    Dim Tablo As Variant
    Dim I As Integer
     
        Tablo = Split(MaChaine, "-")
        If UBound(Tablo) >= NbValeurs - 1 Then
           For I = 0 To NbValeurs - 1
               LesNPremiers = LesNPremiers & Tablo(I) & "-"
           Next I
           LesNPremiers = Mid(LesNPremiers, 1, Len(LesNPremiers) - 1)
        Else
           LesNPremiers = "Chaîne non valide"
        End If
     
    End Function
     
    Sub Test()
     
    Dim TxtRecup4premiers As String
     
         TxtRecup4premiers = LesNPremiers("17-5-3-8-9-65-10-23", 4)
         MsgBox TxtRecup4premiers
     
    End Sub
    Dernière modification par Invité ; 04/09/2017 à 14h23. Motif: Voir message de Pierre FAUCONNIER en page 2

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    Bonjour
    du "rigolo" pour se mettre de bonne humeur (et surtout inviter GESCOM2000 au gymnase des traitements de chaînes de caractères) -->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chaine = "17-5-3-8-9-65-10-23"
    titi = Replace(chaine, "-", Chr(1), 1, 4)
    pos = InStrRev(titi, Chr(1))
    titi = Replace(Left(titi, pos - 1), Chr(1), "-")
    MsgBox titi
    Il pourrait en inventer d'autres encore.
    Comme celle-ci (entre autres) -->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim titi
    chaine = "17-5-3-8-9-65-10-23"
    titi = Split(chaine, "-")
    ReDim Preserve titi(3)
    MsgBox Join(titi, "-")

  4. #4
    Membre régulier Avatar de GESCOM2000
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 107
    Points : 79
    Points
    79
    Par défaut
    En fait c'est pas possible de donner une valeur Len avec le SPLIT???
    Du style

    Split(Tablo(1, 1), "-")(0)'===>le (0) Prend la premier Lig du tableau

    Pas possible de faire avec une autre syntaxe???
    Split(Tablo(1, 1), "-")(0 & 1 & 2) 'le (0 & 1 & 2) Pour prendre la 1er, 2eme et 3eme Lig du tablo.

    Peut etre avec du SPLIT dans du SPLIT ???
    ....

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par GESCOM2000 Voir le message
    Avec une seule ligne de code pour récupérer votre chaîne, c'est encore trop long ?
    Vous n'avez pas dû essayer les solutions proposées, ce n'est pas possible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub Test()
     
    Dim TxtRecup4premiers As String
     
         TxtRecup4premiers = LesNPremiers("17-5-3-8-9-65-10-23", 4)
         MsgBox TxtRecup4premiers
     
    End Sub

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je préfère personnellement une fonction comme celle d'Eric à un tout en une ligne imbuvable, illisible et fixé à x concaténations (surtout si le x devait être un jour plus grand que 4).

    Au delà de la prouesse d'écrire tout sur une ligne, je ne vois pas l'intérêt pratique.

    C'est comme quand on écrit with ... : ... : ... End With... Perso, je n'adhère pas.

  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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    je vous propose celle ci :

    MsgBox part_off_string(chaine a traiter , caractère séparateur, début, fin )(0)
    en rouge
    0 pour la partie demandé
    1 pour la suite

    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 test1()
        Dim chaine$
        chaine = "17-5-3-8-9-65-10-23"
        MsgBox part_off_string(chaine, "-", 0, 4)(0)
    End Sub
    '
    '
    Function part_off_string(txt As String, sep As String, debut As Long, fin As Long) As Variant
        Dim Tabl, tBL(2)
        Tabl = Split(txt, sep)
        ReDim Preserve Tabl(debut To fin - 1)
        tBL(0) = Join(Tabl, "-")
        tBL(1) = Replace(txt, tBL(0), "")
        part_off_string = tBL
    End Function
    chose étonnantes pourtant le redim preserve autre que 0 to x ne fonctionne pas

  8. #8
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 176
    Points
    4 176
    Par défaut
    Bonjour,
    Coucou à ceux qui me connaisse

    une autre façon de faire (avec choix du caractère de séparation ou pas) :

    avec choix du caractère de séparation :
    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 ExempleAvecFonction() 'avec choix du caractère de séparation
        TxtRecup4premier = "17-5-3-8-9-65-10-23"
        MsgBox TextRecup(TxtRecup4premier, 4, "-")
    End Sub
     
    Function TextRecup(ByVal Txt As String, NBRecup As Byte, Cara As String) As String 'Cara As String : ou l'intégrer directement dans la fonction et on le supprime
    Dim i As Byte, Cpt As Byte
        For i = 1 To Len(Txt)
            If Mid(Txt, i, 1) = Cara Then Cpt = Cpt + 1
            If Cpt = NBRecup Then
                Cpt = i: TextRecup = Mid(Txt, 1, Cpt - 1): Exit For
            Else
                TextRecup = "Chaîne non valide"
            End If
        Next
    End Function
    Sans choix du caractère de séparation :
    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 ExempleAvecFonction() 'choix du caracrère intégrer dans la fonction
        TxtRecup4premier = "17-5-3-8-9-65-10-23"
        MsgBox TextRecup(TxtRecup4premier, 4)
    End Sub
     
    Function TextRecup(ByVal Txt As String, NBRecup As Byte) As String
    Dim i As Byte, Cpt As Byte
        For i = 1 To Len(Txt)
            If Mid(Txt, i, 1) = "-" Then Cpt = Cpt + 1
            If Cpt = NBRecup Then
                Cpt = i: TextRecup = Mid(Txt, 1, Cpt - 1): Exit For
            Else
                TextRecup = "Chaîne non valide"
            End If
        Next
    End Function

  9. #9
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    Bonjour Patrick
    Pourquoi passer par un Replace, etc ... ?
    Utilise alors (non demandé par le demandeur, mais ..) plutôt ce qu'offre la fonction Split.
    Regarde --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chaine = "17-5-3-8-9-65-10-23"
     nbdebut = 3
     titi = Split(chaine, "-", nbdebut + 1)
     pos = InStrRev(Join(titi, Chr(1)), Chr(1))
     MsgBox Left(chaine, pos - 1) & vbCrLf & Mid(chaine, pos + 1)

  10. #10
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 176
    Points
    4 176
    Par défaut
    Salut Jacques,
    sympas cette façon de faire

  11. #11
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    Salut Ryu
    Je dirais plutôt "rigolo".
    Mais on s'est écarté de la demande originelle.

  12. #12
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour jacques
    le replace c'est juste pour récupérer la deuxième partie dans le tbl(1)c'est juste un supplément (pas demandé) mais qui peut avoir son intérêt tout de même )

    après avec split est instr ect... on a bien des possibilité je pense que le choix c'est un peu la signature du développeur

  13. #13
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    J'aurais tellement préféré voir le demandeur monter lui-même aux agrès ...
    Les possibilités de traiter son "affaire" sont carrément innombrables. Elles font toutes plus appel à l'imagination et la créativité qu'à quoi que ce soit d'autre.
    Après, ce n'est qu'une question de rapidité (et non de "longueur" de code). De toutes mes solutions, je donne personnellement la préférence à ma toute première. Elle est la plus pure. Toutes mes autres propositions paraissent plus "pros", mais ne le sont nullement, en ce sens qu'elles font de toutes manières faire en arrière plan des taches que la première fait directement. Elles ne sont que des faux-amis

  14. #14
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    a oui jacques
    le 3eme argument(limite) du split on s'en sert pas souvent de celui la c'est vrai

    ma version elle est rigolote aussi non je reverse pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test4()
        chaine = "17-5-3-8-9-65-10-23"
        nbdebut = 3
        titi = Join(Split(chaine, "-", nbdebut + 1), Chr(1))
        MsgBox Join(Split(Split(titi, "-")(0), Chr(1)), "-")
    End Sub
    split de split Chrüterchraft

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    Oui, Patrick, si c'est pour extraire le seul début.
    Deux splits toutefois, sont quelque peu gourmands.

    PS : je n'ose pas montrer ici (le demandeur s'y perdrait), ma vraie préférence. Elle passe par la fonction strconv, occupe plus de lignes de code ... mais (à un niveau de traitement plus bas) est tellement plus rapide en exécution ...

  16. #16
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    je suis curieux (strconv)
    peu etre le verra t on dans un autre post

    je serait curieux aussi de pouvoir mesurer la charge mémoire & UC de ces diverses fonctions

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par unparia Voir le message
    Allez Jacques, vas y....

  18. #18
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    a oui suis je bête jacques je le fait pour ma contrib nombres en lettre pour spliter par tranche de 3 caractères numérique
    viens vu la piqure de rappel

  19. #19
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 176
    Points
    4 176
    Par défaut
    je suis curieux de voir aussi Jacques (strconv)

  20. #20
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 430
    Points
    12 430
    Par défaut
    Bonjour Eric, Ryu, ...
    Vous y tenez (avec strconv) ?
    Attendez. J'en bâcle un vite fait et reviens avec en Edit.

    EDIT :
    Coucou (et bâclé) --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    chaine = "17-5-3-8-9-65-10-23"
       sep = Asc("-"):   nbdebut = 4
       Dim titi() As Byte
       titi = StrConv(chaine, vbFromUnicode)
       For k = 0 To UBound(titi)
          If titi(k) = sep Then ou = ou + 1
          If ou = nbdebut Then Exit For
       Next
       titi = MidB(titi, 1, k)
       MsgBox StrConv(titi, vbUnicode)

Discussions similaires

  1. Comment repérer dans quel fichier se situe une ligne de code
    Par Atilili dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 29/08/2012, 20h14
  2. Réponses: 4
    Dernier message: 25/07/2012, 01h17
  3. Réponses: 4
    Dernier message: 24/05/2010, 13h06
  4. une action dans excel peut elle créer une ligne de code dans VBA?
    Par beebe dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 25/09/2008, 07h23

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