Séparer valeur numérique + texte d'une cellule

Madjon6

XLDnaute Occasionnel
Bonjour,

J'ai une colonne que je souhaite diviser en 2 colonnes. l'une contiendra les valeurs numérique et l'autre le texte.

Exemple :

Colonne D
539482.39894707Statut refusé

Deviendra :

Colonne D Colonne E
539482.39894707 Statut refusé


Je ne sais pas si c 'est possible avec l'option convertir.

Merci à vous

Merci pour votre aide
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Sylvain. B :),

Une version avec une fonction personnalisée utilisable aussi bien sur la feuille de calcul (voir en feuille "Feuil2") qu'au sein d'une macro VBA.

Le code de la fonction est dans module1 :
VB:
Function NumDeb(xText, Optional xFIN)
Dim i As Long, c As String * 1
   xText = Trim(xText)
   For i = 1 To Len(xText)
      c = Mid(xText, i)
      Select Case c
         Case "0" To "9", ".":
         Case Else:       Exit For
      End Select
   Next i
   If IsMissing(xFIN) Then NumDeb = Left(xText, i - 1) Else NumDeb = Mid(xText, i)
End Function


Le code pour la feuille "Feuil1" est dans le module de la feuille "Feuil1". La colonne B est mise à jour dès qu'une valeur change en colonne C ou bien qu'on revalide une cellule en colonne C.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim der&, t, i&
   On Error GoTo FIN
   If Not Intersect(Columns("c:c"), Target) Is Nothing Then
      On Error GoTo FIN
      If Me.FilterMode Then Me.ShowAllData
      Application.EnableEvents = False
      Columns("b:b").ClearContents
      der = Cells(Rows.Count, "c").End(xlUp).Row
      t = Columns("c:c").Resize(der)
      'si vous désirez le texte final alors écrivez : = NumDeb(t(i, 1),1) dans la ligne qui suit
      For i = 1 To UBound(t): t(i, 1) = NumDeb(t(i, 1)): Next
      Columns("b:b").Resize(der).NumberFormat = "@"
      Columns("b:b").Resize(der) = t
   End If
FIN:
   Application.EnableEvents = True
End Sub
 

Pièces jointes

  • Sylvain. B- Début ou fin- v1.xlsm
    27.9 KB · Affichages: 9

Sylvain. B

XLDnaute Nouveau
Bonjour @Sylvain. B :),

Une version avec une fonction personnalisée utilisable aussi bien sur la feuille de calcul (voir en feuille "Feuil2") qu'au sein d'une macro VBA.

Le code de la fonction est dans module1 :
VB:
Function NumDeb(xText, Optional xFIN)
Dim i As Long, c As String * 1
   xText = Trim(xText)
   For i = 1 To Len(xText)
      c = Mid(xText, i)
      Select Case c
         Case "0" To "9", ".":
         Case Else:       Exit For
      End Select
   Next i
   If IsMissing(xFIN) Then NumDeb = Left(xText, i - 1) Else NumDeb = Mid(xText, i)
End Function


Le code pour la feuille "Feuil1" est dans le module de la feuille "Feuil1". La colonne B est mise à jour dès qu'une valeur change en colonne C ou bien qu'on revalide une cellule en colonne C.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim der&, t, i&
   On Error GoTo FIN
   If Not Intersect(Columns("c:c"), Target) Is Nothing Then
      On Error GoTo FIN
      If Me.FilterMode Then Me.ShowAllData
      Application.EnableEvents = False
      Columns("b:b").ClearContents
      der = Cells(Rows.Count, "c").End(xlUp).Row
      t = Columns("c:c").Resize(der)
      'si vous désirez le texte final alors écrivez : = NumDeb(t(i, 1),1) dans la ligne qui suit
      For i = 1 To UBound(t): t(i, 1) = NumDeb(t(i, 1)): Next
      Columns("b:b").Resize(der).NumberFormat = "@"
      Columns("b:b").Resize(der) = t
   End If
FIN:
   Application.EnableEvents = True
End Sub
Bonjour @mapomme

SUPER :) Merci beaucoup

