Microsoft 365 Récupérer tout le texte après le dernier délimiteur

Tidjyphenom

XLDnaute Nouveau
Bonjour communauté Excel, j'appelle une nouvelle fois votre aide pour un "problème" que je n'arrive pas à résoudre. Disons que je dispose d'une colonne ayant les données suivantes délimitées par des virgules :

---------------------------------------------------------
texte 1, texte 2, texte 3, texte 4, texte 5, texte 6, "texte 7, un peu plus long", texte 8
texte 1, texte 2, texte 3, texte 4, texte 5, texte 6, texte 7, "texte 8, avec beaucoup, de virgules"
texte 1, texte 2, texte 3, texte 4
---------------------------------------------------------

Je souhaite déplacer dans une nouvelle colonne :

---------------------------------------------------------
texte 8
texte 8, avec beaucoup, de virgules
texte 4
---------------------------------------------------------

La colonne initiale deviendrait :

---------------------------------------------------------
texte 1, texte 2, texte 3, texte 4, texte 5, texte 6, "texte 7, un peu plus long"
texte 1, texte 2, texte 3, texte 4, texte 5, texte 6, texte 7
texte 1, texte 2, texte 3
---------------------------------------------------------

Fractionné les celulles à l'aide du délimiteur ne m'aidera pas car les cellules contiennent du texte entre guillemets possèdant lui même des virgules que je ne souhaite pas couper puisque dans ce cas les virgules dans le texte ne sont pas des délimiteurs. D'autant plus que j'ai 3000 lignes à traiter et chaque ligne ne possèdant pas le même nombre de délimiteurs dans cette colonne, ça serait fastidieux dans tous les cas.

Quelle serait la solution la plus simple pour parvenir à la solution voulue ?

Merci.
 
Solution
Une solution plus élaborée dans ce fichier (2) :
VB:
Sub Fractionner()
Dim col%, c As Range, p%, pp%
col = ActiveSheet.UsedRange.Columns.Count + 1
For Each c In [A1].CurrentRegion.Columns(1).Cells
    If Right(c, 1) = """" Then
        p = InStrRev(Left(c, Len(c) - 1), """")
        pp = InStrRev(Left(c, p - 1), ",")
        If pp Then
            c(1, col) = Mid(c, p + 1, Len(c) - p - 1)
            c = Left(c, pp - 1)
        End If
    Else
        p = InStrRev(c, ",")
        If p Then
            c(1, col) = Trim(Mid(c, p + 1))
            c = Left(c, p - 1)
        End If
    End If
Next
End Sub
Re bonne nuit.

job75

XLDnaute Barbatruc
Bonsoir Tidjyphenom,

Voyez le fichier joint et cette macro affectée au bouton :
VB:
Sub Fractionner()
Dim c As Range, p%
If Application.CountA([B:B]) Then Exit Sub 'sécurité, la colonne B doit avoir été vidée
For Each c In [A1].CurrentRegion
    If Right(c, 1) = """" Then
        p = InStrRev(Left(c, Len(c) - 1), """")
        c(1, 2) = Mid(c, p + 1, Len(c) - p - 1)
        c = Left(c, InStrRev(Left(c, p - 1), ",") - 1)
    Else
        p = InStrRev(c, ",")
        c(1, 2) = Trim(Mid(c, p + 1))
        c = Left(c, p - 1)
    End If
Next
End Sub
Bonne nuit.
 

Pièces jointes

  • Classeur(1).xlsm
    17.3 KB · Affichages: 3

job75

XLDnaute Barbatruc
Une solution plus élaborée dans ce fichier (2) :
VB:
Sub Fractionner()
Dim col%, c As Range, p%, pp%
col = ActiveSheet.UsedRange.Columns.Count + 1
For Each c In [A1].CurrentRegion.Columns(1).Cells
    If Right(c, 1) = """" Then
        p = InStrRev(Left(c, Len(c) - 1), """")
        pp = InStrRev(Left(c, p - 1), ",")
        If pp Then
            c(1, col) = Mid(c, p + 1, Len(c) - p - 1)
            c = Left(c, pp - 1)
        End If
    Else
        p = InStrRev(c, ",")
        If p Then
            c(1, col) = Trim(Mid(c, p + 1))
            c = Left(c, p - 1)
        End If
    End If
Next
End Sub
Re bonne nuit.
 

