XL 2013 remplacer par des vbcrlf les ":" sous condition

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
punaise j'en reviens pas je plante sur un truc pareil depuis plus d'une heure
supposons que j'ai un texte ci dessous
tata: toto : tutu
zaza" : ":titi
truc59: machin
truc: 87 chose: 45 : lolo
taratata: turlututu : blablabla: riri
je voudrais remplacer les ":" par des sauts de lignes uniquement si les ":" sont précédé d'un caractères alpha ou numerique ou autre sauf l'espace et suivi d'un espace
le tout par vba bien sur les formule ne me seront d’aucune utilité dans ce projet
et cela ligne par ligne
ça implique forcément un split du texte au départ

merci pour le coup de main
 
Salut Patrick,
regardes si le code ci-dessous peut convenir :
VB:
Sub test()
    W = Split(Selection, ": ")
    If UBound(W) > 0 Then
        For i = 0 To UBound(W) - 1
            If Right(W(i), 1) <> " " _
            Then W(i) = W(i) & vbLf _
            Else W(i) = W(i) & ": "
        Next
        Selection.Offset(, 1) = Join(W, "")
    End If
End Sub

1746810302431.png
 
bon ben c'est @Cousinhub qui gagne sur ce coup là
un replace global en 3 coup
d'après son idée
Enrichi (BBcode):
Function indentation()
    Dim vbcomp As VBComponent, ligne&, NombreLignes, Newcode, TbL, i&, hascomm As Boolean, phrase$, a&, x&
    Set vbcomp = Application.VBE.ActiveCodePane.CodeModule.Parent
    If vbcomp.CodeModule.CountOfLines = 0 Then Exit Function
    If vbcomp.Name = "IndenterClass" Then MsgBox "Non!! on ne touche pas a la classe d'indentation!!": Exit Function
    ligne = Application.VBE.ActiveCodePane.TopLine
    With Me
        code1 = vbcomp.CodeModule.Lines(1, vbcomp.CodeModule.CountOfLines)
        code1 = Replace(code1, " : ", "||")
        code1 = Replace(code1, ": ", vbCrLf)
        code1 = Replace(code1, "||", " : ")
        code1 = Replace(code1, "&", "&amp;")
        code1 = Replace(code1, "<", "&lt;")
        code1 = Replace(code1, ">", "&gt;")
        code1 = Replace(code1, " _" & vbCrLf, " _LBREAK")
        code1 = Replace(code1, "/", "&#47;")
        code1 = Replace(code1, "\", "&#92;")
        code1 = Replace(code1, """", "&quot;") ' <- les guillemets ne sont pas échappés actuellement
        code1 = Replace(code1, "'", "&#39;")
        
        'pre travail en string
        TbL = Split(code1, vbCrLf)
tiens @fanch55
dezipeur indenteur in one
demo1.gif
 
finalement pour ne pas couper les commentaires qui contiendrait éventuellement les ":" emplaçables
j'ai opté pour le replace ligne par ligne en exceptant les commentaires

autrement dit un peu des deux
je viens de tester @fanche55 sur ton module le plus compliqué et ça match
Enrichi (BBcode):
Function indentation()
    Dim vbcomp As VBComponent, ligne&, NombreLignes, Newcode, TbL, i&, hascomm As Boolean, phrase$, a&, x&
    Set vbcomp = Application.VBE.ActiveCodePane.CodeModule.Parent
    If vbcomp.CodeModule.CountOfLines = 0 Then Exit Function
    If vbcomp.Name = "IndenterClass" Then MsgBox "Non!! on ne touche pas a la classe d'indentation!!": Exit Function
    ligne = Application.VBE.ActiveCodePane.TopLine
    With Me
        code1 = vbcomp.CodeModule.Lines(1, vbcomp.CodeModule.CountOfLines)
        TbL = Split(code1, vbCrLf)
        For i = 0 To UBound(TbL)
            If Left(Trim(TbL(i)), 1) <> "'" Then
                TbL(i) = Replace(TbL(i), " : ", "||")
                TbL(i) = Replace(TbL(i), ": ", vbCrLf)
                TbL(i) = Replace(TbL(i), "||", " : ")
            End If
        Next
        code1 = Join(TbL, vbCrLf)
        ' code1 = Replace(code1, " : ", "||")
        ' code1 = Replace(code1, ": ", vbCrLf)
        ' code1 = Replace(code1, "||", " : ")
         code1 = Replace(code1, "&", "&amp;")
        code1 = Replace(code1, "<", "&lt;")
        code1 = Replace(code1, ">", "&gt;")
        code1 = Replace(code1, " _" & vbCrLf, " _LBREAK")
        code1 = Replace(code1, "/", "&#47;")
        code1 = Replace(code1, "\", "&#92;")
        code1 = Replace(code1, """", "&quot;") ' <- les guillemets ne sont pas échappés actuellement
        code1 = Replace(code1, "'", "&#39;")
 
@Cousinhub
non car le commentaire peut être une éventuelle ligne de code bloquée
et si je le laisse et qu'il y a un ":" qui pourrait être replacé ca va couper la ligne en deux du coup dans le xml il y aura une balise non fermée
et on se retrouve avec une moitié de ligne en rouge dans le vbe après parsing et récupération du ". text" des balises
voir même le domdocument ne charge pas le code dans le . loadxml donc me sort une page vide
 
je voudrais remplacer les ":" par des sauts de lignes uniquement si les ":" sont précédé d'un caractères alpha ou numerique ou autre sauf l'espace et suivi d'un espace
le tout par vba bien sur les formule ne me seront d’aucune utilité dans ce projet
et cela ligne par ligne
Hello,
A titre indicatif cette opération peut être réalisée avec les expressions régulières en une seule instruction mais hélas pas avec le regex du vba qui ne prend pas en compte le "lookbehind". Par contre le regex du dotnet lui le gère. C'est celui-ci que j'utilise dans les fonctions regex de mon complément XlDnaLibJP.
Voici le code qui utilise le RegexReplace de mon complément :
VB:
Sub TestRegex()
Dim elem, arrTest, Utils As Object
Set Utils = CreateObject("XlDnaLibJP.Utils")
arrTest = Array("tata: toto : tutu", _
                "zaza "" : "":titi", _
                "truc59: machin", _
                "truc: 87 chose: 45 : lolo", _
                "taratata: turlututu : blablabla: riri")
For Each elem In arrTest
   Debug.Print Utils.RegexReplace(elem, "(?<=[^ ]{1}): +", vbCrLf)
Next
End Sub
Voici le résultat :
RegexReplace.gif



alors c'est quoi cette expression régulière qui m'a l'air compliquée : (?<=[^ ]{1}): +
le lookbehind c'est cette partie là :
(?<=[^ ]{1})
ce qu'on recherche c'est : + c'est à dire : suivi d'un ou plusieurs espaces mais avec le lookbehind il faut que ce soit précédé par ce que demande le lookbehind, c'est à dire [^ ]{1} qui veut dire pas un caractère espace. Le lookbehind n'est pas "capturé" c'est seulement une condition.
J'espère que cela est assez clair pour vous.

Ami calmant, J.P
 
Bonjour @jurassic pork
en vba on le gère tout simplement avec son index en prenant les deux caractères dans le pattern et le premier comme si c'etait en majuscule
comme on ignore la casse les min et maj seront pris
VB:
Sub testx()
    Dim arrTest, elem, i
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        ' Capture le caractère non-espace, suivi de ": "
        .Pattern = "(\S):\s"

        arrTest = Array( _
            "tata: toto : tutu", _
            "zaza "" : "":titi", _
            "truc59: machin", _
            "truc: 87 chose: 45 : lolo", _
            "taratata: turlututu : blablabla: riri" _
        )

        For i = LBound(arrTest) To UBound(arrTest)
             arrTest(i) = .Replace(CStr(arrTest(i)), "$1" & vbCrLf)
        Next

        Debug.Print Join(arrTest, vbCrLf)
    End With
End Sub
😉
pour info
\S N'importe quel caractère qui n'est pas un espace (lettre, chiffre, symbole, etc.)
en fait c'est comme si je demandais un espace en majuscule et l'espace en majuscule n'existe pas
on considère donc n'importe quel caractere y compris l'espace mais il ne sera pas pris puisque espace maj existe pas
donc au final le \S en maj est le pattern de tout caractère non espace
(\S) Capture de ce caractère (on l'utilise après avec $1 )
: Le caractère deux-points, littéral
\s espace pattern classique de l'espace (espace, tabulation, etc.)
voila
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour