Function si

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour,

Je suis bloqué car je doit écrire une fonction « si » mais le nombre d’argument est trop important, du coup j’aimerais créer une Function dans VBA pour arriver

de ça :

si(A1"Cannes";"CAN";si(A1="Nice";"NIC";""...)

à ça ? :

Function sivaleur()


If "A1" = "Cannes" Then
activecells = "CAN"
esle
If "A1" = "Nice" Then
activecells = "NIC"


End Function ....


J'aimerais pouvoir écrire cette fonction dans une cellule et pouvoir la faire glisser sur une colonne, je joint un fichier test avec.
J'en suis loin non ?
Quelqu'un pourrait me mettre sur la voie et surtout m'expliquer.

Merci d'avance !


Cyril

15 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,
1) cette discussion, qui n'a rien à voir avec
Forum > Visual Basic 6 > Base de données > XML

aurait du être ouverte dans la section Langages dérivés > VBA
Respecte cette règle si tu veux que tes discussions continuent à recevoir des réponses !!!
2)relis ce que tu as écrit ! ... esle !!!!!????

3) une fonction reçoit des paramètres et retourne une valeur. La tienne n'est pas dans ce cas.
corrige et reviens avec ta correction, présentée avec indentation (c'est un minimum).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
C'est dingue mais je ne trouve pas comment rajouter un fichier.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
C'est dingue mais je ne trouve pas comment rajouter un fichier

Et tu n'as pas à en ajouter un (que seuls ouvriraient d'ailleurs les plus imprudents !) !
Ici, on est capable :
- d'isoler le code concerné et de le montrer, seul, indenté et entre balises code
- d'exposer les tenants et aboutissant
- d'exposer la difficulté rencontrée !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
14769
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 février 2021
151
Bonjour,

If Range("A1").Value="Canne" Then
    Range("A2").Value="CAN"
ElseIf Range("A1").value="Caen" Then
    Range("A2).Value="CAE"
Else
End If


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour, NHenry,
- je doute assez fort qu'il ne cherche à traiter qu'une seule cellule.
- je ne sais pas s'il veut son résultat dans une autre colonne de la même ligne ou s'il veut modifier directement la valeur de la cellule elle-même
- je ne sais même pas s'il peut ou non se contenter de ne reprendre que les 3 premières lettres et de les mettre en majuscules
etc ...
Or, il est clair que la stratégie à adopter dépend directement des aboutissants.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Bonjour,

tout d'abord je suis nouveau sur le forum alors je ne connais pas tous les recoins du site, je pensais bien faire en le mettant là ou je l'ai mis, donc la prochaine fois je ne ferais plus l'erreur, désolé !

Ensuite, je débute en VBA alors tu as beau parler comme un ingénieur ça ne m'aidera pas à comprendre pour résoudre mon problème.

Soit, je vais essayer de m'expliquer un peu mieux, j'aimerais avoir une fonction VBA qui prend en compte une cellule qu'on lui donne, là j'ai pris l'exemple de "A1" mais ça pourrait être une autre éventuellement, comme dans une formule, et que cette fonction analyse, selon la cellule qu'on lui a fourni, et inscrive la valeur que je souhaite comme ex : Cannes(en A1) -> CAN(dans une cellule quelconque)
Et non je ne veux pas que les 3 premières lettres, je souhaite une valeur que je puisse définir dans VBA.
C'est pour ça d'ailleurs que je voulais mettre un fichier en copie car c'est difficile d'expliquer un problème par écris.

Bref, j'aimerais avoir votre aide et vos avis sur mon problème.

Merci à vous !

Cyril
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
j'aimerais avoir une fonction VBA qui prend en compte une cellule qu'on lui donne

Ce que tu n'a pas fait
Relis donc :
3) une fonction reçoit des paramètres et retourne une valeur. La tienne n'est pas dans ce cas.
corrige et reviens avec ta correction, présentée avec indentation (c'est un minimum).

Ouvre s'il te plait ton aide VBA sur le mot Function (instruction) et lis. C'est indispensable, si tu veux comprendre ce qu'est une fonction et comment on l'utilise.
Par ailleurs :
1) combien de "chaînes" as-tu à "traduire" ? Car si nombreuses, il va falloir éviter les elseif (ou même select case) alors trop lourds
2)
C'est pour ça d'ailleurs que je voulais mettre un fichier en copie car c'est difficile d'expliquer un problème par écris

Désolé, mais ce qui est conçu clairement s'exprime toujours facilement.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bon ...
Je vais devoir m'absenter ===>> Voilà de quoi réfléchir (exemple à analyser)
Dans un module standard !
Public Function toto(r As Range) As String
  Select Case LCase(r.Value)
    Case "nice"
      toto = "NIC"
    Case "anglet"
      toto = "ANG"
    Case "cannes"
      toto = "CAN"
    Case Else
      toto = "j'en, sais rien"
  End Select
End Function

Dès lors, cette fonction est utilisable dans toute formule Excel ===>>
En colonne A, tu mets des noms de ville (sans même te préoccuper de la casse) dont Nice, Cannes, Anglet ...
En cellule B1 , tu mets cette formule :
= toto(A1)

