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

Excel Discussion :

Trouver et remplacer une chaîne de caractèrec dans une autre


Sujet :

Excel

  1. #21
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par elwy07 Voir le message
    le problème est que étant donné que le nombre de balises à supprimer est aléatoire dans la cellule, je ne sais donc pas à l'avance de combien je dois étirer la formule.
    Est-ce que tu connais le nombre minimum et maximum de balises ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  2. #22
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    non, sa va de deux sur à beaucoup malheureusement

  3. #23
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Citation Envoyé par elwy07 Voir le message
    Bonjour

    Alors je viens de tester une des deux solutions (VBA)

    J'ai le message d'erreur "Erreur d'exécution '5': Argument ou appel de procédure incorrecte"

    et sa me sort une erreur sur cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oRng.Offset(i, 0) = Replace(oRng.Offset(i, 0), Mid(oRng.Offset(i, 0), InStr(oRng.Offset(i, 0), "<"), InStr(oRng.Offset(i, 0), ">") - InStr(oRng.Offset(i, 0), "<") + 1), " ")
    Je vais tester la deuxième solution
    Bonjour elwy07,

    Le problème vient du fait que l'une de tes balises est ouvrante mais pas fermante.
    J'ai modifié le code pour prendre en compte ceci :
    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
    Option Explicit
     
    Sub elwy07()
    Dim oRng As Range
    Dim i As Integer
     
    With Worksheets("elwy07")
        Set oRng = .Range("A1")
     
        For i = 0 To .Columns(1).Find("*", , , , , xlPrevious).Row - 1
            Do While InStr(oRng.Offset(i, 0), "<")
                If InStr(oRng.Offset(i, 0), ">") Then
                    oRng.Offset(i, 0) = Replace(oRng.Offset(i, 0), Mid(oRng.Offset(i, 0), InStr(oRng.Offset(i, 0), "<"), InStr(oRng.Offset(i, 0), ">") - InStr(oRng.Offset(i, 0), "<") + 1), "")
                Else
                    oRng.Offset(i, 0) = Replace(oRng.Offset(i, 0), "<", "")
                End If
            Loop
        Next i
     
    End With
     
    End Sub
    N'hésite pas à revenir vers moi !
    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  4. #24
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    On va supposer que tes données sont en A2:A10 (j'ai bien compris qu'il y en a plus mais c'est juste une hypothèse pour expliquer les formules).
    On va supposer qu'il y a entre 1 et 8 balises (s'il y en a plus, il faudra adapter le nombre de colonnes).

    Tu mets 1 en B1.
    En C1, tu mets la formule :
    Et tu copies cette formule de D1 à I1.

    En B2, tu mets la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SIERREUR(SI(STXT(A2;1;1)="<";"";STXT(A2;1;TROUVE("<";A2)-1))&STXT(A2;TROUVE(">";A2)+1;10000);"XXX")
    Tu la copies de C2 à I2.

    En K2, tu mets la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DECALER(A2;0;MIN(SI(B2:I2="XXX";B$1:I$1;1000))-1)
    QUE TU VALIDES AVEC CTRL + SHIFT + ENTREE parce que c'est une formule matricielle.

    Tu recopies l'ensemble B2:K2 sur les lignes suivantes.

    Après ça, tu devrais avoir toutes tes données en colonne K.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #25
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Menhir,

    Juste au passage, je sais que le fichier de elwy07 contient des "<" sans ">" associé au vu de l'erreur de son post...
    Il faut donc ajouter à ta formule la possibilité de supprimer des balises "orphelines"...

    En tout cas, j'aime bien la solution, aussi, avec tes formules.
    Mais je préfère le VBA.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  6. #26
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    alors a priori sa doit marcher, mais comme mon fichier est très volumineux je sature au niveau mémoire du pc. Je le lancerais ce midi afin de le laisser tourner calmement

  7. #27
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    En faite je viens de regarder tourner la macro, elle fait environ 10 a 12 lignes, et après mon fichier bloque, excel ne répond plus.
    Si j'arrête excel et que je le relance mon fichier puis ma macro (les lignes déjà traité sont correcte) il va me faire encore 10 a 12 lignes puis rebelote.

    a ce rythme là je suis pas à mes 76000 lignes ^^.

    Est ce un problème de mémoire pour excel, y a t'il possibilité de vider la mémoire à la fin de chaque traitement de ligne?

  8. #28
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour elwy07,

    Voici pour accélérer la macro :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Option Explicit
     
    Sub elwy07()
    Dim oRng As Range
    Dim i As Long
     
    Application.Visible = False
    Application.Calculation = xlCalculationManual
     
    With Worksheets("elwy07")
        Set oRng = .Range("A1")
     
        For i = 0 To .Columns(1).Find("*", , , , , xlPrevious).Row - 1
            Do While InStr(oRng.Offset(i, 0), "<")
                If InStr(oRng.Offset(i, 0), ">") Then
                    oRng.Offset(i, 0) = Replace(oRng.Offset(i, 0), Mid(oRng.Offset(i, 0), InStr(oRng.Offset(i, 0), "<"), InStr(oRng.Offset(i, 0), ">") - InStr(oRng.Offset(i, 0), "<") + 1), "")
                Else
                    oRng.Offset(i, 0) = Replace(oRng.Offset(i, 0), "<", "")
                End If
            Loop
        Next i
     
    End With
     
    Application.Calculation = xlCalculationAutomatic
    Application.Visible = True
     
    End Sub
     
    Sub réinit()
     
    Application.Calculation = xlCalculationAutomatic
    Application.Visible = True
     
    End Sub
    Je viens de le tester sur ~68k lignes. Ca m'a pris 10 sec.
    Laisse "Excel ne répond plus" -> ne touche à rien !

    Je ne vois pas pourquoi il n'arriverait pas à traiter l'ensemble de tes lignes.

    Si jamais ça plante (on ne sait jamais), lance la macro "réinit" en rouvrant Excel.

    On en reparle dès que tu as fait un test.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  9. #29
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    alors sa me ferme ma fenêtre excel contenant mon tableau, et me laisse celle de vba ouverte avec le message "ne répond pas"

    je laisse tourner comme dit

  10. #30
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Ca fait combien de temps ?
    Tu as quoi comme PC ?

    Moi, je n'ai pas une bête de course :
    Intel(R) Core(TM)2 Quad CPU 2.40GHz
    Ram : 4.00Go

    Quoi qu'il en soit, laisse tourner.
    Ca ne devrait pas prendre 5h ! Tout du moins si dans max 1h ça n'a pas fini... tu peux arrêter la macro.
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  11. #31
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    alors je l'ai laissé tourné plus de une heure avec toujours le blocage.

    Mon pc est un intel(R) Core(TM) i3-2120 CPU 3.30GHz
    ram 4go seven 64bit

    J'ai fait le test de copier les 10000 première lignes (juste les valeurs sans formule ou appel a la base de données) dans une classeur vierge.
    J'ai lancé ta macro, et niquel tout marche.

    Mon fichier dois être trop lourd ou fait appel a trop de formule, ou peut être la liaison avec la base de donnée gène.

    Je vais me faire un classeur avec ta fonction, dans lequel je copierais juste les lignes dont j'ai besoin (après un tri dans mon classeur de départ).
    Cela me permettra quand même de faire le nettoyage des balises HTML.

  12. #32
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Les formules de devraient pas gêner dans le sens où je les "désactive" avant de lancer la macro.
    Ce que je ne maîtrise pas, en revanche, c'est la connexion avec la base.

    Il doit y avoir un moyen de la désactiver pendant le lancement de la macro et tout devrait bien marcher.
    J'ai un PC moins performant et sur ~70k lignes, ca passe en 10 secondes.

    Concernant l'optimisation, je dois t'avouer ne pas trop savoir comment faire pour que la macro soit plus rapide.
    Je réfléchie.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  13. #33
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Déjà ta solution en l'état actuel m'aide beaucoup, je gagne un temps énorme.

    Merci beaucoup, et si tu trouves comment optimiser mieux je prend ^^

    Encore merci

    Elwy

  14. #34
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Ceci peut-être...
    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
    23
    24
    25
    26
    27
    Sub elwy07()
    Dim oRng As Range
    Dim i As Long
     
    Application.Visible = False
    Application.Calculation = xlCalculationManual
     
    With Worksheets("elwy07")
        Set oRng = .Range("A1")
     
        Do While oRng <> ""
            Do While InStr(oRng.Offset(i, 0), "<")
                If InStr(oRng.Offset(i, 0), ">") Then
                    oRng.Offset(i, 0) = Replace(oRng.Offset(i, 0), Mid(oRng.Offset(i, 0), InStr(oRng.Offset(i, 0), "<"), InStr(oRng.Offset(i, 0), ">") - InStr(oRng.Offset(i, 0), "<") + 1), "")
                Else
                    oRng.Offset(i, 0) = Replace(oRng.Offset(i, 0), "<", "")
                End If
            Loop
            Set oRng = oRng.Offset(1, 0)
        Loop
     
    End With
     
    Application.Calculation = xlCalculationAutomatic
    Application.Visible = True
     
    End Sub
    Je ne vois pas bien la différence de temps. Je fais des tests de chrono pour voir.
    Je te tiens au courant.
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  15. #35
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Voici les résultats :
    Sur 206 080 lignes avec un nombre de balises variables (entre 3 ou 4 jusqu'à 20)
    Première macro proposée : 33 sec.
    Deuxième macro proposée : 35 sec.

    Je n'ai fais qu'un test à chaque fois.
    Au vu de ton ordinateur, je pense que ça doit venir de la connexion à la base.
    Les deux macros sont donc similaires.

    Peut-être aussi, redémarre tout le tintouin et relance.

    Bref, je ne sais pas ce que je peux faire de plus.

    N'hésite pas à me tenir au courant !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  16. #36
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Bon malgré plein de tentative, sa marche pas sur mon fichier.

    Mais j'arrive quand même à m'en servir dans un classeur excel sans liaison avec la base de données.
    S'a m'oblige juste a copier mes données une fois triées dans cet autre classeur, mais c pas grave, car cela me fait gagner beaucoup de temps quand même.

    Merci beaucoup pour votre aide, et merci pour le temps passé dessus.

    Cordialement

    Elwy

  17. #37
    Membre expérimenté
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 667
    Points : 1 419
    Points
    1 419
    Par défaut
    Bonjour,

    J'arrive un peu après la guerre mais je me suis dis que la solution suivante pourrait intéresser des gens car elle est générique:
    Elle est basée sur les expressions régulières (ou RegEx voire RegExp selon les écoles).

    Ce ne sera peut-être pas la plus performante (messieurs qui avez déjà fait des mesures, peut-être voudrez-vous bien comparer? ) mais c'est peut-être la plus élégante; je vous laisse en juger:

    1- Dans l'éditeur VBA, "Outils" -> "Références...", cocher "Microsoft VBScript Regular Expressions 5.5".

    2- Créer la fonction suivante dans un module VBA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Public Function SUBSTITUTE_REGEX(rg As Range, patternASubstituer As String, texteDeSubstitution As String) As String
        Application.Volatile
     
        Dim reg As New VBScript_RegExp_55.RegExp
     
        reg.Pattern = patternASubstituer
        reg.Global = True 'True matches all occurrences, False matches the first occurrence
     
        SUBSTITUTE_REGEX = reg.Replace(rg.Value, texteDeSubstitution)
    End Function
    A supposer que le texte à nettoyer soit en case A1, écrire la formule suivante en B1 par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SUBSTITUTE_REGEX($A1;"\<.*?\>";"")

    Comme je le disais plus haut, les expressions régulières ne sont pas toujours plus rapides mais c'est d'un confort incomparable.
    Il est même possible de récupérer des groupes à l'aide de parenthèses pour ensuite réorganiser ces groupes via le texte de substitution: le 1er jeu de parenthèses étant représenté par $1, le 2ème par $2, etc.

    Un exemple simple (qui pourrait être géré par des formules Excel natives mais cela prendrait tout son intérêt sur des exemples plus complexes):
    Mettez en case C1 le texte suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Paris, 75123, 1 rue de la Félicité
    Je souhaite mettre dans l'ordre l'adresse puis le code postal et la ville sans virgule; je mets en D1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SUBSTITUTE_REGEX(C1; "(.*?)\, *(.*?)\, *(.*)"; "$3 $2 $1")
    Le résultat est:
    "1 rue de la Félicité 75123 Paris"
    Le tout sans effort.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/07/2015, 08h41
  2. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 21h06
  3. [Lazarus] Trouver l'occurence n d'un caractère dans une chaîne
    Par [ZiP] dans le forum Lazarus
    Réponses: 2
    Dernier message: 29/05/2013, 21h46
  4. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  5. Remplacer une chaîne de caractères dans une base
    Par Furius dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/10/2005, 23h03

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