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 :

VBA Excel - Split TextToColumns


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Par défaut VBA Excel - Split TextToColumns
    Bonjour à tous,

    Je transforme les données d'une colonne contenant ce type de données :
    "DSO / CHAMPAGNE ARDENNE / INTERVENTIONS AUBE / POLE BAR S / CAR OPE INT EXP AUB B"

    Je zoome sur le caractère "/" pour séparer mes données.

    Je me suis appuyé sur la code suivant pour cela (je suis parti de l'enregistreur et j'ai adapté) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sheets("DATA_V").Columns("F:F").Select
     
            Selection.TextToColumns Destination:=Range("Z1"), DataType:=xlDelimited, _
     
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
     
            Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
     
            :="/", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
     
            1)), TrailingMinusNumbers:=True
    Hélas j'ai quelques situations qui font que cela ne marche pas très bien :
    DSO / ALSACE FRANCHE COMTE / DIRECTION TERRITORIALE 70/39 / DIRECTION TERRITORIALE 70/39 / AFC TER DTL 39/70

    Comme il y a des "/", dans certains descriptions, j'ai des colonnes en plus de l'attendu.
    J'ai fait des tests comme l'ajout d'espaces OtherChar :=" / " mais cela ne marche pas comme attendu car je voudrais uniquement que le split se fasse quand on a un espace avant et après le caractère "/"
    Savez-vous si une alternative existe ?

    Merci pour aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonsoir,
    Power Query pourrait le faire nativement, mais si préférence pour le VBA, pourquoi ne pas remplacer " / " par "" avant le split?
    Bonne soirée

    je voulais dire par le back slash, mais l'éditeur n'en veut pas
    \

  3. #3
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 171
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    un peu dans l'idée de ce que proposait mapeh


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Sheets("DATA_V").Columns("F:F").Select
     
        Selection.Replace What:=" / ", Replacement:="µ", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
     
            Selection.TextToColumns Destination:=Range("Z1"), DataType:=xlDelimited, _ 
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ 
            Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _ 
            :="µ", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _ 
            1)), TrailingMinusNumbers:=True

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 414
    Par défaut
    Oui, la même chose en plus condensé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        With Sheets("DATA_V").Columns("F:F")
            .Replace What:=" / ", Replacement:="|", LookAt:=xlPart
            .TextToColumns Destination:=Range("Z1"), DataType:=xlDelimited, Other:=True, OtherChar:="|"
            .Replace What:="|", Replacement:=" / ", LookAt:=xlPart
        End With
    Bien cordialement.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonjour,

    Citation Envoyé par EricDgn Voir le message
    Oui, la même chose en plus condensé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        With Sheets("DATA_V").Columns("F:F")
            .Replace What:=" / ", Replacement:="|", LookAt:=xlPart
            .TextToColumns Destination:=Range("Z1"), DataType:=xlDelimited, Other:=True, OtherChar:="|"
            .Replace What:="|", Replacement:=" / ", LookAt:=xlPart
        End With
    Bien cordialement.
    Ayant été confronté plusieurs fois à un comportement étrange de l'instruction TextToColumns, je préfère éviter ce "condensement".
    Excel garde en mémoire (le temps de sa session), les options définies lors d'une éventuelle utilisation antérieure de la fonction "Convertir" à partir du ruban "Données".
    Et parfois, le fait de ne pas spécifier tous les paramètres dans le code peut amener à des résultats "surprenants".
    Et pour la dernière ligne, vraiment nécessaire? ("Convertir" supprime le délimiteur, il me semble???)
    Bonne journée

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 414
    Par défaut
    Le dernier Convertir (Replace) n'est là que pour revenir au texte initial dans la colonne initiale. Le TextToColumn supprime le délimiteur dans les colonnes créées, il ne modifie pas le texte de départ, lequel reste inchangé... sauf si la destination est la cellule de départ, auquel cas le texte initial est écrasé (et on n'y retrouvera plus le délimiteur).
    Cordialement.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Re-,

    Citation Envoyé par EricDgn Voir le message
    Le dernier Convertir (Replace) n'est là que pour revenir au texte initial dans la colonne initiale. Le TextToColumn supprime le délimiteur dans les colonnes créées, il ne modifie pas le texte de départ, lequel reste inchangé... sauf si la destination est la cellule de départ, auquel cas le texte initial est écrasé (et on n'y retrouvera plus le délimiteur).
    Cordialement.
    Au temps pour je...
    Si j'avais été plus attentif, j'aurais effectivement vu que le texte fractionné est restitué en colonne "Z"...
    Désolé

  8. #8
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 171
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    En effet les tableaux VBA peuvent être un vrai plus en terme de rapidité de traitement

    une version qui ne présume pas d'un résultat sur 5 colonnes (et juste pour lancer d'éventuelles discussions)

    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 test()
     
    Dim valeur_cours As String
     
    Dim tablo_origine()
     
    Dim tablo_sortie()
    Dim index_1_tablo_origine As Long
     
    ThisWorkbook.Sheets("Feuil1").Range("B1:F1000").Clear
     
    tablo_origine = ThisWorkbook.Sheets("Feuil1").Range("A1:A1000").Value
     
    ReDim tablo_sortie(1 To 1000)
     
    For index_1_tablo_origine = 1 To 1000
     
        valeur_cours = tablo_origine(index_1_tablo_origine, 1)
     
        tablo_sortie(index_1_tablo_origine) = Split(valeur_cours, " / ")
     
        ThisWorkbook.Sheets("Feuil1").Range("B" & index_1_tablo_origine).Resize(1, UBound(tablo_sortie(index_1_tablo_origine), 1) + 1).Value = tablo_sortie(index_1_tablo_origine)
    Next index_1_tablo_origine
     
    End Sub

  9. #9
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Yes tototiti2008 mais attention tu n'as pas modifié la ligne de réinitialisation en laissant B:F

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("Feuil1").Range("B1:F1000").Clear

    Dans ce cas comme on ne prévoit pas le nombre de colonnes à l'avance il faut tout supprimer sur la droite par sécurité

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("Feuil1").Range("B1:XFD1000").Clear

    Ou bien si il y a toujours le même nombre de colonnes on peut aussi faire cette suppression des anciennes éventuelles données à la fin juste avant l'insertion du tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("Feuil1").Range("B" & index_1_tablo_origine).Resize(1, UBound(tablo_sortie(index_1_tablo_origine), 1) + 1).clear

  10. #10
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 171
    Billets dans le blog
    2
    Par défaut
    Re,

    Tu veux dire que j'aurais dû mettre plus de colonnes ? du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("Feuil1").Range("B1:Z1000").Clear
    si ça dépasse 5 colonnes de résultat ?

  11. #11
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 171
    Billets dans le blog
    2
    Par défaut
    ou alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("Feuil1").Range("A1").currentregion.offset(0,1).Clear

  12. #12
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bon je vais arrêter de spammer. Ce qui compte c'est que le demandeur comprenne le code et l'adapte comme il le souhaite.

  13. #13
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Encore un cas de non retour. Sympa. Après on se demande pourquoi on aide de moins en moins...

Discussions similaires

  1. [VBA - EXCEL] Pb de conversion fichier txt avec methode TextToColumns
    Par bicoun dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 07/02/2007, 09h46
  2. DEBUTANT excel: split dans vba
    Par LOUPO dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/08/2006, 17h25
  3. [VBA-Excel]
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/01/2005, 10h17
  4. [VBA EXCEL] Réduire/Agrandir UserForms
    Par Fench dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2003, 16h02
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

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