Pièces jointes

  • Classeur(2).xlsm
    17.9 KB · Affichages: 12

Staple1600

XLDnaute Barbatruc
Bonjour le fil, @Tidjyphenom , @job75, @Lotote83

@Tidjyphenom
Puisque tu disposes d'Office 365
En B1, mettre cette formule puis recopier vers le bas
=FILTRE.XML("<t><s>"&SUBSTITUE(A1;",";"</s><s>")&"</s></t>";"//s[last()]")

EDITION:
En relisant, je m'aperçois que cette formule ne fait ce que tu souhaites
Elle renvoie simplement la dernière occurrence.

Et avec cette formule, ce n'est pas mieux
=FRACTIONNER.TEXTE(A1;CAR(34);;VRAI;1)

Mais peut-être que les formulistes sauront comment creuser cette piste.
 
Dernière édition:

Tidjyphenom

XLDnaute Nouveau
Une solution plus élaborée dans ce fichier (2) :
VB:
Sub Fractionner()
Dim col%, c As Range, p%, pp%
col = ActiveSheet.UsedRange.Columns.Count + 1
For Each c In [A1].CurrentRegion.Columns(1).Cells
    If Right(c, 1) = """" Then
        p = InStrRev(Left(c, Len(c) - 1), """")
        pp = InStrRev(Left(c, p - 1), ",")
        If pp Then
            c(1, col) = Mid(c, p + 1, Len(c) - p - 1)
            c = Left(c, pp - 1)
        End If
    Else
        p = InStrRev(c, ",")
        If p Then
            c(1, col) = Trim(Mid(c, p + 1))
            c = Left(c, p - 1)
        End If
    End If
Next
End Sub
Re bonne nuit.
Testé et ça fonctionne comme voulu. En revanche dans mon classeur personnel, la nouvelle colonne avec les résultats est crée 4 colonnes après. Par là je veux dire que si la macro est appliquée sur la colonne C, le résultat sera affiché en colonne G. Les colonnes D, E et F seront vides. C'est pas si grave mais ça m'oblige à réordonner la colonne manuellement. Tu aurais une idée d'où ça peut provenir ? Le problème survient si par exemple après la colonne où est appliqué la macro j'ai d'autres colonnes avec du contenu. Dans l'idéal, plutôt que d'inscrire le résultat dans une nouvelle colonne vide en fin de feuille, comment placer le résultat dans une colonne juste après celle où est appelé la macro ?

Pour info j'ai optimisé le code car les données à manipuler ne se trouvent pas toujours en colonne A donc j'ai

VB:
Fractionner()
Dim col%, c As Range, rngMyRange As Range, p%, pp%
col = ActiveSheet.UsedRange.Columns.Count + 1
Set rngMyRange = Selection
For Each c In rngMyRange.Cells
    If Right(c, 1) = """" Then
        p = InStrRev(Left(c, Len(c) - 1), """")
        pp = InStrRev(Left(c, p - 1), ",")
        If pp Then
            c(1, col) = Mid(c, p + 1, Len(c) - p - 1)
            c = Left(c, pp - 1)
        End If
    Else
        p = InStrRev(c, ",")
        If p Then
            c(1, col) = Trim(Mid(c, p + 1))
            c = Left(c, p - 1)
        End If
    End If
Next
End Sub

En somme j'ajoute "Set rngMyRange = Selection" pour appliquer la macro aux cellules sélectionnées plutôt qu'à une celulle prédéfinie dans le code.
 
Dernière édition:

Tidjyphenom

XLDnaute Nouveau
Ma dernière macro entre les résultats dans la colonne qui suit le UsedRange.

Si vous voulez que ce soit la colonne E mettez des titres en B1 C1 D1 pour élargir le UsedRange.
En faites je ne connais pas par avance combien de colonnes contiendra mon document. Etant donné que j'ai plusieurs documents à traiter mais avec un nombre de colonnes différents. Dans l'idéal, si j'ai une feuille avec des colonnes A, B, C, D, E, etc... et que j'applique la macro sur la colonne B sélectionnée par exemple, il faudrait que les colonnes C, D, E et toutes les suivantes soient décalées d'une colonne et que la nouvelle C contienne le résultat de la macro.
 

Discussions similaires

Réponses
0
Affichages
148

Statistiques des forums

Discussions
312 198
Messages
2 086 151
Membres
103 133
dernier inscrit
mtq