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 :

Split par rapport un caractère + 3 [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut Split par rapport un caractère + 3
    Bonjour,

    Un collègue est venu me poser une question, j'y ai trouvé une réponses mais je me demandais si il existait plus simple, d'où ma venue ici:

    Un logiciel sort des données numériques au format Excel, une partie de ces données sont concaténés avec l'espace pour séparateur (" "), mais l'espace est aussi le séparateur des milliers, du coup il n'arrive pas a déconcaténer correctement ces données.
    Heureusement j'ai pu exploiter le fait que toutes les données sont au format numériques avec une virgule et deux chiffres derrière (sauf un unique mot au début de chaque chaine dont on se débarrasse facilement).
    J'ai donc fait une macro qui cherche les virgules puis sépare la chaine suivant la position de la virgule +3 caractères
    Ce qui donne:
    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
    Sub separation_resnum()
    col = Val(InputBox("Quel est le numéro de la colonne ? (ex:2 pour la colonne B)"))
    For j = 1 To Cells(Rows.Count, col).End(xlUp).Row
        mot = Cells(j, col).Value
        i = 1
        pos = 0
        pos2 = 8
        pos = InStr(pos + 1, mot, ",")
        Cells(j, col + 1) = Left(Cells(j, col), 6)
        Do Until pos = 0
        Cells(j, col + i + 1) = Val(Replace(Mid(mot, pos2, pos + 3 - pos2), ",", ".")) 'si résultat nombre
        'Cells(j, col + i + 1) = Trim(Mid(mot, pos2, pos + 3 - pos2)) 'si résultats texte
        pos2 = pos + 3
        pos = InStr(pos + 1, mot, ",")
        i = i + 1
        Loop
    Next j
    End Sub
    Mais j'ai l'impression que je me complique la vie pour pas grand chose.
    Est-ce possible de faire plus simple, notamment en utilisant split ?
    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Postes quelques exemples de chaînes pour voir !

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    exemple:
    Global 369 295,96 534 430,15 6 182,40 572 342,70 78 811,16
    Global 3 451,21 9 106,69 132,52 4 451,26 0,00

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Désolé, je n'ai pas mieux que toi, simplement différent :
    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
     
    Sub Test()
     
        Dim T
        Dim Chaine As String
        Dim I As Integer
        Dim J As Integer
        Dim Col As Integer
        Dim Mot As String
     
        Col = Val(InputBox("Quel est le numéro de la colonne ? (ex:2 pour la colonne B)"))
     
        For J = 1 To Cells(Rows.Count, Col).End(xlUp).Row
     
            Chaine = Cells(J, Col).Value
     
            Mot = Split(Chaine, " ")(0)
     
            Chaine = Replace(Replace(Chaine, Mot & " ", ""), " ", "")
     
            For I = 1 To Len(Chaine)
                If Mid(Chaine, I, 1) = "," Then Chaine = Left(Chaine, I + 2) & ";" & Mid(Chaine, I + 3)
            Next I
     
            T = Split(Chaine, ";")
     
            Cells(J, Col + 1).Value = Mot
            Range(Cells(J, Col + 2), Cells(J, Col + 2 + UBound(T))).Value = T
     
        Next J
     
    End Sub

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Et encore, je viens de m'apercevoir que les valeurs étaient en String donc rectificatif :
    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
     
    Sub Test()
     
        Dim T
        Dim T2
        Dim Chaine As String
        Dim I As Integer
        Dim J As Integer
        Dim Col As Integer
        Dim Mot As String
     
        Col = 1 'Val(InputBox("Quel est le numéro de la colonne ? (ex:2 pour la colonne B)"))
     
        For J = 1 To Cells(Rows.Count, Col).End(xlUp).Row
     
            Chaine = Cells(J, Col).Value
     
            Mot = Split(Chaine, " ")(0)
     
            Chaine = Replace(Replace(Chaine, Mot & " ", ""), " ", "")
     
            For I = 1 To Len(Chaine)
                If Mid(Chaine, I, 1) = "," Then Chaine = Left(Chaine, I + 2) & ";" & Mid(Chaine, I + 3)
            Next I
     
            T = Split(Chaine, ";")
     
            Cells(J, Col + 1).Value = Mot
     
            For I = 0 To UBound(T): Cells(J, Col + I + 2) = CDbl(T(I)): Next I
     
        Next J
     
    End Sub

  6. #6
    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

    Personnellement, j'agirais sur la chaîne pour la rendre "orthodoxe", puis utiliserais alors un split rendu facile --->> exemple --->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim toto As String, titi() As Byte, ou As Long, i As Long, a
       toto = "blabla 369 295,96 534 430,15 6 182,40 572 342,70 78 811,16"
       titi = StrConv(toto, vbFromUnicode)
       For i = 0 To UBound(titi)
         If titi(i) = 32 Then
            ou = ou + 1
            If ou And 1 Then titi(i) = 1
         End If
       Next
       toto = Replace(StrConv(titi, vbUnicode), " ", "")
    Preuve : --->>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     a = Split(toto, Chr(1))
       For i = 0 To UBound(a)
         MsgBox a(i)
       Next
    EDIT : Mais certaines valeurs peuvent être plus petites que 1000, le code ci-dessus pourrait faillir ...
    Qu'à cela ne tienne, on va le transformer très légèrement ---->>>
    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
    Dim toto As String, titi() As Byte, i As Long, ou As Long, a
       toto = "blabla 369 295,96 534 430,15 6 182,40 572 342,70 78 811,16"
       ou = InStr(toto, " ")
       titi = StrConv(toto, vbFromUnicode)
       For i = 0 To UBound(titi) - 3
         If i = ou Then titi(i) = 1
         If titi(i) = 44 Then titi(i + 3) = 1
       Next
       toto = Replace(StrConv(titi, vbUnicode), " ", "")
     
     
       a = Split(toto, Chr(1))
       For i = 0 To UBound(a)
         MsgBox a(i)
       Next
    amitiés

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

Discussions similaires

  1. Fonction .split par rapport à un nombre donné
    Par trentks95 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 16/02/2018, 19h14
  2. Saut de ligne par rapport à un caractère
    Par anto2b dans le forum Android
    Réponses: 4
    Dernier message: 09/06/2012, 11h11
  3. RegExp : optimalité d'un split par rapport à un group
    Par oc_alex86 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 03/12/2007, 20h17
  4. Afficher les enregistrements par rapport à un caractère saisi
    Par issam47 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 05/06/2007, 16h16
  5. liste chainée :suppression milieu par rapport à un caractère
    Par Pouyou le caribou dans le forum C++
    Réponses: 4
    Dernier message: 06/06/2005, 18h49

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