Application en VBA

macroVB Messages postés 26 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 11 mai 2007 - 2 nov. 2006 à 17:18
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 - 3 nov. 2006 à 21:38
Bonjour a tous,
J'essaye de faire une application de gestion de projet en VBA, je vous explique, en fait un projet concerne des missions ,ca peut etre une mission ou deux ou trois... jusqu'a 12, tout depend du projet
dans mon UserForm j'ai mis un cadre dans lequel j'ai groupée mes12 checkbox a couchés concernant les missions que j'ai avec un champ (textbox) qui m'affiche le numero du projet(NumProjet),
j'ai cree une base de donnée sous access avec deux table T_Projets(NumProjet, NomProjet, DateDemarrage, Objet) , T_Missions(CodeMission, Libellé) et une association Projets_Missions(NumProjet,CodeMission), je voulais en fait si je couche les Checkboxs des missions concernant un projet qu'il me le stock dans mes tables de base de donnée mais je ne sais pas comment s'y prendre
voila tout le code que j'ai appliqué

Option Explicit


Dim ws As Workspace
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset


Private Sub UserForm_Initialize()


 Set ws = DBEngine.Workspaces(0)
 Set db = ws.OpenDatabase("C:\BaseDeDonnee\BaseDeDonnee.mdb")
 Set rs1 = db.OpenRecordset("Projets", dbOpenTable)
 Set rs2 = db.OpenRecordset("Projets_Missions", dbOpenTable)
 Set rs3 = db.OpenRecordset("Missions", dbOpenTable)


TextBox1.Text = rs1.Fields("Numprojet").Value
End Sub

Private Sub Frame1_Click()
Dim i As Integer
Dim CheckBox(i) As CheckBox
For i = 1 To 12
  If CheckBox(i) = Checked Then
        rs2!NumProjet = TextBox1.Text
        rs2!CodeMission = CheckBox1.Caption
  End If
Next
End Sub

mais ca donne rien ! je ne sais pas si c'est au niveau de mes table de donnée  ou au niveau du codage!
merci de vos suggestions

14 réponses

chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
2 nov. 2006 à 18:26
Bonjour,
En VBA, il n' y a pas de groupe de controles
A ta place j' utiliserais un ListView (ListView Control version 6.0)
Propriétés:
View : lvwReport
Configure le pour qu' il ait 2 colonnes et coche sa propriété CheckBox  
-------------------------------------------------------------------
Private Sub UserForm_Initialize()
Set ws = DBEngine.Workspaces(0)
  Set db = ws.OpenDatabase("C:\BaseDeDonnee\BaseDeDonnee.mdb")
  Set rs1 = db.OpenRecordset("Projets", dbOpenTable)
  Set rs2 = db.OpenRecordset("Projets_Missions", dbOpenTable)
  Set rs3 = db.OpenRecordset("Missions", dbOpenTable)
  TextBox1.Text = rs1.Fields("Numprojet").Value
 
  'tu remplis la listview avec les codes et les libellés des Missions
 
  rs3.MoveFirst
  Do While Not rs3.Eof
    ListView.ListItems.Add  rs3![CodeMission]            '1° colonne
    ListView.ListItems(1).SubItems(1)= rs3![Libelle]    '2° colonne
    rs3.MoveNext
  Loop


End Sub
------------------------------------------------------------
En mode Ajout
Lorsque tu veux Valider
Private Sub Frame1_Click()  'pourquoi un Frame ?
Dim NMissions as Integer    'nombre de lignes de la ListeView
Dim i As Integer


