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

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

  • Test inversion.xlsm
    19.2 KB · Affichages: 16

Neo37

XLDnaute Junior
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.
 

Jocelyn

XLDnaute Barbatruc
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
 

R@chid

XLDnaute Barbatruc
Supporter XLD
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

  • Neo37_PowerQuery_V1.xlsm
    28.3 KB · Affichages: 2

soan

XLDnaute Barbatruc
Inactif
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

  • Exo Neo37.xlsx
    8.8 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
@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

  • Exo Neo37.xlsm
    14.9 KB · Affichages: 2

Neo37

XLDnaute Junior
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 :p

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
 

soan

XLDnaute Barbatruc
Inactif
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

  • Exo Neo37.xlsm
    14.7 KB · Affichages: 2

Neo37

XLDnaute Junior
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.
 

soan

XLDnaute Barbatruc
Inactif
@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

  • Exo Neo37.xlsm
    14.9 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
314 486
Messages
2 110 115
Membres
110 672
dernier inscrit
CHACHALUBAN