Convertir texte en nombre
Bonjour à tous,
Depuis peu j'essaie de convertir un texte dans la cellule "A1" en nombre dans la cellule "A2".
Le problème est que je ne trouve pas la bonne syntaxe.
Pourriez-vous me donner quelques pistes ?
Voici mon code :
Sub liste()
'
' liste Macro
'
'
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="Tim;Luc"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub
Sub test()
Range("a2").Select
If Range("a1") Is Luc Then
Range("a2") = "125"
End If
End SubVoici la phrase qui me pose problème :
If Range("a1") Is Luc ThenJe vous remercie bien
Bonjour,
Une piste avec une fonction perso qui utilise la fonction Switch() à adapter à tes besoins :
Function TEXTEENNOMBRE(Cel As Range)
Dim Nombre As Double
Dim Chaine As String
Chaine = Cel.Value
TEXTEENNOMBRE = Switch(Chaine = "Luc", 125, Chaine = "Pierre", 345.45, Chaine = "Alain", 64.89, Chaine = "Didier", 8)
End FunctionBonjour,
Merci pour du retour.
Par contre, quand j'entre le code, il me demande de déclarer "sub". Ce que je fais, mais il me redemande de le faire :
Sub a()
Function TEXTEENNOMBRE(Cel As Range)
Dim Nombre As Double
Dim Chaine As String
Chaine = Cel.Value
TEXTEENNOMBRE = Switch(Chaine = "Luc", 125, Chaine = "Pierre", 345.45, Chaine = "Alain", 64.89, Chaine = "Didier", 8)
End Function
End SubJe suis vraiment novice en la matière. Je ne comprends pas comment adapter le contenu de la parenthèse après SWITCH.
Merci encore,
Bonjour,
Es-tu sûr que tu n'as que ce problème dans ton code ?
Le séparateur de liste de validation insérée en VBA est la virgule, donc tu auras bien une liste en exécutant ta procédure, mais avec un seul élément dans la liste : Tim;Luc
Aussi, une petite cure d'amaigrissement ne lui ferait pas de mal :
Sub liste()
With Selection.Validation
.Delete
.Add xlValidateList, , , "Tim,Luc"
End With
End SubC'est vrai que pourquoi se contenter d'une ligne si on peut en mettre beaucoup plus... Ça fait plus riche !
Quant ton 2e code test, il cumule 2 erreurs.
Ceci rectifié, la 2e erreur n'aurait pas déclenchée d'erreur d'exécution : Luc (sans guillemets) est alors interprétée par VBA comme variable non déclarée, donc de type Variant, et non initialisée, sa valeur est Empty... La procédure aurait donc renvoyé 125 dans A2 si A1 était vide mais rien si A1 contenait la chaîne "Luc" !
Cordialement.
Merci beaucoup MFerrand.
Ce n'est plus une cure d'amaigrissement, le code est devenu anorexique !!
C'est vrai je ne suis pas très fort en syntaxe mais j'ai une petit excuse : je suis novice !
Alors avec tous ces conseils, voici le code :
Sub liste()
Range("a1").Select
With Selection.Validation
.Delete
.Add xlValidateList, , , "Tim,Luc"
End With
End Sub
Sub a()
Range("b1").Select
If Range("a1") = "Luc" Then
Range("b1") = "125"
End If
End SubSeulement, je suis obligé de presser la touche F5 dans la Sub a() pour que 125 s'affiche. Comment pourrais-je faire pour que la simple sélection de "Luc" permette l'affiche de 125 en "B2' ?
Merci bien pour tout ceci.
désolé, Louis, j'sais convertir seulement Louis15 en LouisXV !
dhany
petit bonus : un roi Louie célèbre (qui n'est pas le Roi-Soleil) :
le Roi est à gauche de Mowgli ; https://www.dailymotion.com/video/x6z4wh
@MFerrand (et aux autres intervenants) : merci de lire la question du message de Louis15 (tout à la fin) :
https://forum.excel-pratique.com/viewtopic.php?p=660475#p660475 ; ce sera encore mieux si vous pouvez lui répondre !
dhany
Mais tu es un petit marrant Dhany
Pour convertir "XV" en "15", je crois que tu utilise la formule suivante :
Sub liste()
Range("a1").Select
With Selection.Validation
.Delete
.Add xlValidateList, , , "XV,XVI"
End With
End Sub
Sub a()
Range("b1").Select
If Range("a1") = "XV" Then
Range("b1") = "15"
Elseif Range("a1") = "XVI" Then
Range("b1") = "cutted head"
End If
End SubLa photo du singe est un fidèle portrait d'un de mes lointains ancêtres d'ailleurs...
Oui j'attends avec impatience la réponse des internautes, qui pourrait grandement me faire avancer dans ma petite vie de programmateur
Bonjour,
Il faut que tu places ton code dans une évènementielle Change de la feuille... Essaie-toi y !
Bonjour MFerrand,
Voici la solution que je propose mais malheureusement, mon problème n'est toujours pas résolu : les nombres en "B1" ne s'affichent pas. je suis encore obligé d'aller dans le code source et de cliquer sur F5.
Code :
Sub liste()
Range("a1").Select
With Selection.Validation
.Delete
.Add xlValidateList, , , "Tim,Luc"
End With
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("A1") = "Tim,Luc" Then Range("B1").Select
End Sub
Sub a()
Range("b1").Select
If Range("a1") = "Luc" Then
Range("b1") = "125"
End If
End SubComme tu me l'as conseillé, j'ai rajouté Change. What you thing about ?
1) Change et SelectionChange, ce n'est pas le même évènement...
2) La proc. d'évènement remplace la procédure initiale qui disparaît.
3) Une procédure d'évènement de feuille se place dans le module de la feuille concernée (ailleurs elle n'agira pas !
4) En VBA on n'est pas en manuel, on ne sélectionne pas l'objet de l'action !
5) On ne met jamais de nombre entre guillemets (sauf exception excessivement rare).
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 And Target.Column = 1 Then
If Target = "Luc" Then
Target.Offset(, 1) = 125
Else
Target.Offset(, 1).ClearContents
End If
End If
End SubA toi de l'insérer et d'éliminer ce qui est caduc.
Merci beaucoup MrFerrand pour ce précieux coup de pouce !! J'ai enfin réussi grâce à vous et j'ai aussi inséré "Tim" = 147. Je fais permuter les deux.
Topic closed
Bonsoir à tous,
Je crois que je vais devenir fou. J'ai déjà arraché tous mes cheveux (ça me coûtera moins cher en coiffeur...)
A la base, je devais faire un code pour que si "a1" affiche une valeur texte, alors "b1" la retranscrit en nombre. Cela a très bien marché après les précieux conseils que j'ai eu ici.
Sauf que j'ai voulu doubler ce code : faire en sorte que si "c1" affiche une valeur texte, alors "b1" la retranscrit en nombre.
Mais là, PADBOUM mon code danse la polka et je retrouve avec "a1" qui ne veut plus afficher de nombre en "b1", "c1" qui affiche les mêmes valeurs textes que "a1" et "b1" qui devait afficher les valeurs texte... affiche désormais ce que devait faire "c1".
Là je ne vois vraiment pas le soucis, donc après plusieurs heures à me creuser la tête (que je me suis d'ailleurs trépanée), voici ce code de malheur :
MODULE1 :
Sub liste_sexe_homme()
With Selection.Validation
.Delete
.Add xlValidateList, , , "Homme,Femme,Enfant"
End With
End Sub
Sub liste_homme_nbr()
Range("b1").Select
If Range("a1") = "Homme" Then
Range("b1") = "1"
If Range("a1") = "Femme" Then
Range("b1") = "2"
If Range("a1") = "Enfant" Then
Range("b1") = "3"
End If
End If
End If
End Sub
Sub liste_vêtements_noir1()
With Selection.Validation
.Delete
.Add xlValidateList, , , "Noir,Blanc,Bleu"
End With
End Sub
Sub liste_vêtements_noir1_nbr()
Range("b1").Select
If Range("c1") = "Noir" Then
Range("b1") = "01"
If Range("c1") = "Blanc" Then
Range("b1") = "02"
If Range("c1") = "Bleu" Then
Range("b1") = "03"
End If
End If
End If
End SubFEUIL1 :
Private Sub ah_Change(ByVal Target As Range)
If Target.Count = 1 And Target.Column = 1 Then
If Target = "Homme" Then
Target.Offset(, 1) = "1"
Else
Target.Offset(, 1).ClearContents
If Target = "Femme" Then
Target.Offset(, 1) = "2"
Else
Target.Offset(, 1).ClearContents
If Target = "Enfant" Then
Target.Offset(, 1) = "3"
Else
Target.Offset(, 1).ClearContents
End If
End If
End If
End If
End Sub
Private Sub bh_Change(ByVal Target As Range)
If Target.Count = 1 And Target.Column = 1 Then
If Target = "Noir" Then
Target.Offset(, 1) = "01"
Else
Target.Offset(, 1).ClearContents
If Target = "Blanc" Then
Target.Offset(, 1) = "02"
Else
Target.Offset(, 1).ClearContents
If Target = "Bleu" Then
Target.Offset(, 1) = "03"
Else
Target.Offset(, 1).ClearContents
End If
End If
End If
End If
End SubPS : la potence est déjà accrochée dans le grenier
J'ai fait des remarques à 13:56... et je revois du code avec des Select inutiles et des nombres entre guillemets, sans parler d'autres éléments sur lesquels je n'ai pas encore eu l'occasion de faire des remarques.
En pareil cas, je n'ai pas pour habitude d'insister, on n'aide pas quelqu'un contre son gré !
Un dernier point cependant au sujet des évènements. Un évènement permet de programmer une procédure qui se déclenchera automatiquement à la survenance de l'évènement. Un évènement se produit lorsque l'utilisateur interagit avec le document sur lequel il travaille. Par exemple l'utilisateur modifie la valeur dans une cellule d'une feuille, cela provoque un évènement Change, que l'on peut intercepter au niveau de la feuille sur laquelle il se produit :
Private Sub Worksheet_Change(ByVal Target As Range)
Le moyen c'est une procédure évènementielle obligatoirement dans le module de la feuille prévu pour cela. Comme on voit la procédure est privée, mais si l'utilisation du mot-clé Private pour une quelconque procédure dans n'importe quel module constitue une option ayant pour effet de ne permettre l'accès à la procédure qu'à partir du module où elle se trouve, s'agissant d'une évènementielle, ce n'est pas une option, ces procédures dérogent à la règle générale que toute procédure est publique par défaut, elles ne peuvent être publiques et ne peuvent prendre place que dans un module spécifique dédié à l'objet.
Et l'évènement niveau feuille, c'est Worksheet_Change, pas MaFeuille_Change ou MaFantaisie_Change...
La procédure d'évènement nous passe en argument la plage modifiée l'ayant provoqué : Target en tant qu'objet Range, que l'on peut utiliser pour vérifier qu'il s'agit bien de la source de changement que l'on surveille pour y réagir.
Et l'évènement est unique, il ne peut y avoir qu'une seule procédure d'évènement Change pour une même feuille.
On ne tape en général pas la déclaration de procédure d'une évènementielle : on choisit l'objet dans la liste déroulante de gauche du module (Worksheet), VBA inscrira la déclaration de procédure d'évènement par défaut de l'objet Worksheet (qui est Worksheet_SelectionChange), si ce n'est l'évènement qu'on recherche, on peut alors en choisir un autre dans liste déroulante de droite, et VBA inscrira la déclaration de procédure, ce qui évite bien des erreurs.
On peut intercepter le même évènement au niveau classeur :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Là la procédure nous passe, outre la plage modifiée l'ayant déclenchée (Target), la feuille sur laquelle se trouve cette plage (Sh). Si l'on surveille un évènement sur plusieurs feuilles on a intérêt à utiliser l'évènement au niveau classeur plutôt que le répéter pour toutes les feuilles concernées.
Les évènements de niveau classeur prennent obligatoirement place dans le module ThisWorkbook.
[On peut également intercepter l'évènement au niveau Application... mais là on ne dispose pas d'un module dédié, il faut le créer au moyen d'un module de classe...]
Les évènements on s'en sert, mais cela obéit à des règles précises, et il vaut mieux éviter d'en inventer qui n'auront généralement pas l'effet recherché.
Pour éviter de faire n'importe quoi, le passage préalable par l'étape Cours a son utilité.
Cordialement.
Bonjour LouisXV,
Tu a écrit :PS : la potence est déjà accrochée dans le grenier
J'ai trouvé la corde qui va avec ta potence, mais y'a un problème : c'est pas à toi d't'en servir ! tu connais bien la chanson :
« ah ça ira, ça ira, ça ira ! les aristocrates on les pendra !!! » ; donc laisse le peuple en décider, stp !
surtout qu'avant l'heure fatale, j'aimerais bien qu't'examine le fichier qu'j'ai fait tout spécialement pour toi :
À l'ouverture du fichier, tu verras une belle feuille entièrement vide ; ensuite, fais ceci :
a) en A1, saisis au choix "homme", "femme" ou "enfant" ; vu ?
b) en A2, saisis au choix "noir", "blanc" ou "bleu" ; ça te va ?
alors renonce à ton idée première, car même si j'suis pas royaliste, vu tous les présidents qui se succèdent et qui voient tous leur cote de popularité en chute libre peu de temps après leur élection, ça s'rait pas plus mal qu'tu prolonges ton règne encore un p'tit siècle !
Alt F11 pour voir le code VBA, puis revenir sur Excel
Si besoin, tu peux demander une adaptation.
Merci de me donner ton avis.
dhany
Bonjour à tous,
Là, ça par dans tous les sens !
Louis15 reconstruit Excel VBA : Private Sub ah_Change(ByVal Target As Range), sitôt que tu as fini, tu peux nous donner la version béta ?
Voici un classeur avec deux fonctions perso utilisant la fonction "Switch()" (une fonction ne peut pas être encadrée de "Sub-End Sub" comme tu nous montre dans ta réponse) avec en colonne A les listes de validation et colonne B les formules. Il ne sert absolument à rien d'utiliser des procédures événementielles alors que des fonctions font très bien le travail !
Le classeur :