Comment faire pour faire fonctionner mon userform ? [Résolu]

Signaler
Messages postés
22
Date d'inscription
mardi 17 août 2010
Statut
Membre
Dernière intervention
4 juin 2016
-
Messages postés
22
Date d'inscription
mardi 17 août 2010
Statut
Membre
Dernière intervention
4 juin 2016
-
Bonjour,

Je dispose sous excel du Userform suivant :

http://s2.noelshack.com/upload/14054659743465_untitled.jpg

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 !!!

4 réponses

Messages postés
22
Date d'inscription
mardi 17 août 2010
Statut
Membre
Dernière intervention
4 juin 2016

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



Merci infiniment pour ton aide !!
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
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)
Messages postés
22
Date d'inscription
mardi 17 août 2010
Statut
Membre
Dernière intervention
4 juin 2016

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 ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
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