XL 2016 Modifier une chaine complexe dans chaque cellule d'un tableau

Deliau

XLDnaute Nouveau
Bonjour,

Je dispose d'un tableau de plusieurs milliers de lignes et de dizaines de colonnes.
Dans certaines de ces cellules, je souhaite remplacer la chaine "aXb-cXd" par "aXb-c", ou a, b, c et d sont des nombres entiers < 1000 et X une seule lettre.
Le fait qu'il y ait deux fois la lettre X me bloque dans ma macro.

Comment enlever de chaque cellule la fin de la chaine "Xd", sachant que d'autres cellules n'ont pas ce format ? Je sèche ..

Merci,
Lucie
 

patricktoulon

XLDnaute Barbatruc
edit
si la demande est <=1000 pour les sub chaines numeriques
ceci devrait fonctionner
.Pattern = "((\d{1,3})|1000)[A-z]((\d{1,3})|1000)-((\d{1,3})|1000)[A-z]((\d{1,3})|1000)$"

demo4.gif
 

patricktoulon

XLDnaute Barbatruc
une dernière chose Laurent dans ce genre de travail avec les regex et une plage de donnée ce qui m'ennuie le plus c'est de devoir coder la sub a chaque fois
je suis un vbiste bio je privilégie le recyclable apprend a séquencer tes actions ne met pas tout dans une sub

sub test
for each celelule in range(patate) then
cellele=mafonction_regex(cellule,"(\d{1,3}).......")
next
end sub

function mafonctionregex(cellule ,motif)
'with createobject(...))
blablabla
'blablabla
.pattern=motif
'blablabla
end function

demain tu en a besoins pour autre chose
 

jmfmarques

XLDnaute Accro
RE

Tout bien réfléchi, voilà une nouvelle fonction de vérification du format. Elle a ma préférence pour plusieurs raisons :

VB:
Public Function verif_format(c As String) As Boolean
   t = Split(c, "-")
   verif_format = True
   If UBound(t) <> 1 Then verif_format = False: Exit Function
   For k = 0 To 1
      Select Case True
       Case t(k) Like "*####*": verif_format = False
       Case t(k) Like "*[A-z]*[A-z]*": verif_format = False
        Case Not t(k) Like "*#[A-z]#*": verif_format = False
     End Select
     If verif_format = False Then Exit Function
   Next
End Function
 

job75

XLDnaute Barbatruc
Sur 100 000 cellules ma macro du post #8 s'exécute chez moi en 0,7 seconde, testez ce fichier.

Edit : j'ai ajouté un Exit For => 0,5 seconde.
 

Pièces jointes

  • Remplacer(1).xlsm
    550.4 KB · Affichages: 15
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :p

Ma p'tite version.
  • Initialiser d'abord la colonne A (des constantes sont en début de code de la macro INIT())
  • Lancer le traitement en cliquant sur Hop!
[mode humour] En ces temps de confinement (dont la fin est encore lointaine), la seconde gagnée ou perdue c'est dérisoire :D, non ? [/mode humour] Cela dit, je suis beaucoup plus long que @job75 que je salue en passant.

nota: pas bien compris si les deux lettres doivent être identiques ou si c'est seulement une des possibilités ? J'ai codé avec des lettres pouvant être différentes (ça se modifie aisément si besoin)

edit: version v2 avec l'obligation que les lettres soient identiques.
 

Pièces jointes

  • Deliau- extraction- v1.xlsm
    23.1 KB · Affichages: 9
  • Deliau- extraction- v2.xlsm
    23.2 KB · Affichages: 4
Dernière édition:

patricktoulon

XLDnaute Barbatruc
haie haie haie !!
Bonjour @mapomme
il y a juste un petit soucis avec ton like " "#*#-#*"

exemple ici il manque la première lettre entre les deux premières chaînes numériques
ton code va donc le passer a la moulinette dans son if like alors qu'il devrait le zapper
change ça et ça devrait accélérer encore le truc

VB:
Sub test()
MsgBox "46735-45g" Like "#*#-#*" ' répond "vrai"
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
@bonjour @patricktoulon,

