Suite de la construction d'un formulaire

Jean-Yves23

XLDnaute Nouveau
Bonjour,

Dans le cadre de mon travail, je construis un formulaire d'évaluation pour évaluer la réussite ou non des objectifs d'un service.

J'ai construis le visuel du formulaire mais je n'ai aucune idée du code VBA qui doit être écrit derrière, pour connecter le formulaire à la feuille Excel qui fait office de base de donnée.

Voici le lien vers le fichier : http://cjoint.com/?gjtW3chkl2

Plus en détails, voici les points sur lesquels je cale :

1) Créer une liste déroulante dont les données viennent d'une feuille Excel; Dans le fichier test, il s'agirait d'utiliser la combobox1 pour sélectionner un des éléments de la liste dans la feuille "T_Listedéroulante"

2) Comment "coder les cases Vrai/faux que j'ai inséré pour qu'elles retournent une valeur 1 si vrai, 2 si faux.

3) J'aimerais limiter la saisie à un format date. Par exemple, pour la Textbox 24 (5° paragraphe, 1°sous-paragraphe, label 7).

4) Plutôt que d'écrire le contenu des "labels", j'aimerais pouvoir aller le rechercher dans une liste. par exemple, pour le label 1, j'aimerais rechercher dans la feuille "T_objectifs" l'objectif n°24 et écrire dans le label "Objectif 1". En consultant les posts du forum, je me suis demandé si une des solutions ne serait pas de renommer le "label 1" en qqch comme "labelO24C2". Mais je n'ai pas la moindre idée de comment faire ça en VBA.

5) Enfin, j'aimerais Exporter les données du formulaire dans une feuille tampon "T_résultats". De nouveau, je pensais utiliser le nom de l'objet pour lui préciser la cellule de destination. Par exemple, TextBox1 deviendrais TextBoxO1R2C4 (O1 = objectif 1, R2C4 pour préciser la destination).

Il est bien entendu que je ne demande pas de réaliser l'ensemble du formulaire. Toute réponse ou suggestion même partielle est la bienvenue.

Merci d'avance à ceux qui ont pris le temps de me lire jusqu'ici.
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Re-bonjour,

En fouillant bien sur le forum, je pense avoir trouvé une solution provisoire pour surmonter le point 2. Provisoire en attendant de trouver une solution pour les points suivant. ;)

Code:
If OptionButton97.Value = True Then
    Sheets("T_Temporaire").Range("A5").Value = OptionButton97.Caption
ElseIf OptionButton98.Value = True Then
    Sheets("T_Temporaire").Range("A5").Value = OptionButton98.Caption
Else
    Sheets("T_Temporaire").Range("A5").Value = "NA"
End If
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Voila je pense avoir trouvé qqch d'assez simple qui règle le problème du point 3. J'attaque le point suivant :D.


Code:
If Not IsDate(TextBox74.Value) Then
    MsgBox ("Format invalide. Saisir une date JJ/MM/AA")
    TextBox74.Value = ""
    Sheets("T_Temporaire").Range("A5").Value = ""
Else
    Sheets("T_Temporaire").Range("A5").Value = CDate(TextBox74.Value)
End If
 

Modeste

XLDnaute Barbatruc
Re : Suite de la construction d'un formulaire

Salut Jean-Yves23, le forum,

