Créer une fonction qui renvoie une string à partir d'une autre

Bonsoir à tous !

Je travaille sur un projet dans lequel j'essaie de minimiser au possible l'usage de macros. Par expérience, même si l'on crée des fonctions, elles sont un peu mieux comprises par le public auquel s'adresse le projet.

Pour résumer, j'aimerais créer une fonction qui, à un objet décrit par sa couleur, associe la couleur. Il n'y a que quelques couleurs possibles donc je peux traiter tous les cas. Je suppose que les couleurs sont rouge, vert et bleu.

A "cahier bleu", je veux associer "bleu" ; à "stylo vert", "vert" ; à "planche rouge", "rouge".

Voici le script de la fonction :

Function COUL(str)
If InStr(1,str, "bleu") Then 
    COUL="bleu"
ElseIf InStr(1,str,"rouge") Then 
    COUL="rouge"
Else if :
    COUL="vert"
End If
end Function

Or, cela ne fonctionne pas. Lorsque j'appelle la fonction : par exemple, "=COUL($A1)", au mieux j'ai 0 (si je l'appelle en dehors de mon tableau) ; au pire (dans le tableau), "=COUL($A1)" est écrit et rien ne se passe.

L'usage de fonctions et de macros me pousse à vous poser une autre question sur leur gestion. J'ai remarqué que dans la fenêtre VBA on pouvait trouver un emplacement pour la feuille 1, pour la feuille 2, "this Workbook" et "Module"
Où placer quoi ? (Les macros que j'utilise sont transversales, elles prennent des infos et écrivent dans chacune des deux feuilles).
Pour le moment, ces quatre emplacements contiennent tous les scripts (c'est peu lisible, mais au moins cela fonctionne). J'attends votre éclairage pour alléger tout cela.

Je vous remercie beaucoup pour le temps que vous m'accorderez et vous souhaite une excellente soirée !

Louisandrex.

Bonjour,

Avec ce code j'ai le résultat escompté :

Function COUL(Target As Range)
If InStr(1, Target, "bleu") Then
    COUL = "bleu"
ElseIf InStr(1, Target, "rouge") Then
    COUL = "rouge"
Else
    COUL = "vert"
End If
End Function

str ne renvois je crois à rien de défini.

Pour ce qui est du code, je te conseille de le placer dans un module afin qu'il soit applicable à l'ensemble des feuilles. On place plutôt des codes évenementiels concernant l'objet dans des WB ou des WS.

Bonne soirée.

Edit : Aux experts VBA, n'est-il pas possible d'avoir un code avec switch case dans ce cas qui pourrait être plus optimise ?

Bonjour,

J'ai modifié ta fonction et placé dans un module standard (module1).

Cdlt.

Public Function COUL(txt As String) As String
    If InStr(1, txt, "bleu") Then
        COUL = "bleu"
    ElseIf InStr(1, txt, "rouge") Then
        COUL = "rouge"
    ElseIf InStr(1, txt, "vert") Then
        COUL = "vert"
    Else
        COUL = ""
    End If
End Function
17louisandrex.xlsm (14.27 Ko)

Bonjour,

Une adaptation :

Public Function COUL(ByVal str As String) As String
Select Case True
    Case str Like "* bleu*": COUL = "bleu"
    Case str Like "* rouge*": COUL = "rouge"
    Case str Like "* vert*": COUL = "vert"
End Select
End Function

Attention, cela ne fonctionne ici que si la couleur est précédée d'un espace, par exemple pour éviter de renvoyer rouge pour montrouge.

edit : salut Jean-Eric, salut Ergotamine !

Merci à tous pour vos différentes réponses et subtilités de rédaction.

Bonne soirée ! J'essaie cela au travail demain !

Bonjour Jean-Eric, Bonjour Pedro,

Pourquoi déclarer la fonction en PUBLIC ? Comment la fonction sait-elle que c'est le contenu de la cellule que nous interrogeons si nous ne lui indiquons pas une range ? Quel est l'intérêt du ByVal ?
Désolé mais questions sont sûrement bêtes mais j'essaie de comprendre chaque mot.

Bonne soirée à vous !

Bonjour Ergotamine !

La doc Microsoft indique : "Les variables déclarées à l’aide de l’instruction Public sont accessibles à toutes les procédures dans tous les modules dans toutes les applications"

ByVal, en opposition à ByRef, permet de récupérer la valeur d'une variable, plutôt que de travailler en direct dessus. Il s'agit en gros de créer une copie, que tu peux modifier, changer, supprimer, maltraiter, sans affecter l'originale passée en argument de la fonction. J'ai pris l'habitude de le préciser, mais ce n'est pas utile dans tous les cas...

Bonjour Pedro et merci de ta réponse,

Je suis d'accord avec le Public, mais par définition, une fonction dans un module n'est pas accessible a toutes les WS ? Dans ce cas précis c'était optionnel ?

Pour ce qui est des modules par contre je comprend, si une autre procédure doit utiliser cette fonction, si elle n'est pas en public, nous ne pourrons pas.

D'avance merci pour ton retour et bonne journée !

Bonjour à tous,

une solution qui ne fonctionne que si dans la description de l'objet la couleur est à la fin, du style :"cahier bleu", "stylo vert", "planche rouge"...

Function COUL(txt As String) As String
    On Error Resume Next
    COUL = Split(txt, " ")(1)
End Function

A+

Je suis d'accord avec le Public, mais par définition, une fonction dans un module n'est pas accessible a toutes les WS ? Dans ce cas précis c'était optionnel ?

Pour ce qui est des modules par contre je comprend, si une autre procédure doit utiliser cette fonction, si elle n'est pas en public, nous ne pourrons pas.

Les 2 termes sont facultatifs dans le cas présent. J'aime bien rajouter des trucs qui servent à rien, surtout pour penser à les préciser quand ça devient utile !

L'utilisation de ByVal ou ByRef est sans effet ici puisque la fonction ne modifie pas la variable utilisée en entrée de la fonction, mais s'en sert juste pour calculer un résultat. Tu trouveras des explications plus claires que les miennes sur internet si le sujet t'intéresse.

Bonjour,

Merci et désolé j'aime bien comprendre des trucs qui servent à rien, surtout pour penser à les comprendre quand ça devient utile !

Je m'en vais de ce pas me documenter !

Encore merci !

Rechercher des sujets similaires à "creer fonction qui renvoie string partir"