Fonction renvoi dernière valeur d'une cellule

Bonjour,

Je voulais savoir s'il existait une fonction sous vba qui renvoyait la dernière valeur d'une cellule contenu après un /. Je m'explique :

Dans le fichier excel ci-dessous, en plus de la macro présente, j'aimerai pouvoir modifier le décodage automatiquement. ¨Par exemple, si le décodage est 1/y et le parent récurrent est y. J'aimerai que la macro m'affiche le nouveau décodage soit 1//y. Si le décodage est 1/y et que le parent récurrent est x (pas d'exemple comme ceci dans ce tableau) la macro devra m'afficher 1/y/x.

Pour simplifier les exemples, les noms sont des chiffres ou des lettres avec à chaque fois un seul caractère. En pratique les noms seront plus long donc il faudrait que excel comprenne que si 1/"valeur" de la colonne décodage est égale à "valeur" de la colonne parent récurrent alors on affiche dans une autre colonne 1//"valeur"

Je pensais donc intégrer ceci dans la boucle for mais je ne sais par où commencer. Je débute. Voici le code et le fichier :

Sub MODIFd?codage()

Dim nbcoldecodage As Integer

Dim nbcolrecurrents As Integer

Dim nbcolNVdecodage As Integer

Dim k As Long, dlb As Long, deletecompi As Long

With Sheets("Liste F1")

Rem stocke num?ro colonne f1

nbcoldecodage = InputBox("Quel est le num?ro de colonne dans lequel sont stock?s les d?codages ?")

Rem stocke num?ro colonne PR

nbcolrecurrents = InputBox("Quel est le num?ro de colonne dans lequel sont stock?s tes parents r?currents ?")

Rem stocke colonne futur r?sultat

nbcolNVdecodage = InputBox("Quel est le num?ro de colonne dans lequel les d?codages mis ? jour devront ?tre stock?s ?")

Rem compte le nombre de lignes pour les diff?rentes colonnes et autre

dlb = .Cells(Rows.Count, nbcoldecodage).End(xlUp).Row

deletecompi = .Cells(Rows.Count, nbcolNVdecodage).End(xlUp).Row

Rem supprime le contenu de la colonne avec les futurs r?sultats

.Range(Cells(2, nbcolNVdecodage), Cells(deletecompi, nbcolNVdecodage)).Clear

Rem boucle

For k = 2 To dlb

Rem AFFICHER LE SI DANS LA BOUCLE

.Cells(k, nbcolNVdecodage) = .Cells(k, nbcoldecodage) & "/" & .Cells(k, nbcolrecurrents)

Next k

End With

End Sub

3exemple-2.xlsm (24.50 Ko)

Merci d'avance si vous avez des pistes,

Rolo

Salut,

Il y a beaucoup de solution possible (tableau ou pas; split ou autre), tu peux tester celle-ci:

Function NOUVEAU_DECODAGE()

Dim COLONNE_DECODAGE As Integer
Dim COLONNE_RECURRENTS As Integer
Dim COLONNE_NOUVEAU_DECODAGE As Integer
Dim BALAYAGE_LIGNE As Integer

Dim VALEUR_DECODAGE As String
Dim VALEUR_RECURRENTS As String

COLONNE_DECODAGE = 2
COLONNE_RECURRENTS = 3
COLONNE_NOUVEAU_DECODAGE = 4
BALAYAGE_LIGNE = 2 'la première ligne étant les titres

'tant qu'on a un décodage on continue de créer le nouveau décodage
Do Until Sheets("feuil1").Cells(BALAYAGE_LIGNE, COLONNE_DECODAGE).Value = ""

    'on stock les valeurs pour plus de clareté dans le code
    VALEUR_RECURRENTS = Sheets("feuil1").Cells(BALAYAGE_LIGNE, COLONNE_RECURRENTS).Value
    VALEUR_DECODAGE = Sheets("feuil1").Cells(BALAYAGE_LIGNE, COLONNE_DECODAGE).Value

    'on va tester la présence de la chaine de caractère Recurrents dans la chaine de caractère Décodage
    'InStr retourne 0 si chaine non trouvée sinon le numéro du premier caractère
    'InStrRev idem mais depuis la fin de la chaine de caractère
    'exemple
    'InStr ("1_2_2" , "2") va trouver un "2" dans la chaine de caractère en position 3 en partant depuis le début
    'InStrRev ("1_2_2" , "2") va trouver un "2" dans la chaine de caractère en position 1 en partant depuis la fin

    'l'idée est donc que tant que ces 2 fonctions ne retournent pas la même valeur de position
    'alors on a plusieurs fois la chaine de caractère qui apparait dans le mot
    'et donc on replace la première que l'on trouve par du vide comme tu le souhaites

    'tant que les deux fonctions ne valent pas la même chose
    Do Until InStrRev(VALEUR_DECODAGE, VALEUR_RECURRENTS) = InStr(VALEUR_DECODAGE, VALEUR_RECURRENTS)
        'on remplace le premier mots trouvé par rien
        VALEUR_DECODAGE = Replace(VALEUR_DECODAGE, VALEUR_RECURRENTS, "", , 1)
    Loop

    'on inscrit le nouveau décodage
    Sheets("feuil1").Cells(BALAYAGE_LIGNE, COLONNE_NOUVEAU_DECODAGE).Value = VALEUR_DECODAGE

    'on va voir la prochaine ligne
    BALAYAGE_LIGNE = BALAYAGE_LIGNE + 1
Loop

End Function

cela donne comme résultats:

decodage

A voir si cela correspond bien à ce que tu souhaites et surtout les cas que tu peux rencontrer dans ton fichiers

Entre autre le premier exemple

1/y/y/a/y/y/y/b/c/c/y/a qui donne 1///a////b/c/c/y/a

Peut être que tu voulais avoir

1//y/a///y/b/c/c/y/a

Cette solution simpliste implique aussi que tu ne peux pas rencontrer tes chaines de caractères inbriqué entre elle, je m'explique.

Si ton Recurrents vaut "onj" et que tu as comme codage "1/bonjour/toto/onj" avec ce code il va donc te remplacer bêtement ce qui donnera donc

 1/bonjour/toto/onj   => 1/bour/toto/onj

Même soucis avec des chiffres pour ce bout de code

La il faudrait partir sur un split pour bien être sur de maitriser ce qu'on fait mais on verra déjà ton premier retour

Bonjour ExcelCoreGame,

Merci pour ton retour, oui tu as globalement saisi l'objectif de ce code. J'aurai du mettre des exemples de ce que je voulais avoir dans les cellules.

Par exemple :

Le decodage dans ton exemple (1/y/y/a/y/y/y/b/c/c/y/a) devrait en réalité être codé de cette manière 1//y/a///y/b//c/y/a. De plus, à ce codage on souhaite associer le parent récurrent (y dans ton exemple) donc dans la COLONNE_NOUVEAU_DECODAGE on aurait obtenu 1//y/a///y/b//c/y/a/y. Le dernier "/" montrant ainsi le dernier croisement qui a été effectué.

Autre exemple :

Si le parent récurrent avait été a et le decodage 1//y/a///y/b//c/y/a nous aurions obtenu dans la COLONNE_NOUVEAU_DECODAGE 1//y/a///y/b//c/y//a

L'idée globale serait donc de comparer juste la dernière valeur après le "/" dans la colonne B avec le parent récurrent (colonne C). Si la valeur après le "/" est égale au parent récurrent (col C) alors la macro devrait insérer un "/" supplémentaire. Si ce n'est pas le cas alors la macro ajoutera "/y ou a ou etc.".

J'espère que mes propos sont plus clairs et merci encore,

Rolo

Je vais regarder pour une fonction qui prends en compte cela

Merci pour ton aide, Rolo

nouveau code avec un split, les résultats:

decodage

Le fichier:

1decodage.xlsm (18.05 Ko)

Le code un peu plus long mais avec commentaires et variables déclarées comme je préfère ^^:

Function NOUVEAU_DECODAGE()
Dim TABLEAU_INFORMATION As Variant
Dim BALAYAGE_LIGNE As Integer

Dim COLONNE_CODE As Integer
Dim COLONNE_DECODAGE As Integer
Dim COLONNE_RECURRENTS As Integer
Dim COLONNE_NOUVEAU_DECODAGE As Integer

Dim VALEUR_RECURRENTS As String 'pour plus de clarté dans le code
Dim VALEUR_DECODAGE As String 'pour plus de clarté dans le code
Dim VALEUR_DELIMITEUR As String

Dim MON_SPLIT_DE_VARIABLE As Variant
Dim BALAYAGE_SPLIT As Integer

Dim CREATION_NOUVEAU_DECODAGE As String 'pour plus de clarté dans le code, on pourrait directement écrire dans la cellule

COLONNE_CODE = 1
COLONNE_DECODAGE = 2
COLONNE_RECURRENTS = 3
COLONNE_NOUVEAU_DECODAGE = 4
VALEUR_DELIMITEUR = "/"

'on reprends automatiquement les cellules utilisées
'il faut donc que toute les lignes de la feuille soit bien renseigné sinon cela peut bugger
TABLEAU_INFORMATION = ActiveSheet.UsedRange

'on va balayer de la 2ième ligne (la première étant les titres de colonnes) jusque la dernière pour calculer le nouveau decodage
For BALAYAGE_LIGNE = LBound(TABLEAU_INFORMATION, 1) + 1 To UBound(TABLEAU_INFORMATION, 1)

    VALEUR_RECURRENTS = TABLEAU_INFORMATION(BALAYAGE_LIGNE, COLONNE_RECURRENTS)
    VALEUR_DECODAGE = TABLEAU_INFORMATION(BALAYAGE_LIGNE, COLONNE_DECODAGE)

    'on split le décodage avec le démimiteur
    'si on split la chaine de caractère "1/y/a" avec le délimiteur "/" on obtient une array avec 3 valeur:
    '1
    'y
    'a

    'cela correspond dans une certaine mesure à la fonction dans excel via Données => Convertir => Délimité

    MON_SPLIT_DE_VARIABLE = Split(TABLEAU_INFORMATION(BALAYAGE_LIGNE, COLONNE_DECODAGE), VALEUR_DELIMITEUR)

    CREATION_NOUVEAU_DECODAGE = ""
    'on parcours toute les valeurs du split
    For BALAYAGE_SPLIT = LBound(MON_SPLIT_DE_VARIABLE, 1) To UBound(MON_SPLIT_DE_VARIABLE, 1)

        'si on est sur la borne supérieur de l'array de split soit la dernière valeur
        'on ne peut plus rien avoir après donc on la reprendra forcément
        If BALAYAGE_SPLIT = UBound(MON_SPLIT_DE_VARIABLE, 1) Then
            CREATION_NOUVEAU_DECODAGE = CREATION_NOUVEAU_DECODAGE & VALEUR_DELIMITEUR & MON_SPLIT_DE_VARIABLE(BALAYAGE_SPLIT)
        Else
            'si on n'est pas sur la borne inférieur de l'array de split (soit la première valeur) alors on rajoute un délimiteur automatique
            'car on aura forcément déjà une valeur ou un délimiteur / dans la chaine de caractère
            If BALAYAGE_SPLIT <> LBound(MON_SPLIT_DE_VARIABLE, 1) Then
                CREATION_NOUVEAU_DECODAGE = CREATION_NOUVEAU_DECODAGE & VALEUR_DELIMITEUR
            End If

            'dans tous les cas si on la valeur actuelle et la suivante ne valent pas le recurrent on l'ajoute dans la chaine de caractère
            If Not (MON_SPLIT_DE_VARIABLE(BALAYAGE_SPLIT) = VALEUR_RECURRENTS And MON_SPLIT_DE_VARIABLE(BALAYAGE_SPLIT + 1) = VALEUR_RECURRENTS) Then
                CREATION_NOUVEAU_DECODAGE = CREATION_NOUVEAU_DECODAGE & MON_SPLIT_DE_VARIABLE(BALAYAGE_SPLIT)
            End If

        End If

    Next

    ActiveSheet.Cells(BALAYAGE_LIGNE, COLONNE_NOUVEAU_DECODAGE).Value = CREATION_NOUVEAU_DECODAGE
Next

End Function

Bonsoir Steelson,

Desolé pour le temps de latence et merci pour le temps que tu me consacres. L'idée principale est vraiment là avec un recodage automatisé. Néanmoins, avoir d'avoir le nouveau décodage la première étape serait d'associer les colonnes B et C (je ne sais pas si c'est clair) et c'est cette association recodée que l'on souhaitera obtenir dans la colonne D.

Je vais m'y repencher un peu plus dans la semaine.

Merci d'avance, Rolo

Steelson c'est moi? ^^ ou quelqu'un d'autre qui t'aide aussi?

Si tu rajoutes des choses ça va être dur d'en finir oui

Associer les colonnes B et C? nan je ne vois pas désolé, tu veux dire quoi par la?

ECG

Bonsoir,

Oui pardon j'ai confondu avec un autre sujet.

Oui car c'est l'association de la colonne B et C qui donnera le nouveau décodage :

Si par exemple B2=1///y/a et que C2=y alors D2 sera égale à 1///y/a/y. On associe bien B et C avant de modifier le décodage.

Si par exemple B=1///y/a que C2=a alors D2 sera égale à 1///y//a

J'espère que c'est plus clair, l'idée est vraiment là en tout cas,

Merci, Rolo

Pardon en effet j'ai oublié ça dans la macro ^^

J'ai rajouté une ligne de code qui rajoute donc le récurrents sur la chaine de décodage actuelle:

TABLEAU_INFORMATION(BALAYAGE_LIGNE, COLONNE_DECODAGE) = TABLEAU_INFORMATION(BALAYAGE_LIGNE, COLONNE_DECODAGE) & "/" & VALEUR_RECURRENTS

nouveau fichier:

1decodage-v2.xlsm (18.99 Ko)

résultats:

decodage 2

ECG

Bonjour ECG,

Merci c'est super !! Je pense que je vais rajouter un inputbox par la suite qui permettra à l'utilisateur de sélectionner les numéros de colonnes où seront les décodages, récurrents, etc.

J'ai juste eu 2 soucis avec le fichier :

Je ne sais pas comment utiliser la fonction en tant que telle car je ne sais pas quelle celulle "x" sélectionner pour l'utiliser dans la fonction f(x). J'ai donc remplacé la fonction par un sub pour pouvoir l'utiliser.

Il y a eu aussi 2,3 bugs quand j'ai utilisé la macro comme tu pourras le voir dans le fichier que je te renvoie. J'ai notamment remarqué que lorsque la valeur contenue dans la colonne récurrent (ex:y) est différente des valeurs (répétées) dans la colonne décodage (ex : plusieurs fois Pomme) alors la macro ne renvoie pas le bon résultat.

Je vais essayer de modifier ça dans le code mais 2,3 lignes m'échappent.

Merci d'avance,

Rolo60

3decodage-v3.xlsm (22.18 Ko)

Salut,

Je ne sais pas comment utiliser la fonction en tant que telle car je ne sais pas quelle celulle "x" sélectionner pour l'utiliser dans la fonction f(x). J'ai donc remplacé la fonction par un sub pour pouvoir l'utiliser.

sub ou fonction c'est pareil au final, tu peux l'appeler via un bouton tout simplement ou la lancer toi même dans l'onglet développeur

Il y a eu aussi 2,3 bugs quand j'ai utilisé la macro comme tu pourras le voir dans le fichier que je te renvoie. J'ai notamment remarqué que lorsque la valeur contenue dans la colonne récurrent (ex:y) est différente des valeurs (répétées) dans la colonne décodage (ex : plusieurs fois Pomme) alors la macro ne renvoie pas le bon résultat.

C'est ce que tu as demandé dans ton cahier des charges :

Dans le fichier excel ci-dessous, en plus de la macro présente, j'aimerai pouvoir modifier le décodage automatiquement. ¨Par exemple, si le décodage est 1/y et le parent récurrent est y. J'aimerai que la macro m'affiche le nouveau décodage soit 1//y. Si le décodage est 1/y et que le parent récurrent est x (pas d'exemple comme ceci dans ce tableau) la macro devra m'afficher 1/y/x.

Tu as juste demandé un décodage via le parent récurrent

Concernant ton fichier si je regarde (j'imagine en rouge ce sont les erreurs):

erreur decodage

Erreur 1/2/3: Comme vu ensemble, le récurrents n'est pas dans le décodage donc aucun tri n'est fait comme demandé

Erreur 4: Encore une fois tu as demandé un tri via le récurrent, ce n'était pas dans le cahier des charges de laisser la première valeur en l'état obligatoirement

Essaye de penser à tout ce que tu veux et mets les sur papier explicitement sinon on peut faire 40 rebonds de mise à jour de fichier

Bonsoir ECG,

sub ou fonction c'est pareil au final, tu peux l'appeler via un bouton tout simplement ou la lancer toi même dans l'onglet développeur

Oui bien sûr mais je ne sais pas quoi mettre en x dans la fonction pour la faire fonctionner.

C'est ce que tu as demandé dans ton cahier des charges :

Oui certes, mais dans ce cas précis la colonne décodage était correcte. Dans le cas contraire, si dans la colonne décodage la valeur est 1/y/y et que le parent récurrent est pomme alors le nouveau décodage sera automatiquement faux (1/y/y/pomme au lieu de 1//y/pomme ).

L'idée est donc tout d'abord d'assembler les colonnes B et C avec un séparateur /. Ensuite, l'idée est que si deux valeurs égales (ou plus) sont voisines alors on affiche un nombre de / égal au nombre de valeurs égales voisines suivie de la valeur en question.

J'espère que c'est plus clair,

Rolo

Salut,

Oui bien sûr mais je ne sais pas quoi mettre en x dans la fonction pour la faire fonctionner

Je parlais plus d'un bouton ou d'une forme divers, clic droit dessus, affecter une macro puis si c'est une sub alors tu la verras dans la liste, si c'est une fonction il faut toi même y inscrire le nom de la fonction

Oui certes, mais dans ce cas précis la colonne décodage était correcte. Dans le cas contraire, si dans la colonne décodage la valeur est 1/y/y et que le parent récurrent est pomme alors le nouveau décodage sera automatiquement faux (1/y/y/pomme au lieu de 1//y/pomme ).

L'idée est donc tout d'abord d'assembler les colonnes B et C avec un séparateur /. Ensuite, l'idée est que si deux valeurs égales (ou plus) sont voisines alors on affiche un nombre de / égal au nombre de valeurs égales voisines suivie de la valeur en question.

Au final le récurrent est juste à ajouter à la suite en effet, après faut mettre en forme sur toute les valeurs différentes que comporte ta chaine de caractère, je regarde pour modifier cela

Bonjour ECG,

D'accord super !! Merci beaucoup de ton aide

Rolo60

Salut,

Avec un peu de retard un nouveau fichier (je compare simplement la valeur actuelle à la suite et si c'est la même je la supprime en prenant bien en compte le cas particulier de la première valeur qui doit rester intacte):

2decodage-v3.xlsm (18.97 Ko)

Résultats:

exemple

ECG

Bonjour ECG,

Merci de ton aide et de ton temps c'est exactement ce qu'il me fallait !!!

Bonne journée,

Rolo

Rechercher des sujets similaires à "fonction renvoi derniere valeur"