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

Messages postés
17
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
8 août 2005
- - Dernière réponse : cs_etniqs
Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016
- 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
Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 153 internautes nous ont dit merci ce mois-ci

Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
71
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/
Messages postés
196
Date d'inscription
samedi 12 janvier 2002
Statut
Membre
Dernière intervention
1 septembre 2008
1
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.
Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016
0
Merci
t'as essayé ?
dim nm as string

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

msgbox "result =" + nm
Messages postés
17
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
8 août 2005
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.
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
71
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/
Messages postés
17
Date d'inscription
lundi 4 juillet 2005
Statut
Membre
Dernière intervention
8 août 2005
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
Messages postés
140
Date d'inscription
mercredi 18 juin 2003
Statut
Membre
Dernière intervention
16 décembre 2006
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
Messages postés
338
Date d'inscription
mardi 28 janvier 2003
Statut
Membre
Dernière intervention
4 novembre 2008
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
Messages postés
338
Date d'inscription
mardi 28 janvier 2003
Statut
Membre
Dernière intervention
4 novembre 2008
0
Merci
mais c'est du visual basic pas du VBA

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

C'est très inventif et j'adore...
Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016
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