Ça fonctionne parfaitement, mais pensez-vous qu'il serait possible d'avoir les valeurs numériques en colonneA de ma feuille juste en cliquant sur un bouton ?
A partir de la cellule A9 qui ne change jamais jusqu'à la dernière ligne qui elle peut changer.

Ensuite j'applique une formule qui devra me donner le nombre de ventes de cette référence (valeur numérique), avec le code que vous m'avez très gentiment donné :) (merci encore) ma formule ne fonctionne pas car dans la cellule cible excel trouve une formule (=numdebC9) par exemple est non une valeur.

Je débute sur excel, j’espère que je suis suffisamment clair dans mes explications.
Merci beaucoup pour votre aide.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Ça fonctionne parfaitement, mais pensez-vous qu'il serait possible d'avoir les valeurs numériques en colonneA de ma feuille juste en cliquant sur un bouton ?
A partir de la cellule A9 qui ne change jamais jusqu'à la dernière ligne qui elle peut changer.

Ensuite j'applique une formule qui devra me donner le nombre de ventes de cette référence (valeur numérique), avec le code que vous m'avez très gentiment donné :) (merci encore) ma formule ne fonctionne pas car dans la cellule cible excel trouve une formule (=numdebC9) par exemple est non une valeur.
Bonjour @Sylvain. B :),

Personnellement, je veux bien tout faire mais pour le faire bien, j'aimerai du concret c'est à dire votre classeur ou bien un petit classeur exemple qui sera le reflet exact de votre classeur original pour ne pas coder dans le vide.

Alors à plus ;).
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Une solution par formule matricielle en B1 :
Code:
=GAUCHE(C1;EQUIV(FAUX;EXACT(MAJUSCULE(STXT(C1;LIGNE(INDIRECT("1:"&NBCAR(C1)));1));MINUSCULE(STXT(C1;LIGNE(INDIRECT("1:"&NBCAR(C1)));1)));0)-1)
A valider par Ctrl+Maj+Entrée et tirer vers le bas.

Elle repère la 1ère lettre.

A+
 

Pièces jointes

  • Classeur(1).xlsx
    17.1 KB · Affichages: 1

Sylvain. B

XLDnaute Nouveau
Bonjour @Sylvain. B :),

Personnellement, je veux bien tout faire mais pour le faire bien, j'aimerai du concret c'est à dire votre classeur ou bien un petit classeur exemple qui sera le reflet exact de votre classeur original pour ne pas coder dans le vide.

Alors à plus ;).
Bonjour @mapomme,

Je comprends.
Puis-je vous envoyer mon fichier exemple en privé dans un souci de confidentialité ?
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonjour le fil,
Vu que le format a l'air d'air fixe (Nbre sur la 25 premiers caractères, texte ensuite) Données, Convertir convient tout à fait, largeur fixe, curseur sur la colonne 25 , Avancé dans l'écran 3 : séparateur décimal = .
Avec une petite macro si c'est un travail répétitif :
Données importées en colonne A; restituées en colonnes A et B
Enrichi (BBcode):
Sub Séparer()
     With ActiveSheet
          .Cells(9, 1).Resize(.Cells(.Rows.Count, 1).Row).TextToColumns Destination:=.Cells(9,1), _
                                                                        DataType:=xlFixedWidth, _
                                                                        Fieldinfo:=Array(Array(0, 1), Array(25, 1)), _
                                                                        DecimalSeparator:="."
     End With
End Sub

EDIT : Prise en compte du début en A9

Voir la PJ
A bientôt
 
Dernière édition:

Sylvain. B

XLDnaute Nouveau
Bonjour le fil,
Vu que le format a l'air d'air fixe (Nbre sur la 25 premiers caractères, texte ensuite) Données, Convertir convient tout à fait, largeur fixe, curseur sur la colonne 25 , Avancé dans l'écran 3 : séparateur décimal = .
Avec une petite macro si c'est un travail répétitif :
Données importées en colonne A; restituées en colonnes A et B
Enrichi (BBcode):
Sub Séparer()
     With ActiveSheet
          .Cells(9, 1).Resize(.Cells(.Rows.Count, 1).Row).TextToColumns Destination:=.Cells(9,1), _
                                                                        DataType:=xlFixedWidth, _
                                                                        Fieldinfo:=Array(Array(0, 1), Array(25, 1)), _
                                                                        DecimalSeparator:="."
     End With
