Coupure phrases après 30 caractères et après un point (.)

kaki31

XLDnaute Occasionnel
Bonjour tout le monde, comment puis-je couper une phrase après 30 caractères et de même s'il ya un point. aussi un retour a ligne. Merci.

Exemple:

Bonjour tout le monde, comment
puis-je couper une phrase aprè
s 30 caractères et de même s'i
l ya un point.
aussi un retour a ligne.
Merci.

Merci:)
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Coupure phrases après 30 caractères et après un point (.)

Bonjour kaki31,

Un essai avec une expression régulière :

VB:
Sub SplitCell()
    Dim c As Range
    Dim ar
    Dim i As Integer, j
        
    Application.ScreenUpdating = False

    With CreateObject("vbscript.regexp")
       .Pattern = "(.{30})"
       .IgnoreCase = True
       .Global = True
      
      For Each c In Selection
         ar = Split(c.Value, ".")
         For i = 0 To UBound(ar) - 1
            ar(i) = LTrim(ar(i) & "." & vbCrLf)
            ar(i) = .Replace(ar(i), "$1" & vbCrLf)
         Next i
      c.Offset(1, 0) = Join(ar)
      Next c
      
    End With
    
    Application.ScreenUpdating = True
End Sub
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Coupure phrases après 30 caractères et après un point (.)

Petit correctif pour enlever les espaces superflus en début de ligne :

VB:
Sub SplitCell()
    Dim c As Range
    Dim ar
    Dim i As Integer, j
        
    Application.ScreenUpdating = False

    With CreateObject("vbscript.regexp")
       .Pattern = "(.{30})"
       .IgnoreCase = True
       .Global = True
      
      For Each c In Selection
         ar = Split(c.Value, ". ")
         For i = 0 To UBound(ar) - 1
            ar(i) = LTrim(ar(i) & "." & vbCrLf)
            ar(i) = .Replace(ar(i), "$1" & vbCrLf)
            ar(i) = Replace(ar(i), vbCrLf & " ", vbCrLf)
         Next i
      c.Offset(1, 0) = Join(ar, "")
      Next c
      
    End With
    
    Application.ScreenUpdating = True
End Sub

A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Coupure phrases après 30 caractères et après un point (.)

bonsoir kaki31, Grand Chaman Excel :)

Un essai sans expression régulière.

1) avec une fonction personnalisée (cellule B3) decoupe$(x, nCar) ou x est le texte ou bien la cellule où se trouve le texte et nCar le nombre de caractères max. (les retours de ligne ou sauts de ligne ne sont pas comptés comme caractères)

2) avec une macro qui traite les cellules sélectionnées. Ex: sélectionner B7 et B10 puis cliquer sur le bouton; seules B7 et B10 sont traitées.

Le code:
VB:
Sub DecoupeSelection()
Dim xcell As Range
  For Each xcell In Selection
    xcell.Value = decoupe(xcell.Value, 30)
    xcell.WrapText = True
    xcell.EntireRow.AutoFit
  Next xcell
End Sub

Function decoupe$(x, nCar)
Dim si$, sf$, k&, n&, c$, wasVbcr

si = x
n = 1
k = 0
Do
  If n > Len(si) Then Exit Do
  c = Mid$(si, n, 1)
  n = n + 1
  Select Case c
    Case vbCr
      sf = sf & vbCrLf
      wasVbcr = True
      k = 0
    Case vbLf
      If wasVbcr Then
        wasVbcr = False
        k = 0
      Else
        sf = sf & vbCrLf
        wasVbcr = False
        k = 0
      End If
    Case "."
      sf = sf & "." & vbCrLf
      wasVbcr = False
      k = 0
    Case Else
      sf = sf & c
      wasVbcr = False
      k = k + 1
  End Select
  If k = nCar Then
    sf = sf & vbCrLf
    k = 0
  End If
Loop
decoupe = sf
End Function
 

Pièces jointes

  • kaki31-Coupure phrases après 30 caractères et v1.xls
    38 KB · Affichages: 34
Dernière édition:

david84

XLDnaute Barbatruc
Re : Coupure phrases après 30 caractères et après un point (.)

Bonsoir,
@ Grand Chaman Excel : ce pattern semble traiter dès le départ les différentes conditions mais à tester plus avant :
Code:
.Pattern = "([^\.\r\n]{30}|.+[\.\r|\n])"
\r=retour chariot
\n=saut à la ligne
A+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Coupure phrases après 30 caractères et après un point (.)

Re,

Bonjour tout le monde;
Est-il possible d'avoir la phrase dans des cellules différentes ?
Merci :)

Un essai avec une fonction personnalisée adaptée de la précédente decoupe$(x, nCar)
Cette fois-ci, decoupe renvoie un tableau à une dimension dont chacun des éléments contient une ligne du résultat.

Pour accéder aux éléments de decoupe, on utilise la fonction INDEX:
  • premier élément : index(découpe(x;30);1)
  • deuxième élément : index(découpe(x;30);2)
  • ...
  • n ième élément : index(découpe(x;30);n)