Tu étires cette formule vers le bas autant que de besoin
Tu regardes le résultat !
Reste que, comme je te l'ai dit plus haut, il te faudra penser à autre chose qu'un select case (ou des elseif) si le nombre des chaînes à traiter est grand (mais c'est une autre question).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Pour tenter de provoquer maintenant en toi un petit réflexe ===>> regarde ce que fait ceci :
Dim toto As New Collection
  mes_noms = Array("nice", "anglet", "cannes", "barcelone", "gibraltar", "madrid")
  mes_trad = Array("NIC", "ANG", "CAN", "BAR", "GIB", "MAD")
  For i = 0 To UBound(mes_noms)
    toto.Add mes_trad(i), mes_noms(i)
  Next
  MsgBox toto("nice")
  MsgBox toto("anglet")
  MsgBox toto("madrid")

Cela devrait faire "tilt" et tu devrais t'en inspirer (npotamment si la liste n'est pas trop longue)
Mais ce n'est là qu'un premier réflexe.
Le second, notamment si très longue liste, devrait te conduire à du plus souple encore : une feuille dédiée à ces chaînes (en colonne A) et à leur "traduction" en colonne B. Puis un simple Find
Mais je VEUX te voir "t'y mettre" un peu par toi-même. Ce ne sera jamùais en regardant les autres nager que tu apprendras à nager, mais en te jetant avec courage et détermination dans le bain (c'est ce que je n'ai cessé de faire depuis mes tous premiers pas en développement ).
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
Bonjour Cyril 7761,

J'ai l'impression que ce que tu souhaites c'est une fonction qui te prenne les 3 premières lettres de la ville et les mette en majuscule !
Pourquoi ne pas faire cela (en lieu et place de ton SI) ?
B1=MAJUSCULE(GAUCHE(A1;3))

Dans ta cellule A1 il y a le nom de la ville et en B1 le résultat (le seul hic c'est pour une ville comme LA ROCHELLE).

Olivier
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour, guilleto,
Tu devrais lire mon message du 19 novembre 2012 à 13:11:12 et sa réponse à ce sujet !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
En effet ucfoutu ...
Désolé ! ;)
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Tu pourrais créer une feuille avec tous les noms en colonne A et tous les acronymes en colonne B.
Tu pourras alors faire une RechercheV pour trouver ce que tu veux.


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Bonjour,

tout d'abord désolé pour mon temps de réponse mais je me suis absenté et je n'ai pas pu m'y mettre dessus plutôt.

La function que tu m'as donné est exactement ce que je voulais, ensuite j'ai lu dans l'aide VBA l'article Function (instruction) et j'ai comparé à celle que tu as fais et c'est vrai que je comprend un peu mieux la structure que tu lui a donné, merci !
D'ailleurs est ce que toutes les functions s'écrivrent de la même façon ?
Le nombre de mes arguments n'est pas très grand je dois en avoir une dizaine différent sur une étendu d'une centaine de ligne.

En revanche ta deuxième macro ça ne fais pas "tilt", je ne comprend pas comment l'utiliser.
J'ai regardé dans l'aide VBA, si j'ai bien compris tu crées une collection de données avec des comparatif comme nice -> NIC mais pour la faire fonctionner je t'avoue que je ne comprend pas trés bien. J'ai essayé avec des "sub" avec des "function" avec "private sub Worksheet_SelectionChange" et encore d'autres choses mais j’arrête ou tu vas te tirer les cheveux ^^
J'ai l'impression qu'il n'y a que la partie "MsgBox toto" qui fonctionne, du coup en résultat j'ai 3 message qui s'affiche NIC, ANG et MAD.

J'ai droit à un petit indice ?

Merci pour ton aide.


Cyril
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
J'ai droit à un petit indice ?

Pas vraiment envue , puisque cela ne fait pas tilt, mais bon ... !
Ne comprends-tu pas que :
1) tu pourrais déclarer ta collection en Public dans un module standard
2) l'alimenter une fois pour toutes au WorkBook_Open
Private Sub Workbook_Open()
  mes_noms = Array("nice", "anglet", "cannes", "barcelone", "gibraltar", "madrid")
  mes_trad = Array("NIC", "ANG", "CAN", "BAR", "GIB", "MAD")
  For i = 0 To UBound(mes_noms)
    titi.Add mes_trad(i), mes_noms(i)
  Next
End Sub

3) et dans le module standard, donc :
Public titi As New Collection
Public Function toto(r As Range) As String
  If r.Value = "" Then Exit Function
  On Error Resume Next
  toto = titi(LCase(r.Value))
  If Err > 0 Then toto = "ché pô, moi"
  On Error GoTo 0
End Function

Et tes formules comme précédemment.
Attention. Après avoir mis ce code : tu dois sauvegarder ton classeur, le fermer. Puisque la collection s'alimente à son ouverture, hein ...
Essaye et tu verras.

Ceci étant dit, la solution de MPI, dont je t'avais également parlé moi-même, est la plus souple.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