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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    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 confirmé 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
    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
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    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.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  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
    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
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre Expert
    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
    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
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    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
    Membre Expert
    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
    Par défaut
    Salut Jacques,
    sympas cette façon de faire
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

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

  12. #12
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    [EDIT] Edité pour l'ajout du séparateur dans la signature de la fonction

    Discussion riche en contributions diverses illustrant des styles de programmation différents. Intéressante, donc...

    Sauf que le demandeur initial risque de s'y perdre dans les différentes interventions et dans la façon de les mettre en application dans son code.

    Pour recentrer la discussion sur la question initiale tout en mettant en évidence les bonnes pratiques, ne pourriez-vous pas proposer chacun votre meilleure fonction qui aurait en entrée la chaine à splitter, le nombre d'éléments à extraire et à partir de quel élément extraire?

    Cela illustrerait qu'il est intéressant de travailler en découpant le code en fonctions qui font chacune leur petite part de travail, et que le code à l'intérieur de la fonction peut évoluer par la suite pour rendre l'exécution plus rapide, plus efficace, plus contrôlée en termes d'erreurs, ... tout en ne touchant pas du tout au code principal.

    Vous pourriez vous baser sur le squelette suivant et donner un exemple d'utilisation avec une procédure qui appelle la fonction et lui passe les arguments souhaités:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function ExtractFromSplit(Source as string, Sep as string, Pos as long, Length as long) as string
        ...
        ...
        ...
        ExtractFromSplit = ...
    End Function
    PS: Ce n'est qu'une proposition, mais je pense que cela donnerait beaucoup de valeur à la discussion et permettrait au demandeur d'intégrer facilement la solution de son choix dans son code.

    Merci pour lui si vous suivez...

    Subsidiairement, cela illustrerait également aux lecteurs que lorsque l'on est plusieurs à développer un même projet, on se répartit les tâches en découpant justement l'appli en différentes fonctions qui sont distribuées aux programmeurs, et qu'il suffit après d'assembler les fonctions développées comme des briques de Lego...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut Pierre,

    Message d'origine modifié.

  14. #14
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Merci Jacques. C'est sympa et utile.

    NB: En effet, il manquait le séparateur. J'ai édité ma demande en fonction.

    Merci Eric
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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