XL 2013 encadré les parties entre guillemet de texte avec caractère particulier

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 je cherche un moyen de faire proprement l'encadrement departie entre guillement de texte

texte original

VB:
Sub test()
    If toto = " ' "" tutu """ And dodo = "" Then
        If toto = 10 And tutu = " "" taratata "" " Then
            tutu = "toto & """" & dada & """" " & """""turlututu"""""
        End If
    End If
End Sub

résultat souhaité le caractère est le "|"
Sub test()
If toto = |" ' "" tutu """ | And dodo = |""| Then
If toto = 10 And tutu = |" "" taratata "" "| Then
tutu = |"toto"| & |""""| & dada & |"""" "| & |"""""turlututu"""""|
End If
End If
End Sub
merci pour vos retours
 
Solution
Bonsoir à tous,

La p'tite fonction VBA à ma pomme :
VB:
Function Encadrer$(ByVal texte$)
Dim gui$, gui2$, res$, i&, n&, cpt&, c$, cc$
   gui = """"
   n = InStr(texte, gui)
   If n = 0 Then Encadrer = texte: Exit Function
   cpt = 1: res = Left(texte, n - 1) & "|" & gui
   For i = n + 1 To Len(texte)
      c = Mid(texte, i, 1): cc = Mid(texte, i + 1, 1)
      If c <> gui Then
         res = res & c
      Else
         If cpt = 0 Then
            res = res & "|" & gui: cpt = 1
         Else
            If cc = gui Then
               res = res & gui & gui: i = i + 1
            Else
               res = res & gui & "|": cpt = 0
            End If
         End If
      End If
   Next i
   Encadrer = res
End Function
Essaie ce code,
mais comme le reste des codes il ne faut pas qu'il ait des commentaires dans le code
Code:
 Function MarkString(aTxt As String) As String
Dim s As String, tb, n As Long
 tb = Split(aTxt, """")
 n = UBound(tb)
 If n < 1 Then
   MarkString = aTxt
   Exit Function
 End If
 tb(0) = tb(0) & "|"
 If (n And 1) = 0 Then
    tb(n) = "|" & tb(n)
 End If
 For I = 2 To n - 1 Step 2
    s = tb(I)
    If Len(s) <> 0 Then
       tb(I) = "|" & s & "|"
    End If
 Next
MarkString = Join(tb, """")
End Function
 
ok @Rheeem
testé elle marche bien aussi moins rapide que @mapomme mais pas de beaucoup

original
'Sub test()
If toto = " ' "" tutu """ And dodo = "" Then 'commentaire "de ligne"
'ligne de commentaire
If toto = 10 And tutu = " "" taratata "" " Then
tutu = "toto" & """" & dada & """"" " & """""turlututu"""""
End If

end Sub
titi = """tata"""
If tut'if le 2d dependant du premier(then) inline 2 recharges variable inline
If Left(Trim(TbL(i)), 3) = "If " Then If TbL(i) Like "* '*" Then comm = "'" & Split(TbL(i), " '")(1): TbL(i) = Split(TbL(i), " '")(0)

'if le 2d dependant du premier(then) inline 2 recharges variable dans le 2d If avec un Else ( inline)
If TypeOf t Is Range Then If t.Areas.Count = 1 Then t = t.Value Else TransposeXV3 = t: Exit Sub
End Sub
resultat
Sub test()
If toto = |" ' "" tutu """| And dodo = |""| Then 'commentaire |"de ligne"|
'ligne de commentaire
If toto = 10 And tutu = |" "" taratata "" "| Then
tutu = |"toto"| & |""""| & dada & |""""" "| & |"""""turlututu"""""|
End If

end Sub
titi = |"""tata"""|
If tut'if le 2d dependant du premier(then) inline 2 recharges variable inline
If Left(Trim(TbL(i)), 3) = |"If "| Then If TbL(i) Like |"* '*"| Then comm = |"'"| & Split(TbL(i), |" '"|)(1): TbL(i) = Split(TbL(i), |" '"|)(0)

'if le 2d dependant du premier(then) inline 2 recharges variable dans le 2d If avec un Else ( inline)
If TypeOf t Is Range Then If t.Areas.Count = 1 Then t = t.Value Else TransposeXV3 = t: Exit Sub
End Sub
 
Les petites comparaisons sont trompeuses essaie avec un module de taille moyenne tu verras que le résultat est sans appel, c'est normal un code qui utilise la concaténation caractère par caractère promet d’être lent au fur et à mesure la taille du code à traité augmente .
à titre d'exemple j'ai fait un test sur ce module volumineux https://www.cadsharp.com/docs/Win32API_PtrSafe.txt du coup l’opération s'est déroulée en une fraction de seconde l'autre méthode était complétement hors course.,,probablement c'est de l'exagération de traiter tout le code en une seule passe et dans le cas vb il est possible de le traiter ligne par ligne qui sera plus judicieux,, là encore le code je proposé n'a pas besoin d'une préparation ou un traitement spécial.donc il est toujours bon de garder un code rapide .
 
tu te méprends dans mon code j'encadre ligne par ligne
et voila ce que j'ai quand je remplace ma fonction Encadrer par la tienne avec le module biblio Api
en gros c'est exactement le contraire de ce que tu dis ta version est bien plus gourmande que celle de @mapomme
1748342070824.png

et maintenant avec la mienne le html est bien produit et conforme
avec la tienne je passe pas le cap de la fonction encadrer donc le reste bien entendu ne suivra pas
1748342339697.png

les deux solution
VB:
Public Function Encadrer2$(ByVal Texte$)
    Dim gui$, gui2$, res$, i&, n&, cpt&, c$, cc$
    'collaborateur sur cette fonction
    '                           @mapomme
    '                           @mromain
   Dim dbg As String
   Dim fiG As String
   dbg = Chr(169)
   fiG = Chr(174)
 
   gui = """"
    n = InStr(Texte, gui)
    If n = 0 Then
        Encadrer2 = Texte
        Exit Function
    End If
    cpt = 1
    res = Left(Texte, n - 1) & dbg & gui
    For i = n + 1 To Len(Texte)
        c = Mid(Texte, i, 1): cc = Mid(Texte, i + 1, 1)
        If c <> gui Then
            res = res & c
        Else
            If cpt = 0 Then
                res = res & dbg & gui
                cpt = 1
            Else
                If cc = gui Then
                    res = res & gui & gui
                    i = i + 1
                Else
                    res = res & gui & fiG
                    cpt = 0
                End If
            End If
        End If
    Next i
    Encadrer2 = res
End Function
et la tienne que j'ai renommé pour tester dans mon environnement
VB:
Function Encadrer2(aTxt) As String
    Dim s As String, tb, n As Long, i&
    Dim dbg As String
    Dim fiG As String
    dbg = Chr(169)
    fiG = Chr(174)
 
tb = Split(aTxt, """")
    n = UBound(tb)
    If n < 1 Then
        Encadrer2 = aTxt
        Exit Function
    End If
    tb(0) = tb(0) & dbg
    If (n And 1) = 0 Then
        tb(n) = fiG & tb(n)
    End If
    For i = 2 To n - 1 Step 2
        s = tb(i)
        If Len(s) <> 0 Then
            tb(i) = dbg & s & fiG
        End If
    Next
    Encadrer2 = Join(tb, """")
End Function

j'ai fait une Nème tentative et au bout d'un moment c'est passé mais c'est toujours plus long
 
- 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

Discussions similaires

Réponses
2
Affichages
954
Réponses
22
Affichages
4 K
Retour