Ta remarque est justifiée ;) (tu as le coup d’œil !). Mais en fait, comme tu l'as vu, je passe l'expression à différents cribles de plus en plus éliminatoires. Ce n'est pas la méthode la plus rapide. Ton exemple passe au travers du premier crible (tu l'a bien détecté). Il est éliminé par la suite (premier terme pas de la bonne forme et, si ça l'était, le second a une lettre minuscule qui recale l'expression). Je n'ai pas le courage, ce matin, d'y revenir :(. Je vais écouter un peu de musique. Du Mozart, ça me détend.

Très bon dimanche :) et A+
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

[le dernier combat (by LB) - tribute]
Dimanche 08:10
•>mapomme
J'aurai plutôt cru voir ceci sur ton gramophone. ;)
Oui, je sais, c'est petit.
Mais en ces temps de confinement, faut bien rire ;)
Tiens, je vais me mettre cette galette dans les oreilles, ca va me détendre aussi

Nous étions les danseurs d'un monde à l'agonie
En même temps que fantômes! conscients d'être mort-nés
Nous étions fossoyeurs d'un monde à l'agonie
[/le dernier combat (by LB) - tribute]

NB: J'en profite pour féliciter tous les participants de ce fil pour la qualité des codes VBA qu'on peut y lire ;)
 

patricktoulon

XLDnaute Barbatruc
ok a + mapomme
de mon coté j'ai essayé mais on est quand même limité avec like en terme de pattern conditionnels
obligé de disséquer la chaîne
du coup j'ai tricoté
un petit test
VB:
Sub validation(Chaine$)
    Dim T, xX As Boolean, I&
    Chaine = "47F45-5H44444"
    T = Split(Chaine, "-")
    xX = UBound(T) = 1 And T(0) Like "*#[A-z]#*" And Not T(0) Like "*[a-z][a-z]*" And T(1) Like "#[A-z]#*" And Not T(1) Like "*[a-z][a-z]*" And Val(T(0)) > 0
    If xX Then
        For I = Len(Chaine) To 1 Step -1    'on ne boucle que sur la fin  économie faible mais en boucle sur xxxxx cellule ca peut faire la différence
            If IsNumeric(Mid(Chaine, I, 1)) Then Mid(Chaine, I, 1) = " " Else Exit For
        Next
    End If
    MsgBox xX & vbCrLf & "chaine " & Array("non valide ", "valide ")(Abs(xX)) & Trim(Chaine)
End Sub
'
Sub test()
    validation ("47GF45-5H44444")
validation ("879F45-5H44444")
validation ("879F45-5HD44444")
Sub

mais je suis sur qu'il y a des failles encore
 

patricktoulon

XLDnaute Barbatruc
re
j'ai voulu un peu m'amuser LOL :p :p :p
VB:
Sub truc(chaine)
    num = "[0-9]"
    For x4 = 1 To 4: pat4 = Application.Rept(num, x4): For x3 = 1 To 3: pat3 = Application.Rept(num, x3): For x2 = 1 To 3: pat2 = Application.Rept(num, x2)
                For x1 = 1 To 3
                    pat1 = Application.Rept(num, x1)
                    Pattern = pat1 & "[A-z]" & pat2 & "-" & pat3 & "[A-z]" & pat4
                    If chaine Like Pattern And Val(Right(chaine, 4)) < 1000 Then
                        MsgBox "oui " & vbCrLf & chaine & vbCrLf & vbCrLf & Left(chaine, Len(chaine) - x4) & vbCrLf & Pattern: Exit Sub
                    End If
                Next x1
            Next x2: Next x3: Next x4
End Sub


Sub tesz()
    truc "456F235-54K287"
    truc "78F4-524K2"
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
@patricktoulon
Tu "pètes le feu" ce matin :). On va regarder ça. C'est vrai qu'avec like et not like, c'est souvent assez compliqué (voire impossible) d'y arriver. Mais on, en fait tu, as bien progressé ;).

Bonjour @Staple1600 :)
J'aurai plutôt cru voir ceci sur ton gramophone. ;)
Ok pour les "Pom pom pom pooom." mais il y a aussi les "Pou pou pidou..."
(ne te méprends pas l'agrafe, rien à voir avec une déclaration de ma part ;):D:p)

 

Discussions similaires

Réponses
10
Affichages
427

Statistiques des forums

Discussions
314 499
Messages
2 110 247
Membres
110 711
dernier inscrit
chmessi