Impossible récupérer résultat d'une Function
Bonjour,
Pas moyen de se sortir d’une erreur de … déclaration ??...
La situation :
Sur une feuille dans une cellule existe un texte.
Je dois récupérer les mois se présentants (en cours) , pour les incémenter d'un mois. Pas de problemes pour cela.
Par contre dans ce texte (ces textes..) , existe par exemple le mois d’Aout , mais écrit avec un accent sur le U.
Les accents étants « non-compatibles », je suis parvenu à « ponctionner » ce mot « août » et faire marcher une fonction permettant de supprimer les accents indésirables..
Function R_MoisPrec_par_MoisAct_Long(MoMmoisPreced, MoMoisAcoller)
Dim Result As String
If MoMmoisPreced Like "ao*" Then
supprimerAccents (MoMmoisPreced)
MsgBox supprimerAccents
End If
Select Case MoMmoisPreced
Case "janvier "
MoMoisAcoller = "février "
Case "février "
MoMoisAcoller = "mars "
Case "mars "
MoMoisAcoller = "avril "
Case "avril "
MoMoisAcoller = "mai "
Case "mai "
MoMoisAcoller = "juin "
Case "juin "
MoMoisAcoller = "juillet "
Case "juillet "
MoMoisAcoller = "août "
Case "août "
MoMoisAcoller = "septembre "
Case "septembre "
MoMoisAcoller = "octobre "
Case "octobre "
MoMoisAcoller = "novembre "
Case "novembre "
MoMoisAcoller = "décembre "
Case "décembre "
MoMoisAcoller = "janvier "
End Select
End FunctionFunction supprimerAccents(StrAvant As String) As String
Dim StrApres As String
Dim Bcle&
Const VAccent = "àáâãäåéêëèìíîïðòóôõöùúûü", VSsAccent = "aaaaaaeeeeiiiioooooouuuu"
StrApres = StrAvant
For Bcle = 1 To Len(VAccent)
StrApres = Replace(StrApres, Mid(VAccent, Bcle, 1), Mid(VSsAccent, Bcle, 1))
Next Bcle
supprimerAccents = StrApres
End FunctionJe reste maintenant bloqué, car je ne parviens pas à récupérer dans une variable le ‘Aout’ « nettoyé »..
D’innombrables essais et recherches ne me sortent pas d’une lacune …
Que faire ?
Merci.
Bonjour,
met un exemple de texte avant et ce que tu veux obtenir car ce n'est pas très clair.
Pour juillet et août, avant et après, dans un fichier xls de préférence, qu'on ait tous les éléments
eric
Bonjour,
Joint un extrait classeur partie fonctionnelle.
En avancant par F8 et en stoppant sur cette étape :
on determine bien que "supprimerAccents" est bien chargé avec le "aout" sans accent..
Par contre, et c'est la le Pb, je ne réussi pas a récupérer le "Aout" une fois la Function quittée...
Merci ..
Bonjour Max60, eriiic,
Si j'ai bien compris tu souhaites, à partir d'un texte, remplacer les accents, récupérer le mois et l'incrémenter via une formule personnalisée ?
Je n'ai pas manipulé de VBA depuis un moment mais un test qui me semble fonctionnel (loin d'être optimisé) :
Public StrApres$
Function R_MoisPrec_par_MoisAct_Long(MoMmoisPreced$) As String
Dim MoMoisAcoller$
If MoMmoisPreced Like "*ao*" Then
supprimerAccents (MoMmoisPreced)
End If
StrApres = StrApres
Select Case True
Case StrApres Like "*janvier*"
MoMoisAcoller = "février "
Case StrApres Like "*février*"
MoMoisAcoller = "mars "
Case StrApres Like "*mars*"
MoMoisAcoller = "avril "
Case StrApres Like "*avril*"
MoMoisAcoller = "mai "
Case StrApres Like "*mai*"
MoMoisAcoller = "juin "
Case StrApres Like "*juin*"
MoMoisAcoller = "juillet "
Case StrApres Like "*juillet*"
MoMoisAcoller = "aout "
Case StrApres Like "*aout*"
MoMoisAcoller = "septembre "
Case StrApres Like "*septembre*"
MoMoisAcoller = "octobre "
Case StrApres Like "*octobre*"
MoMoisAcoller = "novembre "
Case StrApres Like "*novembre*"
MoMoisAcoller = "décembre "
Case StrApres Like "*décembre*"
MoMoisAcoller = "janvier "
End Select
R_MoisPrec_par_MoisAct_Long = MoMoisAcoller
End Function
Function supprimerAccents(StrAvant$) As String
Const VAccent = "àáâãäåéêëèìíîïðòóôõöùúûü", VSsAccent = "aaaaaaeeeeiiiioooooouuuu"
StrApres = StrAvant
For Bcle = 1 To Len(VAccent)
StrApres = Replace(StrApres, Mid(VAccent, Bcle, 1), Mid(VSsAccent, Bcle, 1))
Next Bcle
supprimerAccents = StrApres
End FunctionAvec ta phrase, si tu fais
=R_MoisPrec_par_MoisAct_Long(Ta cellule)Alors tu obtiens le résultat escompté.
Sinon explique en détaillé ton problème, donnée initiale, résultat attendu + cheminement.
Cordialement,
bonjour,
une proposition de correction
If MoMmoisPreced Like "ao*" Then 'remarque ne supprime pas les accents pour les autres mois (février, décembre...)
moMmoisPreced=supprimerAccents (MoMmoisPreced)
MsgBox moMmoisPreced
End Ifet en fin de fonction comme l'a proposé Ergotamine
R_MoisPrec_par_MoisAct_Long = MoMoisAcoller
End FunctionBonjour à tous,
comme tu n'as qu'une seule exception et que tu es destiné à devoir écrire les mois en dur, une autre façon d'aborder le problème :
Function moisSuivant(ByVal mois As String) As String
Dim avant, apres, i As Long
avant = Split("janvier,février,mars,avril,mai,juin,juillet,août,aout,septembre,octobre,novembre,décembre", ",") ' en minuscules
apres = Split("février,mars,avril,mai,juin,juillet,août,septembre,septembre,octobre,novembre,décembre,janvier", ",")
For i = 0 To UBound(avant)
If LCase(mois) = avant(i) Then Exit For
Next i
If i <= UBound(avant) Then moisSuivant = apres(i)
End Functionsi d'autres exceptions arrivent, tu peux compléter la liste qui n'a pas besoin d'être ordonnée.
Il y a bien une autre fonction qui permettrai d'être plus concis mais au détriment de la lisibilité des listes
eric
Bonjour a vous trois,
Merci beaucoup tout d'abord de vous etres investis pour m'aider.
Je n'ai malheureusement pas avancé malgré vos écrits.
Pardon de ne m'etre pas suffisament bien expliqué sur la finalité de ma demande.
Ma recherche se résume uniquement à la (manière ? , façon ? , procédure ?) qui permet de retourner dans une variable déclarée d'une Sub appelante , le résultat d'une fontion , lancée depuis cette meme Sub.
.. Dans le cas ou l'on à : Sub => Function 1 => Function 2 => Retour résultat function 2 dans Sub appelante , quelles précautions doit-on éventuellement prendre ?
Pour plus de précisions auriez-vous un fichier d'exemple basic , fonctionnel ?
Merci encore.
Cdlt.
Max
bonjour,
avec la macro à @Eriiic
Function MoisSuivant(ByVal mois As String) As String
Dim avant, apres, i As Long
mois = Replace(mois, "aout", "août", , , 1)
avant = Split("janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre,janvier", ",") ' en minuscules
For i = 0 To UBound(avant)
r = InStr(1, mois, avant(i), 1)
If r > 0 Then MoisSuivant = avant(i + 1): Exit Function
Next i
MoisSuivant = "erreur"
End Function
@BsAlv
Attention.
J'avais fait 2 listes car présence de août et aout pour tenir compte des 2 graphies.
Pas possible d'avoir une liste unique et faire +1 dans ce cas.
Ou alors j'avais mal compris la problématique
@Max60
quelles précautions doit-on éventuellement prendre ?
s'assurer qu'on retourne bien ce qui est désiré comme toujours...
Ma proposition ne nécessite plus l'appel à une autre fonction. Mais des fonctions peuvent s'appeler en cascade sans problème. D'ici que tu atteignes la limite de la pile tu as de la marge.
eric
@Eriiic,
au début de la fonction, il y avait ce Replace pour converser aout en août, mais oui on avait aussi les autres accent, donc oui, avec 2 listes.
Reste le problème de fautes d'orthographe comme dècembre, aôut, ... que la 2ième fonction de Max60 pouvait résoudre, mais ....
Function MoisSuivant(ByVal Mois As String) As String
Dim Avec, Sans, i As Long
Avec = Split("janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre,janvier", ",") ' en minuscules et avec accents
Sans = Split("janvier,fevrier,mars,avril,mai,juin,juillet,aout,septembre,octobre,novembre,decembre,janvier", ",") ' en minuscules sans accents
For i = 0 To UBound(Avec)
r = InStr(1, Mois, Avec(i), 1) + InStr(1, Mois, Sans(i), 1) 'on trouve un mois (avec ou sans accent) dans le texte "Mois"
If r > 0 Then MoisSuivant = Avec(i + 1): Exit Function 'si OUI, on retourne le mois suivant avec accent
Next i
MoisSuivant = "erreur"
End FunctionBonjour,
ah oui, je n'avais pas prêté attention à la 1ère ligne. Je retire ce que j'ai dit :-)
eric
Bonsoir a tous quatre ,
Merci pour vos différentes réponses , recherches , avis.
Je suis enfin sorti de mon blocage... Cela fonctionne.
Les différents éléments m'ont permis de comprendre que les variables servant d'arguments aux Functions , peuvent etres lues en direct depuis la Sub l'ayant appelée... C'était là mon plus "gros !" problème ...
De surcroit , quelques erreurs d'inattention supplémentaires liées à mes choix de noms de variables un peu compliqués , avaient rajouté des éléments a mon échec..
Encore merci a tous !
Max.