Pour avoir successivement 1,2,3,...,n, on s'aide de la fonction LIGNES (si on veut le résultat en colonne) ou de la fonction COLONNES (si on veut le résultat en ligne)

Comme on ne connaît pas à l'avance de nombre d’éléments du résultat, on utilise la fonction SIERREUR pour renvoyer la chaine vide quand on dépasse le nombre d'éléments du résultat.

Voir les différentes formules dans le fichier joint.
 

Pièces jointes

  • kaki31-Coupure phrases après 30 caractères et v2.xls
    46 KB · Affichages: 51
Dernière édition:

Grand Chaman Excel

XLDnaute Impliqué
Re : Coupure phrases après 30 caractères et après un point (.)

@david84
J'ai testé la proposition sur regexpal.com mais le pattern fait pas les séparations correctement où les ponts.
La piste est peut-être bonne, mais je ne maîtrise pas encore assez les RegExp...

@Lone-Wolf, @kaki31,
Voici le code modifié pour afficher le résultats sur des lignes différentes :

VB:
Sub SplitCell2()
    Dim c As Range
    Dim ar
    Dim i As Integer
        
    Application.ScreenUpdating = False

    With CreateObject("vbscript.regexp")
       .Pattern = "(.{30})"
       .IgnoreCase = True
       .Global = True
      
      For Each c In Selection
         ar = Split(c.Value, ". ")
         For i = 0 To UBound(ar) 
            ar(i) = LTrim(ar(i) & "." & vbCrLf)
            ar(i) = Replace(.Replace(ar(i), "$1" & vbCrLf), vbCrLf & " ", vbCrLf)
         Next i
         ar = Split(Join(ar, ""), vbCrLf)
      c.Offset(1, 0).Resize(UBound(ar, 1)) = Application.Transpose(ar)
      Next c
      
    End With
    
    Application.ScreenUpdating = True
End Sub
 
Dernière édition:

Grand Chaman Excel

XLDnaute Impliqué
Re : Coupure phrases après 30 caractères et après un point (.)

