Suppression d'un mot sous condition

Bonjour à tous,

J’ai besoin de vos lumières, j’espere que vous pourrez m’aider :slight_smile:
Dans mon exemple ci-joint, si le mot « serti » n’est suivi de rien alors je souhaiterais supprimer le mot « serti ».
Idem, sur la 2eme ligne de mon exemple: Si « ct » est précédé d’un double espace alors je souhaiterais supprimer « ct »

Comment faire pour réaliser cela? Est-ce possible de combiner les formules?
Initialement j’ai un fichier de plus de 100 000 lignes, je voudrais essayer de faire des corrections en masse.

Merci beaucoup à vous pour votre aide précieuse!

Tres bonne soirée, take care

test retrait mot.xlsx (8,7 Ko)

Bonsoir,

essaie avec la formule suivante:

=SI(DROITE(SUPPRESPACE(A1);5)=« Serti »;GAUCHE(SUPPRESPACE(A1);NBCAR(SUPPRESPACE(A1))-6);SUPPRESPACE(A1))

Bonne soirée

Bonjour
Ma solution en VBA
En Feuil2 cliques sur le bouton « Traitement »
Résultat en colonne B
J’ai fais un essai avec 10 000 lignes le traitement prend 1 seconde
Testes le dis moi

https://cjoint.com/c/JDchqWo8xEC

Bonjour,

Un autre possibilité en VBA (10 000 lignes en 8/100 de secondes)
test retrait mots.xlsm (39,3 Ko)

Le code

