patricktoulon
XLDnaute Barbatruc
Bonjour a tous
auteurs Bernard_XLD et patricktoulon
parti de l'idée de job75
et sa fonction splittant une chaîne par la partie numériques avec sa fonction Eclater
Bernard_XLD et moi sommes allés un plus loin et vous proposons la fonction SplitTextNum
cette fonction découpe un texte en colonne ou en ligne dans une fonction matricielle
différence et amélioration par rapport à la version de @job75
démonstration en vba
démonstration sur feuille
Formule en matricielle (4 modes de découpages)
auteurs Bernard_XLD et patricktoulon
parti de l'idée de job75
et sa fonction splittant une chaîne par la partie numériques avec sa fonction Eclater
Bernard_XLD et moi sommes allés un plus loin et vous proposons la fonction SplitTextNum
cette fonction découpe un texte en colonne ou en ligne dans une fonction matricielle
différence et amélioration par rapport à la version de @job75
- autre Système de coupe
- plus de limite du nombre de segment numériques/string
- la formule en matricielle peut être utilisée en vertical ou horizontal (automatique)(voir démo en bas )
- mode selectif en mode non matricielle
- gestion interne du N/A par ajout d'item vide pour les formules matricielles
VB:
'************************************************************************
' Fonction SplitTextNum
'cette fonction consiste à couper une chaîne
'en séparant les chaînes ou une suite de chaînes numériques
'elle peut être utilisée en formule matricielle verticale ou horizontale
'Auteur: patricktoulon et Bernard_XLD sur Exceldownloads
'
'Version: 4.6
'
'Date:04/05/2021
'mise à jour date : 05/05/2021 suppression du premier item vide
'mise à jour date : 06/05/2021 simplification de la gestion d'erreur avec IsEmpty
'mise à jour date : 06/05/2021 ajout de l'argument Espace << OPTIONNEL>>
'pour considérer deux chaînes numériques séparées par un espace
'mise à jour date : 09/05/2021
'suppression du mode espace
'suppression du mode replace des séparateurs, devenu inutile
'mise en place des séparateurs espaces selon le mode directement intégrée dans le moteur de coupe
'remplacement du mode espace par les modes 1, 2, 3 et 4
'------------------------------------------------------
'mode 1 ou omis =splittextnum(A1;1) (les chaînes non numériques ne seront pas séparée et les chaînes numériques avec espaces ne seront pas séparées)
'mode 2 =splittextnum(A1;2) (les chaînes non numériques ne seront pas séparées et les chaînes numériques avec espaces seront séparées )
'mode 3 =splittextnum(A1;3) (les chaînes non numériques seront séparées et les chaînes numériques avec espaces ne seront pas séparées )
'mode 4 =splittextnum(A1;4) (les chaînes non numériques seront séparées et les chaînes numériques avec espaces seront séparées )
'-----------------------------------------------------
'FONCTIONNE AUSSI dans une macro VBA avec les 4 modes
'exemple
'MsgBox Join(SplitTextNum("183 Chemin25 de la Loubiere 83 000 Toulon ", 1), "|") 'chaîne numérique avec espace non considéré
'
'mise à jour date : 10/05/2021
'suppression de la gestion d'erreur, du Err.Clear, du IsEmpty et de Tablo2 devenus inutiles avec Application.Caller
'
'mise à jour date : 10/05/2021
'ajout de l'option selective avec indexPart (non matricielle)
'----------------------------------------------
'exemple
'texte = "toto henry 183 chemin de la Loubiere 83 200 Toulon"
'selectionner la 3 eme partie du texte en mode 1 donc les series numeriques avec espaces ne sont pas séparées
'formule : =splittextnum(A1;1;3) def:=splittextnum(cellule;mode;indexPart)
'renverra dans la cellule "chemin de la Loubiere"
'les 4 modes peuvent etre utilisés en fonction du besoins
'-----------------------------------------------
'************************************************************************
Function SplitTextNum(ByVal Texte$, Optional mode As Byte = 0, Optional IndexPart As Long = -1)
Dim i&, Tablo, z As Boolean
Tablo = Split(StrConv(Trim(Texte), vbUnicode), ChrW(0))
For i = 0 To UBound(Tablo)
If Tablo(i) Like "[0-9]" And z = False Then
If i > 1 Then If Tablo(i - 1) Like "[ ,|]" Then Tablo(i - 1) = "|" Else Tablo(i) = "|" & Tablo(i)
z = True
Else
If Tablo(i) Like "[A-z]" And z = True Then
If Tablo(i - 1) Like "[ ,|]" Then Tablo(i - 1) = "|" Else Tablo(i) = "|" & Tablo(i)
z = False
End If
If i < UBound(Tablo) - 3 And mode = 2 Then If Tablo(i) & Tablo(i + 1) & Tablo(i + 2) Like "#?#" And z = True Then Tablo(i + 1) = "|": z = False
If i < UBound(Tablo) - 3 And mode = 3 Then If Tablo(i) & Tablo(i + 1) & Tablo(i + 2) Like "[A-z]" & " " & "[A-z]" Then Tablo(i + 1) = "|": z = False
If mode = 4 And Tablo(i) = " " Then Tablo(i) = "|"
End If
Next
Tablo = Join(Tablo, "")
If IndexPart > 0 Then
Tablo = Split(Tablo, "|"): If IndexPart - 1 > UBound(Tablo) Then SplitTextNum = "#Bound!": Exit Function
SplitTextNum = Tablo(IndexPart - 1)
Else
With Application
If TypeName(.Caller) = "Range" Then
SplitTextNum = IIf(.ThisCell.Offset(1).Formula = .ThisCell.Formula, .Transpose(Split(Tablo & .Rept("|", .Max(Len(Texte), 255)), "|")), Split(Tablo & .Rept("|", .Max(Len(Texte), 255)), "|"))
Else
SplitTextNum = Split(Tablo, "|")
End If
End With
End If
End Function
démonstration en vba
VB:
Sub test()
MsgBox Join(SplitTextNum("183 Chemin25 de la Loubiere 83 000 Toulon ", 1), "|") 'chaine numerique avec espace non considéré
MsgBox Join(SplitTextNum("183 Chemin25 de la Loubiere 83 000 Toulon ", 2), "|") 'chaine numerique avec espace considéré
MsgBox Join(SplitTextNum("183 Chemin25 de la Loubiere 83 000 Toulon ", 3), "|") 'chaine alpha avec espace considéré et chaine numerique avec espace non considéré
MsgBox Join(SplitTextNum("183 Chemin25 de la Loubiere 83 000 Toulon ", 4), "|") 'alpha + numerique + espace considéré
'text en mode selectif
MsgBox SplitTextNum("183 Chemin de la Loubiere 83 000 Toulon ", 1, 2)
End Sub
démonstration sur feuille
Formule en matricielle (4 modes de découpages)
démonstration des possibilités en matricielle et sélectif sur feuille=SplitTextNum(A1;1) pour 1 l'argument peut etre omis
=SplitTextNum(A1;2)
=SplitTextNum(A1;3)
=SplitTextNum(A1;4)
à valider pour les versions anterieures a 365 par CTR+MAJ+ENTER
pour 365 la touche ENTER suffit
Dernière édition: