Si c'est seulement une cellule pas besoin de boucler mais juste de ActiveCell !
Sinon il s'agit d'une Selection … (fonctionnant aussi avec une seule cellule …)
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)
Si je veux boucler, on me donne un erreur de type 13 pour la partie For R = 1 To UBound(VA)
Aucun souci de mon côté !
Tout dépend sur quoi tu veux boucler et on ne peut pas répondre avec si peu d'éléments !
De toute manière c'est visuel : il suffit de consulter le contenu de la fenêtre Variables locales …
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)
Je sais que ca génère un tableau (array) mais j'aimerais que la partie VA sois une selection de cellule et non le tout déjà prédéfini
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 Sub Demo1() Dim VA, VD, R&, N& For Each cell In Selection VA = cell.value VD = Sheets("data").UsedRange.Columns("A:B").value Next With CreateObject("VBScript.RegExp") .Global = True .Pattern = " \(\d+.+""\)" For R = 1 To UBound(VA) If Len(VA(R, 1)) > 100 Then VA(R, 1) = .Replace(VA(R, 1), "") If Len(VA(R, 1)) > 100 Then For N = 1 To UBound(VD) If InStr(VA(R, 1), VD(N, 1)) Then VA(R, 1) = Replace(VA(R, 1), VD(N, 1), VD(N, 2)) If Len(VA(R, 1)) < 101 Then Exit For End If Next End If End If Next End With Sheets("Travail").[D2].Resize(UBound(VA)).value = VA End Sub
Tout dépend déjà de la sélection effectuée et sans plus de précision, je ne perds pas de temps en devinettes …
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)
Au lieu de prendre toute les cellules de la colonne B et les traités en lot ... je voudrais que ce sont seulement ceux selectionnés par le curseur de la souris
Par exemple dans le document ci joint je voudrais traité parfois la description 2,3,4 un autre fois la 1 la 5, la 6 parfois toute les descriptions... donc au lieu d'avoir une ligne de code 3 qui défini la colonne B, je voudrais que cela pointe une selection de cellule.
Je suis désolé, je tente d'être le plus claire possible
exemple 2.xlsx
Je viens de faire un essaie avec une description farfelu contenant tous des expressions du lexique et je n'arrive pas au résultats voulu
PERFORATION PERFORATION SUR PLAQUE MUR. PORTE-AIGUILLE POLYMERIQUE PROGRAMMABLE OSCILLATOIRE ACIER INOX. a donné PERFORATION PERFORATION SUR PLAQUE MUR. PORTE-AIG. POLYMERIQUE PROGRAMMABLE OSCILLATOIRE ACIER INOX.
au lieu de PERFORATION PERFORATION SUR PLAQUE MUR. PORTE-AIGUILLE POLYMERIQUE PROGRAMMABLE OSCILLATOIRE INOX.
au lieu que ce sois le dernier groupe de mot ACIER INOX. qui a été remplacé, ca été le porte aiguille.
Donc si je comprend bien, ce n'est pas l'ordre des mot de ma descriptions de départ qui compte mais l'ordre de mon data ... ce qui me cause problème étant donné que certaines descriptions l'importance des mots diffères et j'arrive au meme résultat que ma programmation antérieur ...
J'ai monté dans l'ordre de mon data PERFORATION et c'est le début de ma description qui a été abrégé .... PERFOR. PERFOR. SUR PLAQUE MUR. PORTE-AIGUILLE POLYMERIQUE PROGRAMMABLE OSCILLATOIRE ACIER INOX.
A préciser : la sélection est seulement la n°1 et la n°5 ou de la n°1 jusqu'à la n°5 ?
En fait la sélection même si elle paraît évidente au débutant est un des trucs des plus casses gueules en VBA !
Tout à fait ! J'avais ébauché une version au mot par mot plus rapide mais quand j'ai vu la conception de la feuille data
avec notamment des séquences de mots alors je n'avais plus d'autre choix à part commencer de la feuille data …
Sinon il te faut séparer les mots uniques des séquences de mots (avec un espace séparant chacun d'entre eux) !
Et là enfin définir une stratégie digne de ce nom …
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)
Pour la première partie : Je voudrais que selon ma selection de cellule dans mon document exemple que ce sois seulement ceux selectionner. Parfois ca peut etre seulement 1 et 5 d'autre fois de 1 a 5 ... c'est le pourquoi ma tantadive de boucle afin de selection toute les cellules dans la sélections.
Deuxiement: Effectivement, je crois que la solution na guère d'autre choix d'avoir une fonction split afin de séparer les mots. Le point en commun des descriptions c'est que chacun des mots sont séparé par un espace.
J'avoue que c'est vraiment pas évident ce que je veux faire
Je précise ma pensée au cas où je ne fusse pas assez clair :
il faut au moins deux listes : une pour les séquences de plusieurs mots à remplacer etune autre pour traiter chaque mot individuellement.
Plus définir une stratégie quant à la priorité : l'ordre des mots de la saisie ou l'ordre de la liste des mots individuels …
C'est pourquoi sans clarification une fois pour toute d'une vision globale
de cette horreur de tronçonnage digne des bûcherons du Grand Nord,
je ne perdrais pas de temps à des p'tites retouches au coup par coup
risquant au final d'être aussi droites que la Tour de Pise
et allant même jusqu'à repartir d'une blanche page comme la neige
sur le champ de la belle fermière voisine de la cabane de pêche !
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)
oui je comprends ...
je peux me contenter de mot individuellement et gérer de facon manuel les groupes de mot.
Ce qui est prioritaire c'est vraiment l'ordre des mots de la saisie i.e. l'ordre des mot de la descriptions. Je veux absolument tronquer de droite a gauche.
JE veux éviter de toujours jouer avec mon "data" a chaque demande que je recois ... sinon ca donne rien d'automatiser
Ah oui, donc en ordre inversé !?
Et pourtant avec une feuille data "propre", avec moins de 60 entrées pour le premier classeur exemple
j'ai obtenu un bien meilleur résultat qu'à l'origine : seulement une cellule à corriger manuellement !
Sinon ta nouvelle pièce jointe me laisse encore plus perplexe car déjà elle est vide au niveau de la feuille Travail
et je ne suis pas plus avancé sur ce que tu sélectionnes, se fait dans la colonne B ou dans la colonne D ?!
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)
Oui en ordre inversé
Effectivement étant donné que la plupart des exemples sont très longs et que la plupart des mot sont tronqué ... bref il y a eu des fortes chances que tu sois arrivé pile sur un résultat proche.
JE te joind donc un 3 ieme exemple ... la B est ma selection et D est le résultats ... je te remet dans la colonne D les résultat voulu.
En feuilletant mon Onglet data, tu peux faire des test en mettant dans une description un mot qui est au début du lexique et tu arriveras toujours a une catastrophesexemple 3.xlsx
Merci de ne plus citer l'intégralité du post juste précédent, cela nuit à la lisibilité de cette discussion ‼
Bases à confirmer :
• Traitement via sélection de cellules uniquement dans les colonnes B et F
dont leurs résultats sont affichés respectivement dans les colonnes D et H
et la première ligne est réservée aux titres des colonnes.
Toute cellule sélectionnée en-dehors des colonnes suscitées ne déclenchera rien
en dehors d'un bip de mépris s'il n'y a vraiment aucune cellule à traiter …
• Traitement mot par mot en ordre inversé : du dernier mot vers le premier avec arrêt
si la longueur totale du texte modifié est inférieure ou égale à cent caractères.
• L'ordre des entrées de la feuille data n'a plus aucune incidence …
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)
Désolé pour les reply précédents
Donc Traitement uniquement de la colonne B et résultat dans la D. La première ligne est réservé aux titres de colonnes
Les colonnes en dehors peuvent rien déclencher ou déclencher un BEEP. Dans ma présente sub, j'utilise un offset qui pourrais également me convenir mais effectivement rien déclencher ou un BEEP pourrais etre encore meilleur
Pour le traitement en ordre inversé. Si la colonne B est égale ou inférieur à 100 on copie l'intégralité. Si jamais le B est plus grand que 100, on tronque jusqu'à ce que la description atteinds le plus proche de 100. Cela marchais nickel !!!
encore mille fois merci pour votre aide
Soit la sélection se fait sur les colonnes B & F soit sur les colonnes D & H, à fixer une fois pour toutes …
Si ce sont les colonnes D & H, quelle est la stratégie si elles contiennent déjà un résultat ?
Edit : si le traitement n'est pas applicable aux colonnes F & H alors effectivementla procédure peut se caler via les numéros des lignes de la sélection …
Comme le traitement se fait mot par mot, il y aura plus de modifications à opérer manuellement.Dans l'état actuel de la base data, il y aura 16 cellules sur 23 à corriger.
Pour rappel une seule cellule doit être corrigée via la première démonstration avec une nouvelle base de moins de 60 entrées !
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)
Effectivement, je vais donc essayé le code dans des cas réels afin de voir si la solution est bonne. J'ai actuellement un code qui fais le même principe mais j'arrive a des erreurs supérieur a 40% ce que je ne trouve pas acceptable
10 à 20 pourcents de travaille manuel sur les descriptions après la "sub" est toute a fait convenable à mon avis.
Pour la stratégie pour la sélection ce fait seulement sur la B ... si il y a déjà un résultat dans la colonne D dans la meme ranger que l'item sélectionné dans la colonne B, il faudrait bien sur qu'il se fait écraser !!!
J'ai fait des tests plus approfondies avec la sub demo et ma sub actuel et j'ai moins d'erreur sur ma sub actuel.
MA sub actuel n'a pas besoin de ménage au niveau de la longueurs des mots ... je ne sais pas si il serais plus simple d'utiliser ma sub comme point de départ pour le fameux de droite a gauche ...
Qu'en pense-tu ???
A mon avis deux listes sont nécessaires : l'actuelle pour les mots à traiter individuellement
et une autre pour les séquences de mots ou les mots à supprimer avant de passer au traitement individuel …
Pas de souci pour inverser l'ordre des mots à traiter dans ma démonstration.
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)
Ok super ...
Dans la feuille data dans les colonnes E (source) et F (correction) doivent être listés
les séquences de mots (séparés par un espace, par exemple "BASE EAU" à remplacer par "EAU")
puis les mots isolés à supprimer comme par exemple " A " à remplacer par " " …
Là encore, une fois la base améliorée, le code donnera de meilleurs résultat !
Par rapport à l'exemple 3 j'ai seulement 18 entrées dans la colonne E.
J'ai dû ajouter 7 mots dans la colonne A pour obtenir un résultat identique à la précédente démonstration :
il y a seulement une seule cellule à corriger manuellement !
Les séquences de mots séparés par un espace de la colonne A n'ont aucune chance d'être traités
car chaque mot du texte source est comparé avec le contenu global de chaque cellule de cette colonne …
Par contre il n'y a plus le souci de l'ordre des mots féminins, des pluriels et des singuliers.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49 Sub Demo2() Const C = 100 Dim Rg As Range, oRExp As Object, VD, R&, Rc As Range, T$, SP$(), S$ With Feuil1.UsedRange.Rows("2:" & Feuil1.UsedRange.Rows.Count).Columns Set Rg = Intersect(Union(.Item(2), .Item(6)), ActiveWindow.RangeSelection) End With If Rg Is Nothing Then Beep: Exit Sub Rg.Offset(, 2).Select Set oRExp = CreateObject("VBScript.RegExp") oRExp.Global = True: oRExp.Pattern = " \(\d+.+""\)" VD = Feuil4.UsedRange.Columns("A:B").Value With CreateObject("Scripting.Dictionary") For R = 1 To UBound(VD): .Item(VD(R, 1)) = VD(R, 2): Next VD = Feuil4.[E1].CurrentRegion.Value For Each Rg In Rg.Areas For Each Rc In Rg.Cells T = Rc.Value If Len(T) > C Then T = oRExp.Replace(T, "") If Len(T) > C Then If IsArray(VD) Then For R = 1 To UBound(VD) If InStr(T, VD(R, 1)) Then T = Replace$(T, VD(R, 1), VD(R, 2)) If Len(T) <= C Then Exit For End If Next End If If Len(T) > C Then SP = Split(T) For R = UBound(SP) To 0 Step -1 S = Replace$(SP(R), ",", "") If .Exists(S) Then SP(R) = Replace$(SP(R), S, .Item(S)) T = Join(SP) If Len(T) <= C Then Exit For End If Next If Len(T) > C Then T = Replace$(T, " PR ", " ") End If End If End If Rc.Offset(, 2).Value = T Next Next .RemoveAll End With Set oRExp = Nothing End Sub
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)
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