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
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:
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:
Le fichier:
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:
résultats:
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
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 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
Bonjour ECG,
Merci de ton aide et de ton temps
Bonne journée,
Rolo