Microsoft 365 [Résolu] Inverser les derniers caractères d'une plage de cellules

  • Initiateur de la discussion Initiateur de la discussion Neo37
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Neo37

XLDnaute Junior
Bonjour à tous,

Tout se trouve dans le titre, je cherche comment sur VBA, après avoir sélectionner une plage de cellule à la souris, pouvoir cliquer ensuite sur un bouton qui m'inverserait les derniers caractères de toutes les cellules.
Exemple:
A123de4/5 --> A123de5/4
D15F/2 --> D152/F
112fEREr/F --> 112fEREF/r

Pour être plus précis, mes données seront normalement toutes en ****/*, et mon but est d'inverser les caractères qui entoure le slash / , mais au lieu de lui faire reconnaître le slash, trouver 1 caractère à sa gauche et à sa droite, je me dis que s'il est possible de lui demander d'inverser les 3 caractères tout à droite, c'est surement moins compliqué.
Au final j'ai cherché, mais point trouvé.

Si une bonne âme a une idée.
 

Pièces jointes

Même si ça ne te semble pas très clair, merci d'y porter intérêt.

Je ne souhaite pas en extraire une partie, mais en inverser une partie.
Je sais qu'il existe la fonction StrReverse, mais je ne sais comment l'appliquer que sur la fin d'une chaine de caractère.
 
Bonjour le Forum,
Bonjour Neo37, R@chid 🙂,

Principalement pour saluer R@chid, et accessoirement par formule en concervant le STXT() de R@chid cette inversion pourrait s'écrire comme cela

VB:
=GAUCHE(C5;NBCAR(C5)-3)&DROITE(STXT(C5;TROUVE("/";C5)-1;3);1)&"/"&GAUCHE(STXT(C5;TROUVE("/";C5)-1;3);1)

je ne suis pas en mesure de le retranscrire en VBA désolé

Cordialement
 
Bonjour @ tous,
Salut Jocelyn 🙏

@Neo37
Est-ce que tu as toujours à la fin un / et un caractère ou bien le / peut être suivi par plusieurs caractères ?
Si oui, merci la prochaine fois de donner plusieurs cas de figures avec les résultats escomptés.

Une alternative via Power Query
Voir PJ


Cordialement
 

Pièces jointes

Bonsoir Neo37, le fil,

je te propose le fichier ci-joint. 🙂

pour la 1ère ligne :

formule en B1 : =NBCAR(A1)

formule en C1 : =SI(B1<3;"";GAUCHE(A1;B1-3) & DROITE(A1) & "/" & STXT(A1;B1-2;1))

Image.jpg


bien sûr, après avoir compris le mécanisme,
tu peux masquer la colonne B. 😉


soan
 

Pièces jointes

@Neo37, le fil,

Lis d'abord mon post précédent. 🙂

ma solution précédente est une solution par formules ; voici maint'nant une solution VBA.

ouvre le fichier ci-joint, note que la colonne B est vide, et fais Ctrl e ➯ travail effectué ! 😊 dans le code VBA ci-dessous, note que j'ai utilisé StrReverse$() pour les 3 derniers caractères.​

VB:
Option Explicit

Sub Essai()
  Dim n&: n = Cells(Rows.Count, 1).End(3).Row: If n = 1 Then Exit Sub
  Dim s$, k&, i&
  Application.ScreenUpdating = 0: Columns(2).ClearContents: [B1] = "Réf 2"
  For i = 2 To n
    s = Cells(i, 1): k = Len(s)
    If k > 2 Then Cells(i, 2) = Left$(s, k - 3) & StrReverse$(Right$(s, 3))
  Next i
End Sub

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis. 😉

soan
 

Pièces jointes

Merci à tous ceux qui me proposent des solutions.
J'étais en train de faire du étape par étape en découpant et re-assemblant, mais je ne trouve pas ça propre.

Puis j'ai vu le code de Soan, où le StrReverse$ fonctionne bien.
Du coup j’essaie de l'adapter pour mon cas, mais j'ai du mal je l'avoue 😛

Car je veux que la macro s'exécute sur une zone de cellules sélectionnées à la souris juste avant, et que le changement se fasse directement dans ces cellules.
Je tente de l'inclure dans un code de ce style. Suis-je dans le faux sur ma tentative?

VB:
Dim c As Range
For Each c In Selection
'code Soan
Next c
 
Bonjour Neo37,

ouvre le fichier ci-joint ; tu peux voir que A2:A4 est déjà sélectionné ; fais Ctrl e 😊 et ça marchera tout aussi bien au cas où y'a des cellules vides dans ta sélection ; d'ailleurs, les cellules vides et de moins de 3 caractères sont tout simplement ignorées ; tu peux même exécuter la macro sur une sélection dont toutes les cellules sont vides ; il n'y aura pas de plantage, ni autre inconvénient. 🙂

VB:
Option Explicit

Sub Essai()
  Dim cel As Range, s$, k&: Application.ScreenUpdating = 0
  For Each cel In Selection
    s = cel: k = Len(s)
    If k > 2 Then cel = Left$(s, k - 3) & StrReverse$(Right$(s, 3))
  Next cel
End Sub

soan
 

Pièces jointes

Super, ça marche nickel.
Bon j'avais pas prévu un truc, c'est que je vais devoir l'appliquer sur des plages où j'aurai des filtres, donc des lignes cachées. du coup ça me modifie aussi les cellules cachées, ce que je ne souhaite pas.

Mais déjà avec ça, je suis content.

Merci beaucoup Soan, ainsi qu'aux autres.
 
@Neo37

donc des lignes cachées. du coup ça me modifie aussi les cellules cachées, ce que je ne souhaite pas.

alors essaye avec cette autre version. 🙂

* note que la ligne 3 de la sélection en cours est cachée

* fais Ctrl e ➯ ça modifie A2 et A4 : l'inversion est faite

* affiche la ligne 3 ; tu peux voir que A3 est inchangé :
c'est
toujours D15F/2 et pas D152/F. 😊

VB:
Option Explicit

Sub Essai()
  Dim cel As Range, s$, k&: Application.ScreenUpdating = 0
  For Each cel In Selection
    If Not cel.EntireRow.Hidden Then
      s = cel: k = Len(s)
      If k > 2 Then cel = Left$(s, k - 3) & StrReverse$(Right$(s, 3))
    End If
  Next cel
End Sub

soan
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour