Microsoft 365 Suppression des deux ou trois derniers mots dans cellules

Moreno076

XLDnaute Impliqué
Bonjour à tous,

Je souhaiterais en macro que si dans une colonne commençant par la cellune C2 :

- si le dernier mot de la cellule est "test" ou "essai" alors supprimer les deux derniers mots ;
- si le dernier mot de la cellule est "simul" ou "result" alors supprimer les trois derniers mots.

sinon laisser la cellule comme tel.

Merci pour votre aide
 
Solution
Pour tester la méthode de JM post #11 j'ai lancé cette macro :
VB:
Sub mSuppression()
Dim temps, t As Variant, p&, c As Range
temps = Timer
Application.ScreenUpdating = False
For Each c In Range("C2:C48001")
  t = Split("  " & c) '2 espaces pour avoir au moins 3 mots
    Select Case t(UBound(t))
    Case Is = "test", "essai"
    ReDim Preserve t(0 To (UBound(t) - 2))
    c = Trim(Join(t, " "))
    Case Is = "simul", "result"
    ReDim Preserve t(0 To (UBound(t) - 3))
    c = Trim(Join(t, " "))
    End Select
  Erase t
Next c
MsgBox Timer - temps
End Sub
Elle s'exécute chez moi en 0,35 seconde.

Salut jmfmarques.

sousou

XLDnaute Barbatruc
re
Dans le module sousou j'ai créé ta procédure, pour le moment le résuktat est affiché dans un msgbox pour validation, Je te laisse vérifier, et coupler cela dan ton ensemble
 

Pièces jointes

  • GRv53test.xlsm
    262 KB · Affichages: 9

sousou

XLDnaute Barbatruc
Bien sur, je n'ai pas remplacé la valeur
corrige comme ceci
Sub decoupe()
With Sheets("synthèse")
drlg = .Cells(.Cells(.UsedRange.Columns(3).Rows.Count + 1, 3).End(xlUp).Row, 3).Row
Set Z = .Range(.Cells(16, 3), .Cells(drlg, 3))
'Z.Select
For Each Cel In Z
Set result = Cel
n = InStrRev(Cel, " ")
dmot = Right(Cel, Len(Cel) - n)
r = sitest(dmot)
For nbmot = 1 To r
n = InStrRev(Cel, " ")
Cel = Left(Cel, n - 1)
Next
result.Value = Cel
Next
End With
End Sub
 

sousou

XLDnaute Barbatruc
re
Pour éviter les problèmes de casse, j'ai mis lcase(v) (qui met tout en minuscule)dans la procédure, tu dois donc écrire 'dose' en minuscule.
si tu souhaites tenir compte de la casse alors supprime le lcase(v)
exemple: if v="DOSE".... ect
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

Juste pour le fun (et pour varier les plaisirs)
A n'utiliser qu'en guise de lecture avant d'aller se coucher
(Car en vrai, il y aura surement des effets de bord)
1) Lancer la macro Pour_Test (sur une feuille vierge)
2) Puis lancer la macro mSuppression
VB:
Sub Pour_Test()
With Application
[C2:C5] = .Transpose([{"abc def toto tutu test","jojo titi tutu jaja essai","abc toto tutu simul","tata tutu toto result"}])
End With
End Sub
Sub mSuppression()
Dim t As Variant, p&, c As Range
For Each c In Range("C2:C5")
  t = Split(c)
    Select Case t(UBound(t))
    Case Is = "test", "essai"
    For p = 0 To UBound(t) - 1
    t(p) = t(p)
    Next
    ReDim Preserve t(0 To (UBound(t) - 2))
    c = Join(t, " ")
    Case Is = "simul", "result"
    For p = 0 To UBound(t) - 1
    t(p) = t(p)
    Next
    ReDim Preserve t(0 To (UBound(t) - 3))
    c = Join(t, " ")
    End Select
  Erase t
Next c
End Sub
Normalement, on obtient ce qui est décrit en message#1
;)
 

job75

XLDnaute Barbatruc
Bonjour Moreno076, sousou, JM,

Une solution assez simple, toujours avec Split :
VB:
Sub Epurer()
Dim tablo, i&, x$, s, ub%, y$
With Sheets("Synthèse").UsedRange.Columns(3)
    tablo = .Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
    For i = 2 To UBound(tablo)
        x = tablo(i, 1)
        s = Split(x)
        ub = UBound(s)
        If ub > -1 Then
            y = LCase(s(ub))
            If (y = "test" Or y = "essai") And ub > 0 Then tablo(i, 1) = Trim(Left(x, Len(x) - Len(s(ub - 1) & y) - 1))
            If (y = "simul" Or y = "result") And ub > 1 Then tablo(i, 1) = Trim(Left(x, Len(x) - Len(s(ub - 2) & s(ub - 1) & y) - 2))
        End If
    Next
    '---restitution---
    If .Parent.FilterMode Then .Parent.ShowAllData 'si la feuille est filtrée
    .Value = tablo
End With
End Sub
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 789
Messages
2 092 125
Membres
105 226
dernier inscrit
Pepecham