Sub Cora0402()
Dim dL As Long
Dim pL As Long
Dim ix As Long
Dim tx As Variant
Dim tL As Variant
Const v1$ = "serti"`
Const v2$ = "  ct"`
Const nC$ = "A"                                   ' adapter au nom de la colonne`
pL = 1                                          ' adapter au numéro de la première ligne`
With Worksheets("Feuil1")                       ' adapter au nom de la feuille`
dL = .Cells(.Rows.Count, nC).End(xlUp).Row
tx = .Range(.Cells(pL, nC), .Cells(dL, nC)).Value
For ix = LBound(tx) To UBound(tx)
tL = Split(Trim(tx(ix, 1)), " ")
If LCase(tL(UBound(tL))) = v1 Then tL(UBound(tL)) = Empty
tx(ix, 1) = Trim(Join(tL, " "))
tL = Split(tx(ix, 1), v2)
tx(ix, 1) = Trim(Join(tL, ""))`
Next ix
.Cells(pL, nC).Resize(UBound(tx), UBound(tx, 2)).Value = tx
End With
End Sub

Bonjour à tous,
Un grand merci pour votre aide!
J’ai opté pour la solution de FFO. J’ai adapté le code à mon fichier mais je rencontre un souci: La macro se stoppe à la ligne 35842 sans que je m’explique pourquoi alors que mon fichier s’arrête à la ligne 118 734

Voici la macro adaptée à mon fichier:
Sub Traitement()

’ Traitement Macro

If Range(« EE2 ») <> «  » Then
Range(« EE2 », « EE » & Range(« EE118734 »).End(xlUp).Row).Clear
End If
i = 2
Do While i < Range(« ED118734 »).End(xlUp).Row + 1
ED = UCase(Right(RTrim(Range(« ED » & i)), 6))
EE = Right(Range(« ED » & i), 6)
If UCase(Right(RTrim(Range(« ED » & i)), 6)) = " SERTI" Then
donnée = RTrim(Range(« ED » & i))
Range(« EE » & i) = Replace(Mid(donnée, 1, Len(donnée) - 6), " ct", «  »)
Else
Range(« EE » & i) = Replace(Range(« ED » & i), " ct", «  »)
End If
i = i + 1
Loop


End Sub

D’autre part je connais la base des macros mais je ne suis pas encore une experte. J’ai d’autres règles que je souhaiterais rajouter dans cette même macro, j’ai essayé de les écrire en prenant modèle sur ce que vous aviez écrit mais ça ne marche pas. Puis-je abuser de votre gentillesse et vous demander comment ajouter les règles suivantes à cette macro svp?

  • si je trouve la combinaison de mot «Longueur cm» alors je supprime « Longueur cm » (double espace entre les 2 mots)
  • si je trouve la combinaison de mot «Largeur mm» alors je supprime « Largeur mm » (double espace entre les 2 mots)
  • si je trouve la combinaison de mot «Diamètre mm» alors je supprime « Diamètre mm » (double espace entre les 2 mots)

Pour vous donner un peu de contexte je suis en train de simuler des libellés produits en concaténant tout un tas d’informations produits. Par moment les informations sont manquantes et je souhaite donc cleaner autant que possible les libellés pour avoir le meilleur rendu.

Merci encore

Coralie

Essaies :

Dim dL As Long
Dim pL As Long
Dim ix As Long
Dim tx As Variant
Dim tL As Variant
Const v1$ = "serti"
Const v2$ = "  ct"
Const v3$ = " Longueur  cm"
Const v4$ = " Largeur  cm"
Const v5$ = " Diamètre  cm"
Const nC$ = "ED"
  pL = 2
  With Worksheets("Feuil1")                       ' adapter au nom de la feuille
    .Range(.Cells(pL, nC), .Cells(.UsedRange.Rows.Count, nC)).Offset(0, 1).Clear
    dL = .Cells(.Rows.Count, nC).End(xlUp).Row
    tx = .Range(.Cells(pL, nC), .Cells(dL, nC)).Value
    For ix = LBound(tx) To UBound(tx)
      tL = Split(Trim(tx(ix, 1)), " ")
      If LCase(tL(UBound(tL))) = v1 Then tL(UBound(tL)) = Empty
      tx(ix, 1) = Trim(Join(tL, " "))
      tL = Split(tx(ix, 1), v2)
      tx(ix, 1) = Trim(Join(tL, ""))
      tL = Split(tx(ix, 1), v3)
      tx(ix, 1) = Trim(Join(tL, ""))
      tL = Split(tx(ix, 1), v4)
      tx(ix, 1) = Trim(Join(tL, ""))
      tL = Split(tx(ix, 1), v5)
      tx(ix, 1) = Trim(Join(tL, ""))
    Next ix
    .Cells(pL, nC).Resize(UBound(tx), UBound(tx, 2)).Offset(0, 1).Value = tx
  End With
End Sub ```

Cette ligne conditionne l’arrêt du traitement :

Do While i < Range(« ED118734 »).End(xlUp).Row + 1

Prendre une colonne dont la dernière cellule remplie est sur la dernière ligne
Il faut faire partir cette commande sur la bonne colonne (dernière cellule remplie sur la dernière ligne à traiter) et bien au delà de la dernière ligne sur une cellule qui quelque soit l’ensemble des données à traiter sera de toute façon vide
Si on a de 100 000 lignes à 150 000 lignes potentielles à traiter il faudra prendre une cellule au de là entre les lignes 150 001 à 200 000 par exemple (on a tout intêret à choisir la ligne la plus éloignée)

Donc pour ED il faut mettre (si ED a sa dernière cellule remplie sur la dernière ligne à traiter sinon il faut choisir une autre colonne)

Do While i < Range(« ED200000 »).End(xlUp).Row + 1

Regardes et dis moi

Je rajoute des précisions sur la ligne de code qui détermine la dernière ligne à traiter
Soit on la détermine en dur comme ceci :

Do While i < 118735
tant que i est inferieur à 118735 le traitement continue (i évolue à la fin de chaque passage avec la ligne i = i + 1) c’est à dire donc le traitement se fera jusqu’à la ligne incluse 118734
Maintenant cette solution n’est pas dynamique et si le nombre de lignes évolue il faut intervenir sur cette ligne pour la mettre en adéquation

