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

  • Initiateur de la discussion Initiateur de la discussion Deliau
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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
 
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
 
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
 
Bonjour à tous 😛

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 😀, 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

Dernière édition:
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
 
@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+
 
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 😉
 
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
 
re
j'ai voulu un peu m'amuser LOL 😛 😛 😛
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
 
@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 😉😀😛)

Pour afficher ce contenu, nous aurons besoin de votre consentement pour définir des cookies tiers.
Pour plus d'informations, consultez notre page sur les cookies.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
36
Affichages
2 K
Retour