End Sub

EDIT : Prise en compte du début en A9

Voir la PJ
A bientôt
Bonjour @AtTheOne ,

C'est un peu plus compliqué que ça, désolé je n'ai pas été très malin plutôt que de créer un sujet j'ai posé la question à un XLDnaute sur un vieux sujet de 2010 avec son fichier à lui.
J'ai essayé votre code mais je n'arrive évidemment pas à l'appliquer à mon fichier, je débute vraiment !

Voici à quoi ressemble mon fichier et donc les infos que j'ai besoin de dissocier :
1680954864673.png


La colonne C est à dissocier et les valeurs numériques peuvent apparaître en colonne B si on peut écraser le contenu de cette colonne au passage avant de copier les valeurs numériques récupérés.

Les infos à dissocier commenceront toujours en C9 et non en C10 comme sur la capture ci-jointe, en revanche le nombre de lignes change tous les jours mais plus de 500 lignes par jours à traiter.

Ce qui est important c'est que les valeurs numériques soient restituées tel qu'elles sont dans le fichier avant le "-" qui sépare la référence (valeur numérique) de la désignation car ensuite j'applique des formules pour rattacher ces références à une famille de produit et en récupérer le CA et la marge.
Je peux vous envoyer un fichier exemple plus détaillé en privé si vous le souhaitez ?
Merci beaucoup pour votre aide.
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Re bonjour,
En prenant la plage utilisée de la colonne C (à partir de C9) comme source et comme cible la cellule B9
Je remplace d'abord la chaine " - " par "§", et j'utilise donnée conversion avec comme séparateur "§" :
VB:
Sub SéparerNew()

     With ActiveSheet
          Set Rg = .Cells(9, 3).Resize(.Cells(.Rows.Count, 3).End(xlUp).Row)
     End With
     Rg.Replace What:=" - ", Replacement:="§", LookAt:=xlPart
    
     Application.DisplayAlerts = False
     Rg.TextToColumns Destination:=Rg.Cells(1).Offset(0, -1), DataType:=xlDelimited, _
                                                              Other:=True, OtherChar:="§", _
                                                              FieldInfo:=Array(Array(1, 1), Array(2, 1)), DecimalSeparator:="."
     Application.DisplayAlerts = True

End Sub

Voir la pièce jointe
A bientôt
 

Pièces jointes

  • exemple1234 AtTheOne 2.xlsm
    19.5 KB · Affichages: 2

Sylvain. B

XLDnaute Nouveau
Re bonjour,
En prenant la plage utilisée de la colonne C (à partir de C9) comme source et comme cible la cellule B9
Je remplace d'abord la chaine " - " par "§", et j'utilise donnée conversion avec comme séparateur "§" :
VB:
Sub SéparerNew()

     With ActiveSheet
          Set Rg = .Cells(9, 3).Resize(.Cells(.Rows.Count, 3).End(xlUp).Row)
     End With
     Rg.Replace What:=" - ", Replacement:="§", LookAt:=xlPart
   
     Application.DisplayAlerts = False
     Rg.TextToColumns Destination:=Rg.Cells(1).Offset(0, -1), DataType:=xlDelimited, _
                                                              Other:=True, OtherChar:="§", _
                                                              FieldInfo:=Array(Array(1, 1), Array(2, 1)), DecimalSeparator:="."
     Application.DisplayAlerts = True

End Sub

Voir la pièce jointe
A bientôt
Re @AtTheOne
Re à toute la communauté XLDnaute

C'est super ça fonctionne parfaitement c'est fluide, rapide et efficace, tout ce que j'aime ;)
Merci infiniment @AtTheOne pour votre aide, la communauté est vraiment top ici.

Un grand MERCI à tout ceux qui m'ont aidé @job75 , @JHA et @mapomme (à qui j'ai demandé encore un peu d'aide pour une mission un peu plus complexe)
Et merci également à tout ceux qui ont pris le temps de me lire.
Excellente soirée et très bon weekend de pâques à toute et tous.
 

Discussions similaires

Statistiques des forums

Discussions
312 290
Messages
2 086 840
Membres
103 399
dernier inscrit
Tassiou