lmlmike
Messages postés22Date d'inscriptionmardi 17 août 2010StatutMembreDernière intervention 4 juin 2016
-
23 août 2010 à 14:24
lmlmike
Messages postés22Date d'inscriptionmardi 17 août 2010StatutMembreDernière intervention 4 juin 2016
-
25 août 2010 à 11:05
J'aimerais en cliquant sur valider, qu'il mette dans un tableau chaque case qui a été coché en marquant l'heure (propriété Time), le prix et le type de consommation "Sandwich, Salade, Pizza, Pâtes ou Frites) pour CHAQUE consommation cochée.
N'étant pas développeur de base mais juste par loisir, je ne sais pas comment m'y prendre pour en arriver à ce stade à partir de ce formulaire.
Fiche technique du Userform :
- Dans ce formulaire lorsqu'on clique sur une case, on a le prix total qui s'affiche à chaque opération sur le formulaire. le prix total n'est là qu'à titre indicatif. voici le code d'une checkbox :
Private Sub Choix1_Click()
prixtot = prixtotal.Value
If Choix11.Value = True Then
prixtot = prixtot + 4
Else
prixtot = prixtot - 4
End If
prixtotal.Value = prixtot
end sub
- Les cases "Autres", si coché, affichent les formulaire les textbox et label associé où l'on saisi le montant, qui est lui aussi met à jour en temps réel le prix total.
- Toutes les checkbox concernant la bouffe porte le nom de "Choix[N°]" (par exemple Choix1, Choix23 etc...)
- Toutes les cases "Autres" portent le nom "Autre[N°]"
- Toutes les textbox "Autres" portent le nom "Text[N°]"
- Tous les Label "Autres" portent le nom "Message[N°]"
J'avais pensé à mettre tous les Choix[N°] à Choix[N°]_[Prix] dans le nom, pour faire un :
pour I de 1 a 38
Choix_conso <- choix & I
Si Choix_conso.valeur = vrai alors
prix_conso = Val(Mid$(Choix_conso, Len(Choix_conso & "_") + 1))
tant que Tableau(ligne,Colonne) <> ""
ligne <- ligne + 1
Fin Tant Que
Tableau(ligne,Colonne) <- Time (comprendre par Activecell.value)
colonne = colonne + 1 (comprendre par ActiveOffset(1,0).activate)
si I <= 26 alors
Tableau(ligne,Colonne) <- "Sandwich"
Sinon si I >= 27 et I <= 32 alors
Tableau(ligne,Colonne) <- "Salade"
Sinon si I >= 33 et I <= 34 alors
Tableau(ligne,Colonne) <- "Pizza"
Sinon si I >= 35 et I <= 36 alors
Tableau(ligne,Colonne) <- "Pâtes"
Sinon si I >= 37 et I <= 38 alors
Tableau(ligne,Colonne) <- "Frites"
fin si
colonne = colonne + 1
Tableau(ligne,Colonne) <- prix_conso
fin si
Fin pour
Mais ça m'a pas l'air d'être la meilleure solution, d'autant plus qu'il ne reconnait pas Choix_conso comme une Checkbox du Userform...
Vous pouvez m'aider ? Merci infiniment !!!
A voir également:
Comment faire pour faire fonctionner mon userform ?
lmlmike
Messages postés22Date d'inscriptionmardi 17 août 2010StatutMembreDernière intervention 4 juin 2016 25 août 2010 à 11:05
Excuse ma maladresse, je n'étais pas assez concentré et je réagis toujours de manière précipité ^_^
Malheureusement si j'applique le set sur "Prix" & I, il ne trouve pas comme il le fait pour "Choix" & I. Le premier est une variable globale, le second un objet, ça doit être pour ça...
J'ai cependant réussi à percer le mystère en mettant ma valeur dans la propriété tag de la checkbox...J'ai donc pu récupérer ces valeurs tour par tour et faire mon tableau à ma guise !
voilà le code :
Public Sub valider_Click()
Dim choix_sand As Control
Dim choix_sand2 As Control
numpc = Sheets("PC").numpc
Autre1.Tag = Text1.Tag
Autre2.Tag = Text2.Tag
Autre3.Tag = Text3.Tag
Autre4.Tag = Text4.Tag
Autre5.Tag = Text5.Tag
For I = 1 To 38
Set choix_sand = Me.Controls("Choix" & I)
If choix_sand.Value = True Then
prix_conso = choix_sand.Tag
Sheets("PC").Activate
Range("d1").Activate
ligne = Range("d1").Row
col = Range("d1").Column
While Cells(ligne, col).Value <> numpc
ligne = ligne + 1
Wend
Cells(ligne, col).Activate
ActiveCell.Offset(0, 4).Activate
While ActiveCell.Value <> ""
ActiveCell.Offset(0, 1).Activate
Wend
ActiveCell.Value = Time
ActiveCell.Offset(1, 0).Activate
If I <= 26 Then
ActiveCell.Value = "Sandwich"
ElseIf I <= 32 Then
ActiveCell.Value = "Salade"
ElseIf I <= 34 Then
ActiveCell.Value = "Pizza"
ElseIf I <= 36 Then
ActiveCell.Value = "Pâtes"
ElseIf I <= 38 Then
ActiveCell.Value = "Frites"
End If
ActiveCell.Offset(1, 0).Activate
ActiveCell.Value = prix_conso
ActiveCell.Offset(1, 0).Activate
End If
Next
For J = 1 To 5
Set choix_sand2 = Me.Controls("Autre" & J)
If choix_sand2.Value = True Then
prix_conso = choix_sand2.Tag
Sheets("PC").Activate
Range("d1").Activate
ligne = Range("d1").Row
col = Range("d1").Column
While Cells(ligne, col).Value <> numpc
ligne = ligne + 1
Wend
Cells(ligne, col).Activate
ActiveCell.Offset(0, 4).Activate
While ActiveCell.Value <> ""
ActiveCell.Offset(0, 1).Activate
Wend
ActiveCell.Value = Time
ActiveCell.Offset(1, 0).Activate
If J = 1 Then
ActiveCell.Value = "Sandwich"
ElseIf J = 2 Then
ActiveCell.Value = "Salade"
ElseIf J = 3 Then
ActiveCell.Value = "Pizza"
ElseIf J = 4 Then
ActiveCell.Value = "Pâtes"
ElseIf J = 5 Then
ActiveCell.Value = "Frites"
End If
ActiveCell.Offset(1, 0).Activate
ActiveCell.Value = prix_conso
ActiveCell.Offset(1, 0).Activate
End If
Next
Unload Me
End Sub
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 23 août 2010 à 20:06
Salut
Je ne sais pour quelle raison obscure, ton code a été traduit en français, rendant impossible la compréhension de ton programme.
Peux-tu refaire le copier-coller.
En VBA, pour désigner un objet d'une UserForm par son nom :
Dim monObjet As Object
Dim monNumero As Integer
monNumero = 4012
Set monObjet = Me.Controls("Choix" & CStr(monNumero))
MsgBox monObjet.Value
Quand tu fais une structure If-ElseIf-ElseIf-...-End If, il n'est pas nécessaire de tester les valeurs inférieures puisque ce sera le If précédent qui aura pris la priorité; cette structure suffit :
If maValeur <= 26 Then
...
ElseIf maValeur <= 32 Then
...
ElseIf maValeur <= 34 Then
...
ElseIf maValeur <= 36 Then
...
ElseIf maValeur <= 38 Then
...
End If
= Plus "léger"
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
lmlmike
Messages postés22Date d'inscriptionmardi 17 août 2010StatutMembreDernière intervention 4 juin 2016 24 août 2010 à 12:23
Désolé pour le code en français, je m'étais marqué ça en bloc notes à moi-même vu que je n'ai aucune connaissance en structure d'algorithme :D
Voici où j'en suis dans mon code grâce à tes conseils :
Public prix1, prix2, prix3, prix4, prix5, prix6, prix7, prix8, prix9, prix10, prix11, prix12, prix13, prix14, prix15, prix16, prix17, prix18, prix19, prix20, prix21, prix22, prix23, prix24, prix25, prix26, prix27, prix28, prix29, prix30, prix31, prix32, prix33, prix34, prix35, prix36, prix37, prix38
Public Sub valider_Click()
Dim choix_sand As Control
Dim prix_conso As Control
numpc = Sheets("PC").numpc
For I = 1 To 38
Set choix_sand = Me.Controls("Choix" & I)
MsgBox choix_sand
If choix_sand.Value = True Then
prix_conso = Me.Controls("prix" & I)
MsgBox prix_conso
Sheets("PC").Activate
Range("d1").Activate
ligne = Range("d1").Row
col = Range("d1").Column
While Cells(ligne, col).Value <> numpc
ligne = ligne + 1
Wend
Cells(ligne, col).Activate
ActiveCell.Value = Time
ActiveCell.Offset(1, 0).Activate
If maValeur <= 26 Then
ActiveCell.Value = "Sandwich"
ElseIf maValeur <= 32 Then
ActiveCell.Value = "Salade"
ElseIf maValeur <= 34 Then
ActiveCell.Value = "Pizza"
ElseIf maValeur <= 36 Then
ActiveCell.Value = "Pâtes"
ElseIf maValeur <= 38 Then
ActiveCell.Value = "Frites"
End If
ActiveCell.Offset(1, 0).Activate
ActiveCell.Value = prix_conso
ActiveCell.Offset(1, 0).Activate
End If
Next
End Sub
La ligne en rouge ne marche pas parce qu'il s'agit d'une variable publique et non d'un objet du formulaire...
Ma question est donc : comment faire pour "lier" une variable générée à une variable publique ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 24 août 2010 à 20:45
Si tu avais lu attentivement ce que j'ai écrit, tu aurais remarqué le mot Set devant ta ligne : ce mot est obligatoire dès qu'on touche à des objets.
D'autre part, toujours dans cette même précipitation, tu as laissé maValeur dans le If à étage : ça va pas bien marcher !
--> ActiveCell.Value, je pense