et voici le code dans une fonction personnalisée (merci à mapomme pour l'idée !!).
Suffit de sélectionner plusieurs cellules (en ligne ou en colonne) et de valider comme une fonction matricielle avec CTRL+MAJ+ENTER

Le nombre de caractères est aussi un argument.

Exemple d'utilisation :
=DiviseCell(A1, 30) (validé en matriciel)

VB:
Function DiviseCell(rg As Range, NbCar As Integer) As Variant
    Dim c As Range
    Dim ar
    Dim i As Integer

    Application.ScreenUpdating = False

    With CreateObject("vbscript.regexp")
        .Pattern = "(.{" & NbCar & "})"
        .IgnoreCase = True
        .Global = True

        ar = Split(rg, ". ")
        For i = 0 To UBound(ar) 
            ar(i) = LTrim(ar(i) & "." & vbCrLf)
            ar(i) = Replace(.Replace(ar(i), "$1" & vbCrLf), vbCrLf & " ", vbCrLf)
        Next i
        ar = Split(Join(ar, ""), vbCrLf)

    End With
    
    If Application.Caller.Rows.Count > 1 Then
        DiviseCell = Application.Transpose(ar)
    Else
        DiviseCell = ar
    End If

    Application.ScreenUpdating = True
End Function
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Coupure phrases après 30 caractères et après un point (.)

@david84
J'ai testé la proposition sur regexpal.com mais le pattern fait pas les séparations correctement où les ponts.
La piste est peut-être bonne, mais je ne maîtrise pas encore assez les RegExp...
Tu as compris comment l'utiliser et c'est le plus important !
Teste cela pour voir (j'ai retouché légèrement le pattern) :
Code:
Sub Decoupe()
Dim Ma_chaine As String
Dim Mon_RegExp As Object
Dim Toutes_mes_correspondances As Object
Dim Chaque_correspondance As Object

Ma_chaine = Cells(1, 1).Text
Set Mon_RegExp = CreateObject("vbscript.regexp")
With Mon_RegExp
  .Global = True
  .Pattern = "([^\.\r\n]{30}|.+\.|.+\r|.+\n)"
  If .Test(Ma_chaine) = True Then 'teste si au moins une correspondance correspond au pattern
    Set Toutes_mes_correspondances = .Execute(Ma_chaine) 'renvoie un tableau des correspondances
    For Each Chaque_correspondance In Toutes_mes_correspondances
      MsgBox Chaque_correspondance.Value 'renvoie chaque correspondance
    Next
  Else
    MsgBox "Aucune correspondance trouvée"
  End If
End With
Set Mon_RegExp = Nothing
Set Toutes_mes_correspondances = Nothing
Set Chaque_correspondance = Nothing
End Sub

Quelques explications au cas où :
La méthode Test permet de vérifier si le pattern ramène au moins une occurrence (si oui on continue si non on stoppe).
L'objet RegExp te permet grâce à l'utilisation de la méthode Execute de créer un tableau des correspondances trouvées
Code:
Set Toutes_mes_correspondances = .Execute(Ma_chaine)
: c'est l'objet Matches disponible dans l'objet RegExp.
Ensuite il existe également un objet Match (que j'ai appelé dans l'exemple "Chaque_correspondance") qui te permet de ramener chaque correspondance trouvée dans le tableau des correspondances.

La boucle For Each...Next te permet ensuite d'appeler chaque correspondance.
Voilà pour le principe de base. Reste ensuite à peaufiner (à condition que le pattern soit bon bien entendu !).
A+
 
Dernière édition:

Grand Chaman Excel

XLDnaute Impliqué
Re : Coupure phrases après 30 caractères et après un point (.)

@david84
Merci pour les explications.
Le pattern ne semble pas bien fonctionner car il ne découpe pas la phrase correctement après un point.

Exemple :
Texte court. Maintenant un texte de 30 caractères. Texte court. Fin

Sera découpé en un seul segment :
Texte court. Maintenant un texte de 30 caractères. Texte court.

au lieu de :
Texte court.
Maintenant un texte de 30 cara
ctères.
Texte court.
Fin.


J'avais essayé aussi au départ d'avoir un seul pattern mais comme ça ne fonctionnait pas, j'ai opté pour y aller en 2 passes. Premièrement séparer où les points (.) et ensuite à chaque 30 caractères.
Ya sûrement moyen de trouver un pattern qui fait les 2 en même temps. Je vais continuer d'y réfléchir.

A+
 

david84

XLDnaute Barbatruc
Re : Coupure phrases après 30 caractères et après un point (.)

@david84
Merci pour les explications.
Le pattern ne semble pas bien fonctionner car il ne découpe pas la phrase correctement après un point.

Exemple :
Texte court. Maintenant un texte de 30 caractères. Texte court. Fin

Sera découpé en un seul segment :
Texte court. Maintenant un texte de 30 caractères. Texte court.

au lieu de :
Texte court.
Maintenant un texte de 30 cara
ctères.
Texte court.
Fin.


J'avais essayé aussi au départ d'avoir un seul pattern mais comme ça ne fonctionnait pas, j'ai opté pour y aller en 2 passes. Premièrement séparer où les points (.) et ensuite à chaque 30 caractères.
Ya sûrement moyen de trouver un pattern qui fait les 2 en même temps. Je vais continuer d'y réfléchir.

A+

Effectivement cela ne fonctionne pas sur ton dernier exemple...essaie ce pattern pour voir (dans le code de mon dernier message) :
Code:
Pattern = "([^\.\r\n]{30}|[^\.\r\n]{1,29}$|(.+?)\.|(.+?)\r|(.+?)\n)"

Chez moi cela semble fonctionner.
Qu'est ce que cela donne de ton côté ?

Mais bon tu as raison sur le principe : mieux vaut découper le travail en plusieurs étapes quand cela est nécessaire (même si tu trouves un pattern unique mais qu'il est très complexe).
Ceci dit c'est toujours utile de tester des patterns uniques, ne serait-ce que pour en comprendre la construction.
A+
 

david84

XLDnaute Barbatruc
Re : Coupure phrases après 30 caractères et après un point (.)

@david84

Le pattern de ton dernier message fonctionne! Bravo!

Il ne me reste plus qu'à le décortiquer pour bien le comprendre afin de pouvoir le réutiliser un jour (peut-être ?)

Code:
Pattern = "([^\.\r\n]{30}|[^\.\r\n]{1,29}$|(.+?)\.|(.+?)\r|(.+?)\n)"
Ce pattern regroupe 5 possibilités séparées par "|" (qui veut dire "ou")
Code:
(possibilité 1|possibilité 2|possibilité 3|possibilité 4|possibilité 5)
1) Possibilité 1 :
Code:
[^\.\r\n]{30}
: traitement de toutes les parties de chaîne correspondant à 30 caractères "{30}" qui se suivent en excluant le point "\.", le retour chariot "\r" et le saut de ligne "\n".
L'exclusion de ces caractères est due à l'utilisation du signe ^ placé après le crochet de gauche [^\.\r\n]

2) Possibilité 2 :
Code:
[^\.\r\n]{1,29}
: traitement de toutes les parties de chaîne permettant de traiter le cas des caractères de fin de l'exemple qui ne se terminent ni par un point, un retour chariot ou un saut de ligne et dont la longueur n'exède pas 29 caractères (c'est le cas de " Fin" dans l'exemple fourni).
Le signe "$" indique la fin d'une chaîne.

3) Possibilité 3 :
Code:
(.+?)\.
: traitement de toute chaîne se terminant par un point "\."
Le signe "?" placé avant la parenthèse de droite indique au moteur d'expression régulière de s'arrêter au 1er point rencontré. Si l'on ne place pas ce ? le moteur irait chercher le dernier point de la chaîne (c'est ce qu'on appelle la "gourmandise").

4) Possibilité 4 :
Code:
(.+?)\r
: même principe que la possibilité 3 mais avec le retour chariot à la place du point.

5) Possibilité 5 :
Code:
(.+?)\r
: même principe que la possibilité 3 mais avec le saut de ligne à la place du point.

Si tu as besoin de précision, n'hésite pas.
A+
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa