Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Extraire des caractères alphabétiques de longueur variable

YA1

XLDnaute Nouveau
Bonjour et merci pour ce tuto
Je cherche une formule qui permet d'extraire les caractères alphabétiques de longueur variable placés n'importe ou au milieu d'une chaine alphanumérique dont la longueur peut aussi varier
Merci par avance pour toute aide
 

soan

XLDnaute Barbatruc
Inactif
Bonjour YA1, le fil,

Bienvenue sur le site XLD !

J'ai une idée pour t'aider, mais envoie un fichier sans données confidentielles avec quelques exemples suffisamment représentatifs de tes données alphanumériques. (pour éviter toute ambiguïté, indique quels sont les résultats attendus)

soan
 

YA1

XLDnaute Nouveau
Bonjour et merci beaucoup Soan pour ton aide,
j'attache un fichier avec deux colonnes : la première est celle des données importées, il n'y' a pas de structuration standard dans ces données ( longueur, emplacement des lettres ) Par contre les lettres sont en un seul bloc , j'essaie d'extraire uniquement les lettres
le deuxième est donc ce que je voudrais obtenir automatiquement
merci beaucoup
 

Pièces jointes

  • Exemple - Extraction donnéées alphabétiques.xlsx
    8.7 KB · Affichages: 5

soan

XLDnaute Barbatruc
Inactif
Bonsoir YA1,

