VBA - Garder 6 premiers carratères

Fredox

XLDnaute Occasionnel
Bonjour,

Une nouvelle fois besoin d'aide:

Je souhaiterai sur ma plage "Range("B8:B1008)" garder uniquement les 6 premiers carractères (il n'y a pas d'espace), chaine alphanumérique
Ensuite de voudrais ajouter une espace entre le 3ème et le 4ème caractère.

C'est possible ?

Merci
 

Lolote83

XLDnaute Barbatruc
Re bonjour,
Puisque VBA oblige, alors voilà du VBA
Attention, la macro écrira les résultats en colonne C (Offset0,1). Si autre colonne à prevoir, modifier la valeur 1 en 2 pour D, 3 pour E .....
VB:
Sub SixCaracteres()
    Application.ScreenUpdating = False
    For Each xCell In Range("B8:B1008")
       xCell.Offset(0, 1) = Left(xCell, 2) & " " & Mid(xCell, 3, 1) & " " & Mid(xCell, 4, 2)
    Next xCell
    Application.ScreenUpdating = True
End Sub
@+ Lolote83
 

job75

XLDnaute Barbatruc
Bonjour Fredox, Lolote83,

Avec un tableau VBA c'est toujours plus rapide :
VB:
Sub a()
Dim tablo, i&, x$
With [B8:B1008]
    tablo = .Value 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        x = Replace(tablo(i, 1), " ", "")
        tablo(i, 1) = Trim(Left(x, 3) & " " & Mid(x, 4, 3))
    Next
    .Value = tablo
End With
End Sub
PS : @Lolote83 attention votre formule ne correspond pas à la demande.

A+
 

Lolote83

XLDnaute Barbatruc
Salut Job75,
Bien vu le coup du tableau VBA. J'ai encore du mal a l'utiliser.
Bien vu aussi pour la consigne, je me suis un peut mélangé les pinceaux. un espace de trop.
Finalement, il vaut mieux 2 yeux aguerris plutôt qu'un seul.
@+ Lolote83
 

jmfmarques

XLDnaute Accro
Bonjour
Hé bien je vais vous proposer une solution plus amusante :
Exemple ici avec données en colonne A
VB:
  Dim plage As Range, c As Range
  Application.DisplayAlerts = False 'pour éviter une confirmation d'écrasement
  Set plage = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
  plage.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
        FieldInfo:=Array(Array(0, 1), Array(6, 1)), TrailingMinusNumbers:=True
  For Each c In plage.Cells
    If Len(c.Value) = 6 Then
      c.Value = Format(c.Value, "@@@ @@@")
    End If
 Next
  Application.DisplayAlerts = True
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Bonjour Fredox, Lolote83, Job75, jmfmarques,

Job75, je cherche à comprendre le fonctionnement de la fonction très intéressant "tablo".

Comment modifier vos lignes en #5 pour que le résultat se place par exemple non plus en colonne B de Feuil1 mais en colonne C de Feuil2 ?
Ici on restera sur la même feuille.
Mais j'ai pour objectif, dans une autre application, de :
- conserver le contenu de la colonne B de Feuil1 (utilisée en éléments de Paramètres)
- placer le résultat en colonne C de Feuil2 grâce à votre macro VBA.

Avec ...

VB:
...
  Next
  '.Value = tablo
End With
[I]For i = 8 To 1008
  Cells(i, 3).Value = tablo 'ou encore tablo(i, 1)
Next i[/I]
End Sub

cela n'est pas accepté.
Merci pour votre précieuse aide.
Webperegrino
 

jmfmarques

XLDnaute Accro
Je vois que ma solution amusante n'emballe pas les foules.
Vous la trouvez sans doute trop longue ? -->> Alors voilà du plus court (mais moins amusant) :
VB:
 For Each c In Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Cells
    If Len(c.Value) > 5 Then c.Value = Format(Left(c.Value, 6), "@@@ @@@")
  Next
 

job75

XLDnaute Barbatruc
Bonjour Webperegrino,

tablo n'est pas une fonction, c'est un Array (matrice).

Si l'on part de Feuil1 pour aller sur Feuil2 (CodeNames) :
VB:
Sub b()
Dim tablo, i&, x$
tablo = Feuil1.[B8:B1008] 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = Replace(tablo(i, 1), " ", "")
    tablo(i, 1) = Trim(Left(x, 3) & " " & Mid(x, 4, 3))
Next
Feuil2.[C8:C1008] = tablo
End Sub
A+
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Bonsoir Job75,
Merci pour cette dernière précision.
Vos lignes exécutent le travail plus rapidement.
Cela va beaucoup me servir.
Je prendrai soin de cette trouvaille Array-Matrice et la range dans mon petit lexique "Macros Excel" enrichi grâce à ce Forum, pour d'autres utilisations.
Webperegrino
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil
Je vois que ma solution amusante n'emballe pas les foules.
Vous la trouvez sans doute trop longue ? -->> Alors voilà du plus court (mais moins amusant) :
Personnellement, si utilisation de Données/Convertir : pas besoin de VBA
Mais si il faut faire jouer dans VBE, alors voila comment je joue ;)
VB:
Sub Test()
Six Range("C1")
End Sub
Private Sub Six(R As Range)
Dim SixOnly
SixOnly = Array(Array(0, 1), Array(6, 9))
Columns(R.Column).TextToColumns Destination:=R.Cells(1), DataType:=xlFixedWidth, FieldInfo:=SixOnly
End Sub
NB: Ici dans l'exemple, les données sont en colonne C.
 

Staple1600

XLDnaute Barbatruc
Bonsoir job75

[Gentiment]
A méditer itou:
Ajouter N messages sous prétexte d'amélioration dans une discussion alors que le mode Edition existe, ça ne sert à rien :rolleyes:
(à part incrémenter le compteur de post du répondeur)
[/Gentiment]
+1 pour job75
+1 pour Staple

Qui un jour a parlé du bel esprit XLDien où les membres échangent dans la joie et la bonne humeur...
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 321
Membres
102 862
dernier inscrit
Emma35400