NMissions=ListView.ListItems.Count 
For i = 1 To NMissions
  If ListView.ListItems(i).Checked= True Then
        rs2.AddNew
        rs2!NumProjet = TextBox1.Text
        rs2!CodeMission    =CInt(ListView.ListItems(i).Text 'si ton code est un Entier
        rs2.Update
  End If
Next
End Sub


Essayes ça si ça te convient


Il faut voir aussi avec le Mode Modifier


'PS: suite au MP




 
0
drikce06 Messages postés 2236 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 10
3 nov. 2006 à 08:12
Chaibat05>si le frame permet de regrouper les controles!

Le probleme est dans ta boucle tu met la boucle dans l'évenement click du frame! Si aucune mission n'est coché au chargement du userform si tu click dans le frame pour en cocher une dans l'évenement clik du frame tu n'as pas encore de mission cochée. C'est normal que cela face rien! soit tu fais une boucle sur les chekbox du userform ou alors tu geres l'évenement cheched de chaque mission!

Private Sub Frame1_Click()
Dim i As Integer
Dim CheckBox(i) As CheckBox
For i = 1 To 12
  If CheckBox(i) = Checked Then
        rs2!NumProjet = TextBox1.Text
        rs2!CodeMission = CheckBox1.Caption
  End If
Next
End Sub

 Drikce 06
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
3 nov. 2006 à 14:57
Bonjour Drikce 06,
^^si le frame permet de regrouper les controles...
regrouper oui , mais pas indexer.
Tu n' aura pas CheckBox(0),CheckBox(1),CheckBox(2),...
et donc pas de boucle et un interminable si ...Then
en passant par tous les checkbox.
Mais il peut toujours essayer avec For Each ...

Pour Frame_Click je ne fais que reproduire son code
d' ailleur je le lui ai fais remarquer
Regarde dans
Private Sub Frame1_Click()  'pourquoi un Frame ?
je voulais dire pourquoi valider en cliquant sur un frame

Pour moi ça serait plutot
Sub cmdValid_Click()
...<   >
End Sub

Attendons de voir...

chaibat
0
macroVB Messages postés 26 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 11 mai 2007
3 nov. 2006 à 15:56
Bonjour tous,
en fait j'ai essayé de faire une petite application de test pour voir l'effet d'afficher les checkbox couché dans mon UserForm a partir d'une fonction que j'appel pour chaque checkbox couché (car j'ai essayé avec le code de chaibat05(je t'en remercie beaucoup) mais ca ne marche pas jusque la, surement une erreur de code, comme je t'avais dis je suis novice,  mais j'ai tout essayé depuis ce matain .
alors j'ai cree un UserForm j'ai placée mes CheckBoxs et une listbox pour afficher tout les chekcbox couché

Private Sub RemplirList()
Dim Ctrl As Control
    ListBoxMissionsChoisis.Clear
    For Each Ctrl In Me.Controls
        If TypeOf Ctrl Is MSForms.CheckBox Then _
           If Ctrl.Value Then ListBoxMissionsChoisis.AddItem Ctrl.Caption
    Next
End Sub
et dans les checkboxs :
Private Sub CheckBox(1)_Click()
  Call RemplirList
End Sub
.
.
.
Private Sub CheckBox(12)_Click()
  Call RemplirList
End Sub
ça marche et j'arrive a afficher tout les checkboxs couchés, par contre le probleme qui se pose maintenant c'est que je ne sais pas comment par exemple pour creer un nouveau projet , faire un nouveau enregistrement et stoker les missions choisis(les checkbox couchés) dans mes tables de base de données!!!

en fait pour ListView je n'ai meme pas de l'aide en ligne je fais F1mais je n'ai rien a propos de cette liste
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
3 nov. 2006 à 16:22
Le problème qui se pose pour toi au niveau de l' enregistrement
du projet avec les missions sélectionnées(cochées)
c' est que tu dois passer en revue tous les checkbox
Même avec ForEach


If CheBox1.Value Then ...
If CheBox2.Value Then ...
If CheBox3.Value Then ...
If CheBox4.Value Then ..
etc..


En VB6 tu pourrais avoir


For i=1 to 12
  If CheBox(i).Value Then ...
  ...
Next


Mais pas en VBA


Pour la ListView , si j' ai bien compris tu n' arrives pas à trouver le control.
Si c' est ça , va dans la boite à outils et clique sur autres controles
recherche le dans la liste qui s' affichera.
si tu le selectionne et tu valid, il va s' ajouter aux autrescontrols 
tu l' insère ensuite dans ton Form.
tu va dans sa propriéte Personnaliser et tu le configure
n' oublies pas d' ajouter deux colonnes


si tu adoptes maon code,vires la listebox
et garde ton code initial du Form_Initialize
mais met le plutot dans Form_Load

fais d' abord ceci, puis on verra


 




 
0
macroVB Messages postés 26 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 11 mai 2007
3 nov. 2006 à 16:49
oui j'ai cherché le control listView dans la barre d'outils (controles supplementaire)  je l'ai placé dans la boite a controls et apres dans mon UserForm, apres je lui ai changé la propriété View j'ai mis 3-IvwReport , j'ai veré la listbox, et tt mes checkboxs, et meme le frame, j'ai essayé le code que tu m'as suggéré 
  
Private Sub UserForm_Initialize()
  Set ws = DBEngine.Workspaces(0)
  Set db = ws.OpenDatabase("C:\Hafsa\BaseDeDonnee\BaseDeDonnee.mdb")
  Set rs11 = db.OpenRecordset("Projets", dbOpenTable)
  'Set rs1 = db.OpenRecordset("Projets", dbOpenDynaset)
  Set rs12 = db.OpenRecordset("Projets_Missions", dbOpenTable)
  Set rs13 = db.OpenRecordset("Missions", dbOpenTable)

 rs3.MoveFirst
  Do While Not rs3.EOF


    ListView1.ListItems.Add rs3!("CodeMission")    'j'ai une erreur a ce niveau qui se pointe sur le rs3 "Le caractere de declaration de Type ne correspond pas au type de donnees declaré"  !!!       
    ListView1.ListItems(1).SubItems(1) = rs3!("LibelleMission")   
    rs3.MoveNext
  Loop


End Sub

pourtant j'ai declaré mon rs3 As recordset !!
une question bete , comment configurer la listView? 

ps: pour le Form_Load j'ai pas cet evenement dans ma liste
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
3 nov. 2006 à 16:54
ListView1.ListItems(1).SubItems(1) = rs3![LibelleMission]  
si tu n' as pas  Form_Load
c' est pas grave, gardres ton code dans Form_Initialize()
 
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
3 nov. 2006 à 16:55
et bien sûr
rs3![CodeMission]
0
macroVB Messages postés 26 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 11 mai 2007
3 nov. 2006 à 17:13
ça beug tjr !!!
************************
"erreur d'execution '380'
valeur de propriété non valide"

************************
le code :

Private Sub UserForm_Initialize()


  Set ws = DBEngine.Workspaces(0)
  Set db = ws.OpenDatabase("C:\BaseDeDonnee\BaseDeDonnee.mdb")
  Set rs1 = db.OpenRecordset("Projets", dbOpenTable)
  Set rs2 = db.OpenRecordset("Projets_Missions", dbOpenTable)
  Set rs3 = db.OpenRecordset("Missions", dbOpenTable)
  
  rs3.MoveFirst
  Do While Not rs3.EOF

    ListView1.ListItems.Add rs3![CodeMission]            '1° colonne
    ListView1.ListItems(1).SubItems(1) = rs3![LibelleMission]   '2° colonne
    rs3.MoveNext
   
  Loop




End Sub

pour détraquer d'eventuelle erreur
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
3 nov. 2006 à 17:17
et les colonnes du listview,
tu as pensé à les ajouter ?
0
macroVB Messages postés 26 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 11 mai 2007
3 nov. 2006 à 17:24
euh ! non , comment les ajouter ? quelle propriété ?
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
3 nov. 2006 à 17:35
dans la page de propriétés de la listview, tu vas à l' onglet Column et tu cliques sur insérer une colonne.
Insères en deux.
ensuite

pour l' erreur j' ai compris ou elle se situe

....
Dim i as integer
rs3.MoveFirst
i=0
  Do While Not rs3.EOF
    i=i+1
    ListView1.ListItems.Add  i , , rs3![CodeMission]            '1° colonne
    ListView1.ListItems(1).SubItems(1) = rs3![LibelleMission]   '2° colonne
    rs3.MoveNext
  Loop
0
macroVB Messages postés 26 Date d'inscription lundi 18 septembre 2006 Statut Membre Dernière intervention 11 mai 2007
3 nov. 2006 à 21:26
j'ai essayé donc cela
Dim i As Integer
rs3.MoveFirst
i = 0
  Do While Not rs3.EOF
    i = i + 1
    ListView1.ListItems.Add i, , rs3![CodeMission]              
    ListView1.ListItems(1).SubItems(1) = rs3![LibeleMission]   
        rs3.MoveNext
  Loop
ca marche a peu pres sauf que pour la deusieme colonne il ne m'affiche qu'une seule ligne, la derniere c'est a dire ma 12eme mission et pas les autres !
en tout cas cela me permettrai d'afficher ma liste des missions mais reste le vrai probleme comme faire le choix ?? si je veux choisir les missions correspondant a un projet ??? au cas de creation de projet ?
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
3 nov. 2006 à 21:38
Re bonsoir,
 oui effectivement, c' est stupide de ma part
 ListView1.ListItems(i).SubItems(1) = rs3![LibeleMission] 
 puisque ' i ' représente la ligne.

Pour les choix, si tu as configuré ta listview avec la propriété
CheckBox=True, tu devrais avoir à gauche de chaque ligne
la case à cocher.
ça fonctionne comme un CheckBox classique, un coup tu coches,
un coup tu decoches.
Au moment de la validation, le programme va inserer dans ta table
les missions cochées.

A demain peut être
T' as eu de la chance avec ce dernier post !
j' étais sur le point de sortir

Bonne soirée
0
Rejoignez-nous