ton fichier en retour ; fais Ctrl e ➯ travail effectué ! j'ai utilisé la méthode des tableaux, alors ça sera très rapide, même sur plusieurs milliers de lignes ; mais si dans ton fichier réel les données ne sont pas à partir de C5, il faudra adapter le code VBA ; même chose si l'emplacement des résultats n'est pas à partir de D5 ; je parle de la ligne 5 car c'est la 1ère ligne de données (la ligne d'en-têtes étant en ligne 4).​

VB:
Option Explicit

Sub Essai()
  Dim n&: n = Cells(Rows.Count, 3).End(3).Row
  If n = 4 Then Exit Sub
  Dim T, s1$, s2$, c1$, c2%, p%, k%, i&
  n = n - 4: T = [C5].Resize(n, 2)
  For i = 1 To n
    s1 = T(i, 1): k = Len(s1)
    If k > 0 Then
      s2 = ""
      For p = 1 To k
        c1 = Mid$(s1, p, 1): c2 = Asc(c1)
        If c2 >= 65 And c2 <= 90 Then s2 = s2 & c1
      Next p
      If s2 <> "" Then T(i, 2) = s2
    End If
  Next i
  Application.ScreenUpdating = 0
  [D5].Resize(n) = Application.Index(T, Evaluate("Row(" & "1:" & n & ")"), 2)
End Sub

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

soan
 

Pièces jointes

  • Exemple - Extraction donnéées alphabétiques.xlsm
    15.3 KB · Affichages: 4
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
=>YA1

voici un deuxième fichier ; cette fois l'opération est faite « à la volée ».

* en C5, saisis « 58HM » ➯ en D5 : HM

* en C5, remplace « 58HM » par « 32DG45 » ➯ en D5 : DG

* en C5, appuie sur la touche Suppression ➯ c'est vide en D5

ça marchera pareil pour toute autres saisie en C6 ou dessous ; si les données sont déjà présentes comme c'est le cas en C6:C11, va successivement sur chaque donnée, puis appuie sur les touches F2 puis Entrée.​

VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
  With Target
    If .CountLarge > 1 Then Exit Sub
    If .Column <> 3 Then Exit Sub
    If .Row < 5 Then Exit Sub
    Dim s1$, s2$, c1$, c2%, p%, k%
    s1 = .Value: k = Len(s1)
    If k = 0 Then .Offset(, 1) = Empty: Exit Sub
    s2 = ""
    For p = 1 To k
      c1 = Mid$(s1, p, 1): c2 = Asc(c1)
      If c2 >= 65 And c2 <= 90 Then s2 = s2 & c1
    Next p
    If s2 <> "" Then .Offset(, 1) = s2
  End With
End Sub

là aussi, tu peux me demander une adaptation et me donner ton avis.
merci de m'indiquer quelle méthode tu as préférée.

soan
 

Pièces jointes

  • Exemple - Extraction donnéées alphabétiques v2.xlsm
    14.3 KB · Affichages: 4
Dernière édition:

YA1

XLDnaute Nouveau
merci beaucoup Soan , c'est fantastique
en tapant ctrl E j'obtiens exactement ce que je veux dans le 1er tableau
Dans le deuxième tableau , le résultat est automatique des que le saisi la première colonne
la première méthode est peut être plus facile pour moi car je devrais traiter d'un coup et régulièrement des fichiers de plusieurs centaines le lignes
Je ne connais rien a la programmation, comment dois je faire pour appliquer cette macro sur le fichier réel
Merci beaucoup
 

soan

XLDnaute Barbatruc
Inactif
Bonjour YA1, le fil,

je suis ravi que ma solution te convienne !

merci de m'avoir indiqué quelle méthode tu préfères.

tu as écrit : « comment dois-je faire pour appliquer cette macro sur le fichier réel ? » ; aussi, j'ai fait un autre fichier où les données ne sont plus à la même place : maintenant, « ça se passe » en F8:G15 ; même utilisation : fais Ctrl e ; de plus, j'ai très largement commenté le code VBA :​

VB:
Option Explicit


Sub Essai()

  Dim n&: n = Cells(Rows.Count, 6).End(3).Row 'n = dernière ligne utilisée,
  'selon la colonne F ; car 6 = colonne F et 3 = xlUp ; si y'a aucune donnée
  'dans le tableau (donc tableau vide avec en-têtes seulement), alors n = 8
  'car la ligne d'en-têtes est la ligne n° 8 ; dans l'exemple, n = 15 car
  'la dernière donnée est en F15.

  If n = 8 Then Exit Sub 'sortie si n = 8 car aucune donnée => y'a rien à faire :
  'aucune chaîne de caractères à traiter ; comme n = 15, on ne sort pas, et donc
  'on va faire la suite du code VBA.

  Dim T, s1$, s2$, c1$, c2%, p%, k%, i& 'déclaration de plusieurs variables

  n = n - 8 'j'enlève 8 car il y a 8 lignes au-dessus de la 1ère donnée qui
  'est en ligne 9 => n = 15 - 8 = 7 ; n est donc maintenant le nombre de
  'données, et tu peux vérifier qu'il y a bien 7 données de F9 à F15.

  T = [F9].Resize(n, 2) 'T est le tableau utilisé ; il y a n lignes, donc
  'autant de lignes que de données, ici 7 ; il y a 2 colonnes, la 1ère
  'pour les données de la colonne F ; la 2ème pour stocker les résultats
  'du traitement ; à la fin, on les écrira en colonne G, mais c'est pas
  'obligé de les mettre juste à droite ; on pourrait les écrire dans
  'une autre colonne.

  For i = 1 To n 'boucle pour traiter les n lignes du tableau T ; donc on va
  'faire la suite pour chacune des 7 lignes de T.

    s1 = T(i, 1): k = Len(s1) 's1 contient la donnée de la 1ère colonne de T,
    'donc la donnée de la colonne F ; k est la longueur de s1, donc le nombre
    'de caractères de la donnée.
 
    If k > 0 Then 'ce qui est dans ce If est exécuté seulement si la donnée est
    'd'au moins 1 caractère ; donc si y'a une cellule vide en colonne F, avant
    'la dernière donnée, alors pas de traitement pour la ligne en question :
    'on saute à la ligne qui est juste sous le End If.
 
      s2 = "" 's2 est la chaîne de caractères du résultat, qui doit être vide
      'au départ ; car comme on va y cumuler des caractères, il ne faut pas
      'que le résultat d'une ligne soit mélangé avec les résultats obtenus
      'avant sur les autres lignes (sinon, il y aurait des interférences).
   
      For p = 1 To k 'boucle pour chaque caractère de la donnée, de 1 à k ;
      'n'oublie pas que k est la longueur de la chaîne de caractères de s1.
   
        c1 = Mid$(s1, p, 1): c2 = Asc(c1) 'c1 est le p-ième caractère de s1,
        'et c2 est son code Ascii ; exemple : lettre A = 65, lettre Z = 90.
     
        If c2 >= 65 And c2 <= 90 Then s2 = s2 & c1 'on ajoute le caractère c1
        'dans s2, mais seulement si son code Ascii est entre 65 et 90 inclus,
        'donc si c'est une lettre de A à Z ; comme y'a « & », c'est bien une
        'concaténation : on ajoute les lettres au fur et à mesure dans s2.
     
      Next p 'caractère suivant
   
      If s2 <> "" Then T(i, 2) = s2 'on met s2 dans T(i,2) seulement si s2
      'n'est pas une chaîne de caractères vide ; en effet, s2 était vide
      'au départ, et il reste vide si y'a aucune lettre dans la donnée.
   
    End If
 
  Next i 'donnée suivante

  Application.ScreenUpdating = 0 'gel de l'écran : la mise à jour de l'écran
  'est désactivée pour la prochaine écriture des résultats sur la feuille de
  'calcul ; ça concerne juste une colonne, mais c'est quand même mieux s'il
  'y a plusieurs milliers de lignes.

  [G9].Resize(n) = Application.Index(T, Evaluate("Row(" & "1:" & n & ")"), 2)

  'écriture des résultats à partir de la cellule G9 ; c'est là où tu peux
  'choisir une autre colonne et une autre ligne pour la destination.

  'attention : sur cette ligne, ne change rien d'autre que G9 ! il faut
  'impérativement laisser le reste inchangé ! en effet, c'est toujours
  'pour n lignes de données (ici pour 7 données) ; de 1 à n lignes de T,
  'et pour la 2ème colonne de ce même tableau T ; donc 2 est bien la
  '2ème colonne de la variable tableau T, ce n'est pas la colonne B !

End Sub

en étudiant les différences avec le 1er code VBA, tu trouveras sûrement comment tu peux toi-même adapter mon code VBA à ton fichier réel ; mais ce sont surtout les très nombreux commentaires qui t'y aideront.

en complément, tu peux lire mon post #7, notamment pour le point 3) : c'est une étape facultative pour ajouter un raccourci clavier, par exemple Ctrl e.​

soan
 

Pièces jointes

  • Exemple - Extraction données alphabétiques v3.xlsm
    19.4 KB · Affichages: 2
Dernière édition:

YA1

XLDnaute Nouveau
Merci beaucoup pour le temps passé sur ma demande et les explications sur le programme
je vais les lire très attentivement pour commencer à me familiariser avec vba et pour l'adapter au fichier reel
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…