Microsoft 365 affecter des valeurs dans un tableau de noms de variable

bérylion

XLDnaute Occasionnel
Salut la foule
j'essaie désepérément d'affecter par une boucle, des valeurs à des noms de variables contenus dans un tableau.

en gros, je créé un userform dont le nbr de TextBox est variable, pour renseigner des valeurs et faire ensuite un calcul savant et alambiqué
jusque la tout va bien, ça fonctionne pour ce que j'ai besoin d'en faire.

la ou ca coince, c'est que le nbr de TextBox étant variable (mais connu à l'avance), je voudrais pouvoir affecter les valeurs renseignées dans les textbox à des variables dans un tableau contenant les noms de ces variables

pour illustrer, un petit exemple qui reprend l'architecture de mon usine à gaz
avec un userform (UserForm1) contenant un form avec 7 textbox et 1 label
on tape des valeurs dans les textbox et le calcul s'affiche directement dans le label
le traitement se fait dans un module de classe (ClasseTxtbox)

la vraie question c'est comment remplacer
ça :
a = ConvTxt(.TextBox1)
b = ConvTxt(.TextBox2)
c = ConvTxt(.TextBox3)
d = ConvTxt(.TextBox4)
...
x = ConvTxt(.TextBox24)
y= ConvTxt(.TextBox25)
z = ConvTxt(.TextBox26)

par un truc du genre ça (mais qui marche...) :
varTBL = [{"a" , "b", "c", "d", ...,"x", "y", "z"}]
For i = 1 To .Controls.Count-1 ' /!\ .Controls(0) doit etre .label1 /!\
varTBL(i ) = ConvTxt(.Controls(i).text)
Next

à vot' bon coeur...

VB:
'UserForm1'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim TxtboxCollection As New Collection
Private Sub UserForm_Initialize()
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.TextBox Then
      Set ClsTxtbox = New ClasseTxtbox
      With TxtboxCollection
        .Add ClsTxtbox: Set .Item(.Count).Txtbox = Ctrl
      End With
    End If
  Next
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

#########################################################

'ClasseTxtbox''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Public WithEvents Txtbox As MSForms.TextBox

Private Sub Txtbox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Select Case KeyAscii
    Case 44, 46
      If Len(Txtbox.text) = 0 Then Txtbox.text = "0"
      KeyAscii = 44
    Case 48 To 57
      DoEvents
    Case Else
      KeyAscii = 8
  End Select
End Sub

Private Sub Txtbox_Change()
  With UserForm1
    varTBL = [{"a" , "b", "c", "d", "e", "f", "g"}]
      For i = 1 To .Controls.Count -1
        varTBL(i ) = ConvTxt(.Controls(i).text)
      Next
      
      a = ConvTxt(.TextBox1)
      b = ConvTxt(.TextBox2)
      c = ConvTxt(.TextBox3)
      d = ConvTxt(.TextBox4)
      e = ConvTxt(.TextBox5)
      f = ConvTxt(.TextBox6)
      g = ConvTxt(.TextBox7)

      .Label1 = a+b-c*d*e/2+f-g ' <- c'est juste pour l'ex
  End With
End Sub


Private Function ConvTxt(Txt) As Double
  ConvTxt = CDbl(IIf(Txt = "", 0, Txt))
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
Solution
Bonjour,
J'ai pas mal cherché mais je n'ai rien trouvé qui convertisse une chaine de caractères en nom de variables.
Sorry.
Re-
bon j'ai pas 'exactement' ce que je voulais mais je me suis dépatouillé autrement
je passe par un dico pour affecter les couples lettre/valeur
ça me permet de pouvoir écrire mes formules plus facilement ce qui était la raison principale de ma demande et du coup mon pb est résolu

pour ceux que ça pourrait intéresser, si jamais... :

VB:
Public WithEvents Txtbox As MSForms.TextBox

Private Sub Txtbox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Select Case KeyAscii
    Case 44, 46
      If Len(Txtbox.text) = 0 Then Txtbox.text = "0"
      KeyAscii = 44 + 36 * (InStr(Txtbox.text, ",") > 0)
    Case...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir bérylion,
Peut être une idée en récupérant les textbox dans un array :
VB:
Sub CommandButton1_Click()
Dim T(1 To 26) ' T est un array récupérant les valeurs des textbox
For i = 1 To 26
    T(i) = UserForm1.Controls("TextBox" & i)
Next i
End Sub
Les variables ne seront pas ensuite a, b, c mais T(1), T(2), T(3)
 

bérylion

XLDnaute Occasionnel
Bonsoir bérylion,
Peut être une idée en récupérant les textbox dans un array :
VB:
Sub CommandButton1_Click()
Dim T(1 To 26) ' T est un array récupérant les valeurs des textbox
For i = 1 To 26
    T(i) = UserForm1.Controls("TextBox" & i)
Next i
End Sub
Les variables ne seront pas ensuite a, b, c mais T(1), T(2), T(3)
Bonjour sylvanu
Bel effort, mais c'est déjà ce que j'obtiens avec mon bidule
Ce que j'essaie d'obtenir c'est que la valeur de la textbox1 soit adressée au nom contenu dans T(1) et pas qu'elle remplace la valeur contenue dans T1
Je pourrais me débrouiller sans mais ça me simplifierait énormément la tâche
J'ai plusieurs 'formules' différentes en fonction de ce que je cherche, du coup ça me fait une sacrée gymnastique 🙄

Merci qd même 👍

J'enterre pas le sujet, au mieux un pti genie connait l'astuce 🥳, au pire un grand sage saura m'expliquer pourquoi c'est pas possible 😖
 

bérylion

XLDnaute Occasionnel
Bonjour,
J'ai pas mal cherché mais je n'ai rien trouvé qui convertisse une chaine de caractères en nom de variables.
Sorry.
Re-
bon j'ai pas 'exactement' ce que je voulais mais je me suis dépatouillé autrement
je passe par un dico pour affecter les couples lettre/valeur
ça me permet de pouvoir écrire mes formules plus facilement ce qui était la raison principale de ma demande et du coup mon pb est résolu

pour ceux que ça pourrait intéresser, si jamais... :

VB:
Public WithEvents Txtbox As MSForms.TextBox

Private Sub Txtbox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Select Case KeyAscii
    Case 44, 46
      If Len(Txtbox.text) = 0 Then Txtbox.text = "0"
      KeyAscii = 44 + 36 * (InStr(Txtbox.text, ",") > 0)
    Case 48 To 57
      DoEvents
    Case Else
      KeyAscii = 8
  End Select
End Sub

Private Sub Txtbox_Change()
Set d = CreateObject("Scripting.Dictionary")
e = [{"a" , "b", "c", "d", "e", "f", "g"}]  ' nbre d'éléments variable
  With UserForm1
    For i = 1 To .Controls.Count -1 ' /!\ .Controls(0) doit etre .Label1 /!\
      d.Add Key:=e(i), Item:=ConvTxt(.Controls(i).text)
    Next
    f = d("a") + d("b") / d("c") + (d("d") + d("e")) / d("f") + (d("g") ' formule variable
    .Label1 = Application.WorksheetFunction.Round(f, 3)
  End With
End Sub

Private Function ConvTxt(Txt) As Double
  ConvTxt = CDbl(IIf(Txt = "", 0, Txt))
End Function
 

Discussions similaires

Statistiques des forums

Discussions
312 563
Messages
2 089 684
Membres
104 252
dernier inscrit
dbsromaric