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

Y compris Power BI, Power Query et toute autre question en lien avec Excel
P
Pwetzou
Membre habitué
Membre habitué
Messages : 81
Inscrit le : 26 février 2014
Version d'Excel : 2010 FR

Message par Pwetzou » 28 avril 2015, 15:37

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.
test.xlsx
(9.68 Kio) Téléchargé 33 fois
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 8'695
Appréciations reçues : 312
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 28 avril 2015, 16:08

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
P
Pwetzou
Membre habitué
Membre habitué
Messages : 81
Inscrit le : 26 février 2014
Version d'Excel : 2010 FR

Message par Pwetzou » 29 avril 2015, 12:05

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.
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 8'695
Appréciations reçues : 312
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 29 avril 2015, 12:32

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
P
Pwetzou
Membre habitué
Membre habitué
Messages : 81
Inscrit le : 26 février 2014
Version d'Excel : 2010 FR

Message par Pwetzou » 29 avril 2015, 14:03

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.
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 8'695
Appréciations reçues : 312
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 29 avril 2015, 14:26

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.
Avatar du membre
Marc L
Membre dévoué
Membre dévoué
Messages : 821
Appréciation reçue : 1
Inscrit le : 27 janvier 2015
Version d'Excel : 2003 / 2007

Message par Marc L » 29 avril 2015, 14:31

 
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   …

Je suis Charlie   -   Je suis Bardo
P
Pwetzou
Membre habitué
Membre habitué
Messages : 81
Inscrit le : 26 février 2014
Version d'Excel : 2010 FR

Message par Pwetzou » 29 avril 2015, 14:42

Pardon,

Voici le fichier "test" en appui.

Merci !
test.xlsx
(10.38 Kio) Téléchargé 18 fois
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 8'695
Appréciations reçues : 312
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 29 avril 2015, 15:09

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
P
Pwetzou
Membre habitué
Membre habitué
Messages : 81
Inscrit le : 26 février 2014
Version d'Excel : 2010 FR

Message par Pwetzou » 29 avril 2015, 16:31

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...
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message