Faire reconnaître une chaîne de caractère comme variable... [Résolu]

edouard_berth 17 Messages postés lundi 4 juillet 2005Date d'inscription 8 août 2005 Dernière intervention - 6 août 2005 à 19:44 - Dernière réponse : cs_etniqs 201 Messages postés mardi 7 octobre 2003Date d'inscription 10 mai 2016 Dernière intervention
- 8 août 2005 à 10:27
Bonjour,

J'ai une macro qui me renvoie des valeurs en string qui correspondent à des variables que j'ai déclaré précedemment, et je n'arrive pas à faire reconnaître mes chaînes comme telles.
Dans l'exemple suivant, je voudrais obtenir 98 dans ma msgbox à partir de "ki"...

Sub Conversion()

k1 = 98
I = 1
MsgBox ("k" & i) 'Renvoie bien sûr "ki"

End Sub

J'ai essayé tout un tas de combinaisons avec Cint, Cstr ... comme me l'avait conseillé Daniel,
mais je n'arrive à rien.

Si quelqu'un pouvait m'aider...

Merci,

E.B.
Afficher la suite 

13 réponses

Meilleure réponse
cs_etniqs 201 Messages postés mardi 7 octobre 2003Date d'inscription 10 mai 2016 Dernière intervention - 8 août 2005 à 09:22
3
Merci
forcement, y'a une erreur puisque ce devrait être :

dim nm as integer

mais bon, c'est pas possible de le faire comme ça, il faudrait récupérer l'adresse mémoire de ta variable... sinon,

pourquoi ne fais-tu pas un tableau de type variant avec des string qui sont "k1 = 98"

dim tableau as variant 'variant pour avoir les propriétés de supp, ajout,...
exemple : tableau(56)="k1=98"
tu as donc

function conversion(byval truc1 as string, byval truc2 as string) as integer
truc = truc1+truc2
for i = 0 to ubound(tableau)
if truc = left(k1,instr(0,tableau(i),"=") then 'tu cherches ton k1
conversion= cint(mid(tableau(i),instrrev(tableau(i),"="),len(tableau(i))
exit function
end if
next i
msgbox "a pas trouvé le truc"
end function

Merci cs_etniqs 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 6 août 2005 à 19:57
0
Merci
Utilise des tableaux plutôt :



Dim k(100) As integer

I = 1

Msgbox (k(I))

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : http://www.ProgOtoP.com/popapi/
SupraDolph 196 Messages postés samedi 12 janvier 2002Date d'inscription 1 septembre 2008 Dernière intervention - 6 août 2005 à 21:09
0
Merci
Sub Conversion()
'déclaration de tes varibles en tant qu'entier
dim k1 as integer
dim i as integer

k1 = 98
i = 1
MsgBox ("k1=" & str(k1) & " i=" & str(i)) 'Renvoie bien sûr "k1=98 i=1""

End Sub

j'espère que c'est ce que tu voulais

SupraDolph.
cs_etniqs 201 Messages postés mardi 7 octobre 2003Date d'inscription 10 mai 2016 Dernière intervention - 6 août 2005 à 21:51
0
Merci
t'as essayé ?
dim nm as string

k1 = 98
nm = cint(cstr("k" + i))

msgbox "result =" + nm
edouard_berth 17 Messages postés lundi 4 juillet 2005Date d'inscription 8 août 2005 Dernière intervention - 7 août 2005 à 11:48
0
Merci
Désolé d'insiter, mais je n'y arrive toujours pas. La solution de etniks me renvoie une incompatibilité de type...

Ce que je ne comprends pas c'est pourquoi à partir du moment ou j'obtiens la chaîne de caractère correspondant à ma variable "k1" correspondant à k1, la fonction Cint ne suffit pas m'ôter les "" pour reconnaître la variable...


Je vais tenter de passer par un tableau, mais le problème, c'est que ma chaîne en string es déjà renvoyée par un tableau genre tblo(5)="k1"...


Merci pour votre aide

E.B.
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 7 août 2005 à 13:08
0
Merci
Ben tu es en VB, tu n'est pas en LISP, tes variables sont typés. La
fonction CInt convertit une chaîne en nombre, ca d'accord, mais elle
n'interprête pas la chaîne. Par exemple, Cint("8 + 3") te renvoie pas
11 mais provoque une erreur de type incompatible, normal !



C'est pour cà, tu n'a guère le choix, à part passer par un tableau, je ne vois pas !

DarK Sidious

Un API Viewer (pour le VB, VB.NET, C, C# et Delphi) : www.ProgOtoP.com/popapi/
edouard_berth 17 Messages postés lundi 4 juillet 2005Date d'inscription 8 août 2005 Dernière intervention - 7 août 2005 à 17:53
0
Merci
J'ai trouvé une solution à mon problème qui, je dois le reconnaître n'est pas bien élégante...
Je vuolais initialement convertir les nombres en chiffres romains d'une chaîne en chiffres arabes, et ma question visait à m'éviter la lourdeur des "if" successifs pour t et t-1...
Je ne doute pas qu'il y ai plus simple, mais le plaisir de réussir tout seul...
Merci quand même

Sub Romains()


Dim VF As Integer


For k = 3 To 24


Dim Tableau()
Compteur = 1

For I = 0 To Len(Cells(k, 1)) - 1
clef = Mid(Cells(k, 1), I + 1, 1)
ReDim Preserve Tableau(1 To Compteur)
Tableau(Compteur) = clef
Compteur = Compteur + 1
Next


t = 2


If Len(Cells(k, 1)) > 1 Then


While t <= Len(Cells(k, 1))
If Tableau(t) "I" Then Tableau(t) 1If Tableau(t) "V" Then Tableau(t) 5If Tableau(t) "X" Then Tableau(t) 10If Tableau(t) "L" Then Tableau(t) 50If Tableau(t) "D" Then Tableau(t) 100If Tableau(t) "M" Then Tableau(t) 1000If Tableau(t - 1) "I" Then Tableau(t - 1) 1If Tableau(t - 1) "V" Then Tableau(t - 1) 5If Tableau(t - 1) "X" Then Tableau(t - 1) 10If Tableau(t - 1) "L" Then Tableau(t - 1) 50If Tableau(t - 1) "D" Then Tableau(t - 1) 100If Tableau(t - 1) "M" Then Tableau(t - 1) 1000



If Tableau(t - 1) >= Tableau(t) Then
If t < Len(Cells(k, 1)) Then
VF = VF + Tableau(t - 1)
Else: VF = VF + Tableau(t - 1) + Tableau(t)
End If
t = t + 1
Else: VF = VF + Tableau(t) - Tableau(t - 1)
t = t + 2
End If

Wend

ElseIf Len(Cells(k, 1)) = 1 Then If Tableau(1) "I" Then Tableau(1) 1 If Tableau(1) "V" Then Tableau(1) 5 If Tableau(1) "X" Then Tableau(1) 10 If Tableau(1) "L" Then Tableau(1) 50 If Tableau(1) "D" Then Tableau(1) 100 If Tableau(1) "M" Then Tableau(1) 1000

VF = Tableau(1)


ElseIf Len(Cells(k, 1)) = 0 Then
VF = 0


End If


VF = 0


Next


End Sub
RicoNuch 140 Messages postés mercredi 18 juin 2003Date d'inscription 16 décembre 2006 Dernière intervention - 7 août 2005 à 19:18
0
Merci
Il y avait aussi une solution, mais un peu lourde à mettre en place (c'est pourquoi je ne l'ai pas donnée), qui consistait à créer une collection "encapsulée" comme décrite dans les tutos msdn, qui te permet d'appeler indifféremment l'élément de la collection par son index numérique ou son index de type « string ».




Rico
cs_hassen 338 Messages postés mardi 28 janvier 2003Date d'inscription 4 novembre 2008 Dernière intervention - 7 août 2005 à 22:38
0
Merci
j'ai un petit solution je sais pas si elle te convient


en fait pour les variables t'a qu'a mettre des controles label invisible sur la feuille


Label1 = 20


MsgBox Form1.Controls("label1").Caption

Hassen TUNISIE
cs_hassen 338 Messages postés mardi 28 janvier 2003Date d'inscription 4 novembre 2008 Dernière intervention - 7 août 2005 à 22:44
0
Merci
mais c'est du visual basic pas du VBA

Hassen TUNISIE
cs_etniqs 201 Messages postés mardi 7 octobre 2003Date d'inscription 10 mai 2016 Dernière intervention - 8 août 2005 à 09:24
0
Merci
oups :
pas : left(k1,instr(0,tableau(i),"=")
mais : left(0,instr(0,tableau(i),"=")
edouard_berth 17 Messages postés lundi 4 juillet 2005Date d'inscription 8 août 2005 Dernière intervention - 8 août 2005 à 10:19
0
Merci
Merci beaucoup,

C'est très inventif et j'adore...
cs_etniqs 201 Messages postés mardi 7 octobre 2003Date d'inscription 10 mai 2016 Dernière intervention - 8 août 2005 à 10:27
0
Merci
bon, faut faire attention,
truc = left , devrait être if strcomp(...)=0
je sais pas si t=t marche avec les string (il me semble que si ?)

oublie pas les trim(..) si tu mets des espaces

bon courage

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.