Soit on la détermine de manière dynamique comme ceci et donc plus d’intervention manuelle :

Do While i < Range(« ED200000 »).End(xlUp).Row + 1

La partie Range(« ED200000 »).End(xlUp).Row va déterminer la ligne de la première cellule qui change d’état par rapport à l’état de la cellule déterminé dans l’instruction Range ici Range(« ED200000 ») et en remontant la colonne précisé par l’instruction End(xlUp)
Si la première cellule Range(« ED200000 ») est à l’état vide l’instruction Range(« ED200000 »).End(xlUp) ira jusqu’à la première cellule en remontant qui sera à l’état non vide
Inversement
Si la première cellule Range(« ED200000 ») est à l’état non vide l’instruction Range(« ED200000 »).End(xlUp) ira jusqu’à la première cellule en remontant qui sera à l’état vide
Et de déterminer le numéro de la ligne :
Range(« ED200000 »).End(xlUp).Row
Comme l’instruction globale traite toute ligne inférieur on rajoute un +1 pour englober dans le traitement la ligne déterminée par la partie Range(« ED200000 »).End(xlUp).Row
C’est l’explication de cette ligne de code :

Do While i < Range(« ED200000 »).End(xlUp).Row + 1

Dans cette esprit si ce traitement englobe plusieurs colonnes il faut impérativement considérer dans son fonctionnement une colonne dont la dernière cellule non vide est sur la dernière ligne à traiter de ces colonnes

J’espère avoir été suffisamment clair
A ta disposition pour des questions éventuelles

Pour tes demandes suivantes :

  • si je trouve la combinaison de mot «Longueur cm» alors je supprime « Longueur cm » (double espace entre les 2 mots)
  • si je trouve la combinaison de mot «Largeur mm» alors je supprime « Largeur mm » (double espace entre les 2 mots)
  • si je trouve la combinaison de mot «Diamètre mm» alors je supprime « Diamètre mm » (double espace entre les 2 mots)

le double espace entre les mots cités nécessite la suppression de l’ensemble mots considérés et de leur double espace
J’espère avoir bien compris
Tu peux donc utiliser ces lignes de codes adaptées en conséquence :

If Range(« EE2 ») <> « » Then
Range(« EE2 », « EE » & Range(« EE118734 »).End(xlUp).Row).Clear
End If
i = 2
Do While i < Range(« ED118734 »).End(xlUp).Row + 1
If UCase(Right(RTrim(Range(« ED » & i)), 6)) = " SERTI" Then
donnée = RTrim(Range(« ED » & i))
Range(« EE » & i) = Replace(Mid(donnée, 1, Len(donnée) - 6), " ct", « »)
Range(« EE » & i) = Replace(Replace(Replace(Range(« EE » & i), « Longueur cm », «  »), « Largeur mm », «  »), « Diamètre mm », «  »)
Else
Range(« EE » & i) = Replace(Range(« ED » & i), " ct", « »)
Range(« EE » & i) = Replace(Replace(Replace(Range(« EE » & i), « Longueur cm », «  »), « Largeur mm », «  »), « Diamètre mm », «  »)
End If
i = i + 1
Loop

J’ai rajouté 2 fois cette ligne :

Range(« EE » & i) = Replace(Replace(Replace(Range(« EE » & i), « Longueur cm », «  »), « Largeur mm », «  »), « Diamètre mm », «  »)

J’ai supprimé ces lignes superflues mises en place par mes soins pour étudier le comportement de mon code à son élaboration
Ces lignes n’ont aucune action :

ED = UCase(Right(RTrim(Range(« ED » & i)), 6))
EE = Right(Range(« ED » & i), 6)

Fais des essais et dis moi

Ca marche c’est génial Merci infiniment!

Merci à tous pour votre aide, ça fonctionne c’est canon!
Tres bonne journée à tous

A bientot

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.