J'étais occupé à tester ce qui suit:
Code:
Private Sub TextBox24_AfterUpdate()
Dim maDate As Date
If Not IsDate(TextBox24.Value) Then
TextBox24.Value = ""
MsgBox "Uniquement une date, SVP"
Else: maDate = Format(CDate(TextBox24.Text), "dd/mm/yyyy")
End If
'en fonction des besoins: sheets("xxx").range("xy).value=maDate
End Sub
... que tu passais déjà au point suivant ! :(
En attendant encore un peu, le sujet sera résolu et tu auras fait les questions/réponses.

Un petit stress, malgré tout avec les dates "valides": il vaut mieux qu'elles soient encodées sous le format jj/mm/aaaa, sinon le 30/02/09 est considéré comme une date valide (convertie, sans doute, en 09/02/(19)30 !?)

Bon amusement,

Modeste
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Bonjour Modeste,

D'abord, je tiens à te remercier pour ta réponse. Ensuite, ta remarque concernant le format de date est tout à fait pertinente. J'ai vérifié et il se produit bien une erreur pour la date 30/02/09. Malheureusement, je n'y vois pas trop de solution, du moins en utilisant "IsDate". J'ai toutefois modifié le commentaire et demandé un encodage DD/MM/YYYY mais un format DD/MM/YY est toujours accepté.

Bat,
Jean-Yves
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Bonsoir le forum,

Je continue mon petit bout de chemin dans le point 4. Après avoir retourné le forum, je pense qu'il serait plus simple d'utiliser la zone "Tag" de chaque label pour lui indiquer la cellule source pour le texte.

Je pense donc stocker des caractères comme "O2C4" (O2= objectif 2 et C4=colonne4). Le "2" est un identifiant unique (et non NULL) de ma base de donnée d'objectifs mais il ne correspond pas au numéro de ligne (cfr le fichier annexé dans mon premier poste). Quelqu'un aurait-il une idée pour coder cela de façon compacte?

Cependant, si jamais l'ordre des colonnes de la base de donnée est changé, il va y avoir un bug. Ne serait-il pas plus judicieux d'utiliser une plage nommée...
Le contenu des tags deviendrais alors qqch comme "O2CDescription" ???
Euuuu oui c'est bien beau tout ça mais je n'ai toujours aucune idée de comment coder ce que je dis. Je retourne donc gratter le forum.

A+
Jean-Yves
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Point 4 cloturé!:cool:

J'ai finalement appliquer un bon vieux dicton qui dit qu'il vaut mieux faire simple que compliqué. j'ai donc simplement utilisé le champ tag pour y stocker la réf de l'objectif. En mettant bout à bout des solutions du forum je pense que j'arrive à qqch qui ne marche pas trop mal. N'hésitez quand même pas à proposer mieux ou plus simple si vous avez.

A+

Code:
Dim Ctrl As Control, i As Byte, j As Byte
i = 1
j = Workbooks("Bonus.xls").Sheets("T_Objectifs").Range("T_Objectifs_Règle").Column
For Each Ctrl In Me.Controls
If TypeOf Ctrl Is MSForms.Label Then
    Set c = Workbooks("Bonus.xls").Sheets("T_Objectifs").Range("Objectifs").Find(Ctrl.Tag, LookIn:=xlValues)
    If ((Not c Is Nothing) And (c.Value <> "")) Then
        i = c.Row
        Ctrl.Caption = Workbooks("Bonus.xls").Sheets("T_Objectifs").Cells(i, j).Value
    ElseIf (c Is Nothing) Then
        MsgBox ("Erreur lors du chargement des objectifs")
        UserForm1.Hide
        GoTo fin
    End If
End If
Next Ctrl
fin:
End Sub
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Bonjour à tous,

Je continue mon petit bout de chemin dans la construction de mon formulaire. Cependant, j'ai un petit soucis avec ma macro Workbook_Activate. En effet, dans cette macro, je définis une série de plage de données qui seront utilisées ultérieurement....Du moins j'essaie parce que quand j'ouvre mon classeur, un message disant "La méthode Select de la classe Range a échoué" apparait. Je mets le code ci-dessous

Code:
Private Sub Workbook_Activate()

Dim Blabla As Workbook
Dim T_Bof As Worksheet
Dim ligne As Integer

ligne = 0
Set Blabla = Workbooks("Blabla.xls")
Set T_Bof = Workbooks("Blabla.xls").Worksheets("T_Bof")

T_Bof.Range("A2:A65536").Select
Blabla.Names.Add Name:="Voitures", RefersToR1C1:=Selection
T_Bof.Range("B2:B65536").Select
Blabla.Names.Add Name:="T_Bof_Description", RefersToR1C1:=Selection
T_Bof.Range("C2:C65536").Select
Blabla.Names.Add Name:="T_Bof_NomDuService", RefersToR1C1:=Selection
T_Bof.Range("D2:D65536").Select
Blabla.Names.Add Name:="T_Bof_DateActivation", RefersToR1C1:=Selection
T_Bof.Range("E2:E65536").Select
Blabla.Names.Add Name:="T_Bof_DateDésactivation", RefersToR1C1:=Selection

End Sub
 

job75

XLDnaute Barbatruc
Re : Suite de la construction d'un formulaire

Bonjour Jean-Yves33, Modeste,

Le code bug parce que vous voulez sélectionner des plages qui ne sont pas dans la feuille active :

Mais nul besoin de sélectionner. Remplacer les 2 premières lignes par :

Code:
Blabla.Names.Add Name:="Voitures", RefersTo:=T_Bof.Range("A2:A65536")

Même chose pour les lignes suivantes.

A+
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Rebonjour,

Je poursuis le nettoyage de mes erreurs en VBA. J'ai içi un message d'erreur au niveau du "Set c=" qui me dit : "Variable ou objet de bloc With non définie". Serait-ce le "Find" qui pose problème de la façon dont il est écrit?

Code:
Function ChargerLabels(ByRef usf As UserForm)

Dim ctrl As Control
Dim i As Integer, j As Integer
Dim c As Range
Dim Msg

i = 0
j = 0

For Each ctrl In usf.Controls
    If TypeOf ctrl Is MSForms.Label Then
        If (ctrl.Tag <> "") Then
            Set c = T_Objectifs.Range("Objectifs").Find(ctrl.Tag, LookIn:=xlValues)
            On Error GoTo ErrorHandler
            If Not c Is Nothing Then
                i = c.Row
                If (T_Objectifs.Cells(i, k).Value = "VRAI") Then
                    ctrl.Caption = T_Objectifs.Cells(i, j).Value
                Else
                    ctrl.Caption = "Question inactive. Il est inutile d'y répondre."
                End If
            ElseIf (c Is Nothing) Then
                MsgBox ("Erreur lors du chargement des objectifs")
                usf.Hide
                GoTo fin
            End If
        End If
    End If
Next ctrl

End Function

Merci d'avance pour votre aide.
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Bonjour,

Je suis toujours à la recherche d'une solution pour le problème du post précédent. Cependant, je pense que le problème ne vient pas du "Find" mais plutôt du fait que T_Objectifs n'est pas défini.

cette variable "T_objectifs" est supposée être "public" car je l'utilise dans plusieurs modules et dans le code du userform. J'imagine donc que j'ai fait une erreur dans la déclaration de ces variables, qui est faite comme suit :

Dans un module mais en dehors du code, j'inscris :

Code:
Public T_Objectifs as worksheet

Puis dans workbook_open, j'écris :

Code:
Private Sub Workbook_Open()

Set T_Objectifs = Workbooks("Blabla.xls).Worksheets("T_Objectifs")

End Sub

Est-ce bien comme cela qu'il faut procéder pour pouvoir utiliser "T_Objectifs" dans n'importe quel module ou formulaire.
 

Jean-Yves23

XLDnaute Nouveau
Re : Suite de la construction d'un formulaire

Bonjour,

J'ai résolu le problème précédent en redéfinissant chacune des variables dans chaque module. ca vaut ce que ca vaut mais ca fonctionne.

Par contre, j'ai un autre souci qui est en fait la suite du point 2 de mon premier post :D. J'ai crée des cellules vrai/faux constituée d'une frame contenant deux optionbutton et une textbox. Je voudrais bien qu'à chaque fois qu'on clique dans la zone de la frame, certaines opérations s'exécutent. J'ai donc créer un module de classe MaFrameVF_Click() mais celui ne fonctionne que quand je clique dans le "gris" de ma Frame. Donc, ca ne s'éxecute pas quand je clique sur un Optionbutton.:eek:

Esite-il un moyen de faire s'éxécuter MaFrameVF_Click() quand je clique n'importe ou dans ma frame, y compris sur les Optionbutton inclus. Je joins le code que j'ai recyclé d'un post du forum pour mon usage.

Code:
Public WithEvents MaFrameVF As MSForms.Frame

Private Sub MaFrameVF_Click()

Dim i As Integer, j As Integer
Dim ctrl As Control
Dim srce() As Variant
Dim Valeur As String
Dim Msg

i = 0
j = 0
Set T_Temporaire = Workbooks("Bonus.xls").Sheets("T_Temporaire")

Valeur = "NE"

For Each ctrl In MaFrameVF.Controls
    If ((TypeOf ctrl Is MSForms.OptionButton) And (ctrl.Value = True)) Then
        Valeur = ctrl.Caption
    End If
Next ctrl

'suite du code pas très interessante

End Sub


Merci d'avance,
Jean-Yves
 

Discussions similaires

Réponses
17
Affichages
1 K