Code pour intervertir chaine de caractère sur critère

Bonjour à tous,

Je souhaiterais savoir si vous connaissiez une expression permettant de classer, dans une cellule, des chaines de caractères alphanumériques séparées par des ";" ?

Dans mon exemple, j'ai 3 colonnes qui contiennent des cellules aux expressions "2 lettres + suite de chiffre" séparés par des ";" et j'aimerais avec une macro pour réorganiser l'ordre d'apparition des expressions :

- Commencer la cellule par les chaines démarrant par EPxxxxxx, puis par WOxxxxxx, puis par FRxxxxxxx puis par JPxxxxx, et enfin le reste en bataille.

Merci par avance si vous avez une solution,

Bien Cdt,

F.

35test.xlsx (9.68 Ko)

Bonjour,

une solution via une fonction personnalisée à mettre dans un module

appel de la fonction

=sortstring(s) ou s est la chaîne de caractères à trier

Function sortstring(s)
    Dim a
    a = Split(s, ";")
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i) > a(j) Then b = a(i): a(i) = a(j): a(j) = b
        Next j
    Next i
    sortstring = Join(a, ";")
End Function

Bonjour,

Merci pour votre réponse rapide;

C'est la première fois que je suis amené à devoir créer une fonction et je reste un peu perdu sur comment construire et syntaxiser mes modules.

A quel moment dois-je faire intervenir "=sortstring(s)" ?

Dois-je placer la Function dans un module2 ou dans le module1 de départ ?

Cette fonction s'appliquera-t-elle a toute la feuille active ?

Merci par avance,

Bien cdt,

F.

Pwetzou a écrit :

Bonjour,

Merci pour votre réponse rapide;

C'est la première fois que je suis amené à devoir créer une fonction et je reste un peu perdu sur comment construire et syntaxiser mes modules.

A quel moment dois-je faire intervenir "=sortstring(s)" ?

sortstring devient une nouvelle fonction disponible pour la feuille de calcul excel au même titre que somme(....) etc.

si la chaine à trier se trouve en A1

et si tu veux le résultat en B1

en B1 tu mets

=sortstring(A1)

Dois-je placer la Function dans un module2 ou dans le module1 de départ ?

peut-être placée indifféremment dans l'une ou l'autre voire dans encore dans un autre module

Cette fonction s'appliquera-t-elle a toute la feuille active ?

cette fonction est disponible pour tout le classeur

D'accord.

Je vais étudier cela.

Merci par avance.

En attendant, j'avais une autre interrogation, je travaille actuellement sur une macro qui me permettrait de faire une fonction =GAUCHE.

J'aimerais que la plage à "Gaucher" s'étende de "A1 jusqu'à la dernière ligne non-vide et jusqu'à la dernière colonne non-vide", ou bien garder le choix de "Gaucher" que la colonne 1 et/ou la 3...

