IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Une fonction pour échapper les caractères spéciaux en XML ? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut Une fonction pour échapper les caractères spéciaux en XML ?
    Bonjour,

    J'ai un projet Excel VBA dans lequel j'utilise le CustomUI, et j'ai besoin de produire dynamiquement des libellés encodés en XML, donc avec les guillemets remplacés par ", et tous les autres codes nécessaires. J'ai googlé et trouvé le moyen de faire des trucs bcp plus compliqués comme parser un fichier XML, mais je ne trouve rien pour simplement échapper les caractères spéciaux d'un texte. Il doit bien y avoir un truc prévu pour ça ?

    Merci pour toute piste !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Bonjour,

    voir du côté de la simple fonction VBA Replace

    Et si j'ai mal compris, présenter alors explicitement une source et un résultat attendu !


    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Le Replace me permettrait de gérer un seul cas, ou bien de prévoir chacun des cas, mais je cherche quelque chose de plus standard...

    En gros, disons que je cherche à faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Txt = "Il a dit : ""ça boume ?"""
    Txt2 = une_fonction_ou_autre_systeme(Txt)
    ' Txt2 doit être encodé ainsi : 
    "Il a dit : &quot ;ça boume ?&quot ;"
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Là en VBA je ne vois pas mieux que cette fonction.

    Avec une variable tableau contenant source et conversion (ou encore via une feuille de paramétrages),
    il suffit de boucler sur chaque indice et d'effectuer le remplacement …

    Maintenant il existe peut-être dans un autre langage une fonction effectuant cette conversion
    (exemple du JScript pour le JSON) et si c'est interfaçable avec le VBA, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Regardes du côté des expressions rationnelles, je ne suis pas féru en la matière, mais tu replace tout en un seule passe!
    Dernière modification par AlainTech ; 24/10/2015 à 14h09.

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut





    Autre voie : ne pas échapper mais tout encoder en UTF-8 via ADODB.Stream
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    Bonjour,
    Regardes du côté des expressions rationnelles, je ne suis pas féru en la matière, mais tu replace tout en un seule passe!
    Moi je connais bien, mais c'est le même inconvénient, je dois gérer moi-même la liste des remplacements à effectuer.

    Citation Envoyé par Marc-L Voir le message

    Autre voie : ne pas échapper mais tout encoder en UTF-8 via ADODB.Stream
    En fait il y a même MSXML2, mais je ne comprends absolument pas comment ça marche...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    test avec replace de VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test_avec_replace_VBA()
        Dim i As Long, txt As String
        a_remplacer = Array("ç", "é")
        remplacement = Array("ccedil;", "e")
        txt = "Il a dit : ""ça boume ?""" & vbCrLf
        txt = txt & "mais je  soupçonné qu'il me mént" & vbCrLf
        txt = txt & "ça ne mé fait pas rire "
        For i = LBound(a_remplacer) To UBound(a_remplacer)
            txt = Replace(txt, a_remplacer(i), remplacement(i))
        Next
        MsgBox txt
    End Sub
    test avec regular_replace (expression régulieres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub TEST_avec_regular()
        Dim txt As String, a_remplacer(), remplacement(), valeur1 As String, valeur2 As String
        txt = "Il a dit : ""ça boume ?""" & vbCrLf
        txt = txt & "mais je  soupçonné qu'il me mént" & vbCrLf
        txt = txt & "ça ne mé fait pas rire "
        a_remplacer = Array("ç", "é")
        remplacement = Array("ccedil;", "e")
        For i = LBound(a_remplacer) To UBound(a_remplacer)
          valeur1 = a_remplacer(i): valeur2 = remplacement(i)
            txt = regular_replace(txt, valeur1, valeur2)
        Next
        MsgBox txt
    End Sub
    Function regular_replace(txt As String, Aremplacer As String, remplace As String)
        With CreateObject("VBScript.RegExp")
            .Global = True
            '.IgnoreCase = True
            .Pattern = Aremplacer
            regular_replace = .Replace(txt, remplace)
        End With
     
    End Function
    malheureusement dans ton cas on ne peut pas mettre tout les caracteres a remplacer dans le patern xcar la fonction replace de regexp remplace avec le meme caracteres on est donc obligé de bouclé sur un array

    j'avais une autre solution avec régular mais je ne la trouve plus je vais chercher
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Merci pour vos contributions. Néanmoins, je crois que j'ai mal exprimé mon problème : si je lis bien la page Wikipédia sur les entités XML, il y a 257 remplacements à effectuer. Je ne sais même pas si cette liste est suffisante.

    Je cherche à savoir s'il existe une solution standard, pas une où je dois spécifier moi-même les remplacements à effectuer.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    bonjour,

    tu parle XML ... si tu regarde mieux ton lien en XML tu n'as que 5 caractères .... t'en faut-il plus ?

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    En fait je ne sais pas trop ce qui est susceptible de bugger ou non, d'où ma recherche d'un truc standard. Mais tu as raison, je vais faire du crash-test sur des trucs utiles mais tordus comme Ç, ÿ, œ, et voir si par chance les cinq caractères "prédéfinis" suffiraient...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    si je me réfère a l'exemple que tu a donné au depart la réponse est non!

    dans le cadre du remplacement d'un ou d'une serie de caracteres de a à z tu est obligé de travailler sur un array que tu aurais préalablement établi

    maintenant si tu parle des caractères formant les balises c'est comme pour le html ( innerhtml/innertext) il y a des solutions
    voici le fichier xml dans un msgbox sans les balises avec les expressions régulières
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Test2()
    Dim i As Long, Txt As String, Txt2 As String
    myFile = "C:\Users\polux\Desktop\test.xml"
    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
         Txt = Txt & textline
    Loop
    Close #1
         With CreateObject("VBScript.RegExp")
          .Global = True
          '.IgnoreCase = True
          .Pattern = "[^\w]"
          Txt2 = .Replace(Txt, vbCrLf)
        Txt2 = Replace(Txt2, vbCrLf & vbCrLf & vbCrLf, "")
        End With
       MsgBox Txt2
     
    End Sub
    apres il y a efectivement l'object("microsoft.xmlhttp) ou tu peut detailler dans les noeuds mais pour un replace particulier je pense qu'un array doit etre etabli quand meme


    EDIT:
    je viens d'esayer avec des caractères particuliers (ç,ÿ,ô)etc.... ils sont supprimés aussi
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    @patrick : en fait j'essaie de préserver mes caractères spéciaux, pas de les supprimer.

    @bbil : je viens de tester #@ÇçÿŒœ…éûÜÛ sans y croire, ils sont tous restitués correctement

    Je cherchais un truc inutile, je comprends mieux pourquoi ça n'existe pas.

    Je vais me faire une fonction qui empaquette les cinq Replace, et ce sera .

    Merci à tous !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction pour éviter les caractères spéciaux
    Par yousra01 dans le forum JDBC
    Réponses: 3
    Dernier message: 14/03/2011, 09h57
  2. Réponses: 6
    Dernier message: 21/04/2008, 18h49
  3. Réponses: 5
    Dernier message: 13/11/2007, 22h00
  4. [SQLite] Échapper les caractères spéciaux d'une requête ?
    Par Franz2 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/03/2007, 13h17
  5. une fonction pour enlever les doublons d'un array
    Par secteur_52 dans le forum Delphi
    Réponses: 1
    Dernier message: 27/06/2006, 13h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo