Texte SplitTextNum

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
  • 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)
=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
démonstration des possibilités en matricielle et sélectif sur feuille
1621522079449.png
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
2 K

Statistiques des forums

Discussions
312 069
Messages
2 085 040
Membres
102 764
dernier inscrit
nestu