(Dans mon exemple, pour ne garder que le premier numéro WOxxxxxx jusqu'au ";").

Votre fonction peut-elle être adaptée pour aboutir à ceci ?

Merci par avance encore..

F.

Bonjour,

peux-tu reformuler ? je n'ai pas compris. le mieux est de mettre un fichier exemple avec la situation de départ, le résultat à atteindre et les règles pour passer de la situation de départ au résultat.

Bonjour.

Pwetzou a écrit :

J'aimerais que la plage à "Gaucher" s'étende de "A1 jusqu'à la dernière ligne non-vide et jusqu'à la dernière colonne non-vide"

Utiliser la propriété CurrentRegion

Pardon,

Voici le fichier "test" en appui.

Merci !

18test.xlsx (10.38 Ko)

Re-bonjour,

voici une macro, à copier dans un module. changer le nom des colonnes éventuellement.

puis sélectionner la feuille sur laquelle la macro doit s'appliquer et lancer la macro par alt-F8.

attention les données sont remplacées par le résultat. (bien prendre des copies avant d'exécuter la macro)

Sub selectfirst()
    For Each col In Array("A", "B", "C") '<- remplacer ici les noms de colonnes sur lesquelles appliquer la macro
        i = 1
        While Cells(i, col) <> ""
            Cells(i, 1) = sortstringselfirst(Cells(i, col))
            i = i + 1
        Wend
    Next
End Sub

Function sortstringselfirst(st)
    Dim a
    s = st
    s = Replace(s, "EP", "01EP")
    s = Replace(s, "WO", "02WO")
    s = Replace(s, "FR", "03FR")
    s = Replace(s, "US", "04US")
    s = Replace(s, "JP", "05JP")

    a = Split(s, ";")
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i) > a(j) Then b = a(i): a(i) = a(j): a(j) = b
        Next j
    Next i
    s = a(LBound(a))
    s = Replace(s, "01EP", "EP")
    s = Replace(s, "02WO", "WO")
    s = Replace(s, "03FR", "FR")
    s = Replace(s, "04US", "US")
    s = Replace(s, "05JP", "JP")
    sortstringselfirst = s
End Function

h2so4,

Merci pour ta fonction, elle fonctionne parfaitement... rien à redire.

Je dois encore simuler et tester tout ça sur plusieurs centaines de lignes mais je pense qu'il n'y a pas de problème.

La possibilité de pouvoir choisir la colonne ciblée, c'est vraiment super...

Pourrais-tu me mettre en commentaire ' le détail de ce que chaque ligne de code de la fonction sortstringselfirst(st) signifie ?

Cela me semble assez complexe mais je suis très intéressé pour comprendre comment tu t'y es pris ...

Merci par avance.

Marc L,

Merci pour votre suggestion de propriété; je suis allé lire un tuto dessus et effectivement elle m'a l'air très utile... plutôt que de passer par des End.x1up/x1down/x1ToLeft...

re-bonjour,

voici le code avec un commentaire succinct.

Function sortstringselfirst(st)
' sélectionne la premier élément après tri d'une chaîne de chaînes de caractères séparés par un ;
' le tri doit considérer dans l'ordre les chaines commençant par EP puis WO puis FR puis US puis JP puis enfin les autres dans l'ordre alphabétique
    Dim a ' vecteur qui recevra chaque chaîne de caractères
    s = st ' s contient la chaîne de chaines
    s = Replace(s, "EP", "01EP") 'on remplace EP par 01EP pour l'avoir comme premier élément lors du tri
    s = Replace(s, "WO", "02WO") ' idem
    s = Replace(s, "FR", "03FR") ' idem
    s = Replace(s, "US", "04US") ' idem
    s = Replace(s, "JP", "05JP") ' idem

    a = Split(s, ";") 'on remplit le vecteur avec les chaines de caractères
    ' on fait un tri (methode bubble sort)
    For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i) > a(j) Then b = a(i): a(i) = a(j): a(j) = b
        Next j
    Next i
    ' le vecteur est trié
    s = a(LBound(a)) ' on prend le premier élément du vecteur
    s = Replace(s, "01EP", "EP") ' on enlève les éléments qui ont permis d'avoir les chaines triées dans l'ordre demandé
    s = Replace(s, "02WO", "WO") ' idem
    s = Replace(s, "03FR", "FR") ' idem
    s = Replace(s, "04US", "US") ' idem
    s = Replace(s, "05JP", "JP") ' idem
    sortstringselfirst = s ' la fonction retourne le premier élément selon le critère de tri
End Function

Bonsoir,

comme demandé en MP voici la fonction sortstring adaptée

Function sortstring(st)
' sélectionne la premier élément après tri d'une chaîne de chaînes de caractères séparés par un ;
' le tri doit considérer dans l'ordre les chaines commençant par EP puis WO puis FR puis US puis JP puis enfin les autres dans l'ordre alphabétique
   Dim a ' vecteur qui recevra chaque chaîne de caractères
   s = st ' s contient la chaîne de chaines
   s = Replace(s, "EP", "01EP") 'on remplace EP par 01EP pour l'avoir comme premier élément lors du tri
   s = Replace(s, "WO", "02WO") ' idem
   s = Replace(s, "FR", "03FR") ' idem
   s = Replace(s, "US", "04US") ' idem
   s = Replace(s, "JP", "05JP") ' idem

    a = Split(s, ";") 'on remplit le vecteur avec les chaines de caractères
   ' on fait un tri (methode bubble sort)
   For i = LBound(a) To UBound(a) - 1
        For j = i + 1 To UBound(a)
            If a(i) > a(j) Then b = a(i): a(i) = a(j): a(j) = b
        Next j
    Next i
    ' le vecteur est trié
   s = Join(a, ";") 'on recrée la liste triée séparée par des ;
   s = Replace(s, "01EP", "EP") ' on enlève les éléments qui ont permis d'avoir les chaines triées dans l'ordre demandé
   s = Replace(s, "02WO", "WO") ' idem
   s = Replace(s, "03FR", "FR") ' idem
   s = Replace(s, "04US", "US") ' idem
   s = Replace(s, "05JP", "JP") ' idem
   sortstring = s ' la fonction retourne le premier élément selon le critère de tri
End Function
Rechercher des sujets similaires à "code intervertir chaine caractere critere"