non, sa va de deux sur à beaucoup malheureusement
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 :
N'hésite pas à revenir vers moi !
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
Cordialement,
Kimy
La logique :
Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !
- Plus ya de gruyère, moins ya de gruyère.
- Plus tu pédales moins vite, moins tu avances plus vite.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part =B1+1
En B2, tu mets la formule :
Tu la copies de C2 à I2.
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")
En K2, tu mets la formule :
QUE TU VALIDES AVEC CTRL + SHIFT + ENTREE parce que c'est une formule matricielle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part =DECALER(A2;0;MIN(SI(B2:I2="XXX";B$1:I$1;1000))-1)
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.
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 :
Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !
- Plus ya de gruyère, moins ya de gruyère.
- Plus tu pédales moins vite, moins tu avances plus vite.
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
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?
Bonjour elwy07,
Voici pour accélérer la macro :
Je viens de le tester sur ~68k lignes. Ca m'a pris 10 sec.
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
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 :
Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !
- Plus ya de gruyère, moins ya de gruyère.
- Plus tu pédales moins vite, moins tu avances plus vite.
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
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 :
Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !
- Plus ya de gruyère, moins ya de gruyère.
- Plus tu pédales moins vite, moins tu avances plus vite.
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.
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 :
Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !
- Plus ya de gruyère, moins ya de gruyère.
- Plus tu pédales moins vite, moins tu avances plus vite.
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
Ceci peut-être...
Je ne vois pas bien la différence de temps. Je fais des tests de chrono pour voir.
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 te tiens au courant.
La logique :
Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !
- Plus ya de gruyère, moins ya de gruyère.
- Plus tu pédales moins vite, moins tu avances plus vite.
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 :
Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !
- Plus ya de gruyère, moins ya de gruyère.
- Plus tu pédales moins vite, moins tu avances plus vite.
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
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:
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
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
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:
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 Paris, 75123, 1 rue de la Félicité
Le résultat est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part =SUBSTITUTE_REGEX(C1; "(.*?)\, *(.*?)\, *(.*)"; "$3 $2 $1")
"1 rue de la Félicité 75123 Paris"
Le tout sans effort.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager