Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2010, 11h37   #1
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Par défaut Macro identique sur plusieur contrôle

Bonjour à tous,

Pour un projet, j'ai besoin de modéliser visuellement des emplacement des étagères afin de gérer leurs contenues.

Pour faire simple disant que mon étagère est un tableau 3x3. Donc, dans un formulaire, j'ai insérer 9 contrôle appeler Emp_1 > Emp_9.

J'ai accoté de ca, une table avec 9 enregistrements, dans lequel j'ai référencer un champ appeler "ITEM", dans lequel je met le nom de mes contrôles.

ACTUELLEMENT : Quand un utilisateur veux rangé un élément dans un emplacement, il clique sur un des contrôle pour y affecter qqc (un livre, un jouet, ...) comme j'ai créer un contrôle pour chaque CURSOR de ma table, pas de soucis.

Imaginons que je met un objet dans le premier emplacement de l'étagère :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Private Sub Emp_1_GotFocus()
Dim Rs As Recordset
Dim Nom_Objet As string
If Nz(Me.Emp_1, "") = "" Then
Num_Objet = InputBox("Saisir le nom de l'objet")
Set Rs = CurrentDb.OpenRecordset("SELECT Etagere.objet FROM Etagere WHERE Etagere.Item = 'EMP_1'")
Rs.Edit
Rs.Fields(1) = Nom_Objet
Rs.Update
Rs.Close
Else
MsgBox ("Emplacement non vide")
End If
End Sub
PROBLEMATIQUE : Actuellment j'ai 9 CURSOR et 9 contrôle, je peux donc faire copier/coller du code et remplacer en fonction de ... mais (car il y a toujours un mais), mon étagére vas comporter plus de 200 emplacements, soit 200 CURSOR et 200 CONTROLES.

DEMANDE : Est il possible de faire une macro qui puisse gérer la situation ? C'est à dire, reconnaître que le contrôle 128 (par exemple) viens de recevoir le focus et qu'il faudra opérer sur le CURSOR 128 de la table. Sans avoir besoin de copier/coller 200 la précédente macro.
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 12h08   #2
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Je pense que c'est possible sans macro mais en vba: cherche du côté des boucles "For".
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 12h38   #3
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Citation:
Envoyé par Cinesra Voir le message
Je pense que c'est possible sans macro mais en vba: cherche du côté des boucles "For".
Je me suis mal exprimé ! C'était sous entendu en VBA bien sûr. Par contre je ne comprend pas pourquoi passer par une boucle ! Car je fait du traitement cas par cas.
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 14h23   #4
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Tu veux mettre 200 contrôles sur ton formulaire ?

J'ai une idée pour gérer ta "grande étagère", tu me diras ce que tu en penses.
Une table dans laquelle tu auras 200 enregistrements correspondant à tes 200 "tiroirs".
Il suffit d'avoir deux champs qui constitueront une clé primaire composée :
- un champ X qui donnera l'abscisse ;
- un champ Y qui donnera l'ordonnée.
Avec les deux champs, tu as les coordonnées du "tiroir" un peu comme dans une matrice.
Ensuite quand l'utilisateur veut voir le contenu du tiroir (125;32), il suffit d'une requête avec comme clause WHERE :
Voilà ce que je peux proposer.
__________________
Si ma réponse vous a été utile pensez à voter Pour

Avant de poster sur le forum Access :
FAQ > SOURCES > COURS > FORUM > GOOGLE
Pas de question par MP ou je mords

azertix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 14h48   #5
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Arf ! Je vous présente toutes mes excuses car je pense m'être mal exprimé. En fait pour la lecture je n'ai aucun problème.

J'ai procédé comme suis :

Tous mes contrôle s'appelle
Code :
Me.controls("Emp_" & i)
, du coup pour lire, je retire le Emp_ et je faire un SELECT sur l'ID de mon enregistrement.

Non mon problème est autre : Donc oui, j'ai 200 controles (243 pour être précis). je veux pouvoir exécuter la même instruction en VBA quelque soit le contrôle. Par exemple :

1) Je clique sur le controle 128 ==> Sa viens écrire une information dans un des champs de mon 128 CURSOR de ma table.

En fait, je cherche une solution qui me fait pas faire 243 copier/coller de mon code avec justement changement du numéro de CURSOR. Un truc du genre :

Quand je click sur Me.controle("Emp_" & i) alors tu fait un SELECT * FROM ma_table WHERE ma_table.ID =" & i & ""

Est ce plus claire ?
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 15h03   #6
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Oui c'est un peu plus clair.
Si j'ai bien compris tu affiches un enregistrement différent suivant le bouton cliqué ?
Tes 243 contrôles sont de quel type (bouton, zone de texte, zone de liste) ?
__________________
Si ma réponse vous a été utile pensez à voter Pour

Avant de poster sur le forum Access :
FAQ > SOURCES > COURS > FORUM > GOOGLE
Pas de question par MP ou je mords

azertix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 16h00   #7
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Je n'ai pas encore décidé, si ce sera une zone de texte ou un labal car :

J'ai un code qui à l'ouverture du formulaire viens remplir mes 243 controles pour visualiser ce qui se trouve dans mon étagère et permettre de voir en directe les emplacement vide (d'où l'interet des 243 contrôle) pour faciliter l'utilisateur final (contrainte du projet).

Du coup, quand l'utilisateur vas selectionner un contrôle (click ou reception focus à voir ce qui est plus pratique). Le code check pour voir si l'emplacement est vide ?

Si oui : une inputbox apparait pour permettre à l'utilisateur la saisie de l'objet à insérer, puis inscrit l'objet dans le contrôle, puis viens valider l'enregistrement dans ma table.

Si non : On indique à l'utilisateur que l'emplacement est occupé, en lui proposant le choix de retiré l'objet se trouvant dans l'emplacement.


D'où le retour sur mes postes précedents. Et sur l'interrogation posé le type de contrôle.

Je penser utiliser une zone de texte mais il faut pouvoir empecher l'insertion de valeur autre qu'en passant par les inputbox.

ou

bien des labels : L'utilisation de labals me parait plus elegante pour ce projet. seul hic, si le caption est vide, ca retire le controle du formulaire (du coup peut être indiquer (Vide) dans les emplacement vide).
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 17h07   #8
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Je ne crois pas qu'on puisse saisir une valeur dans un Label en mode formulaire.
Il est nécessaire pour l'utilisateur de pouvoir le faire non ?
Si oui, il faut opter pour des TextBox.
Pour empêcher la saisie dans un TextBox il suffit de mettre sa propriété Locked à True
__________________
Si ma réponse vous a été utile pensez à voter Pour

Avant de poster sur le forum Access :
FAQ > SOURCES > COURS > FORUM > GOOGLE
Pas de question par MP ou je mords

azertix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 12h16   #9
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Citation:
Envoyé par azertix Voir le message
Je ne crois pas qu'on puisse saisir une valeur dans un Label en mode formulaire.
Par contre il est possible de faire modifier le le caption du label en vba avec une valeur récupérer par inputbox, du genre :

Code :
Me.controle(i).caption=inputbox("saisir un nom d'objet")
Par contre, je stagne toujours sur ma problématique du début.
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 13h35   #10
Membre Expert
 
Inscription : avril 2006
Messages : 1 049
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 049
Points : 1 229
Points : 1 229
Bonjour,
une idée serait d'encapsuler contrôle et événements dans une classe.
tu n'auras de cette manière à écrire qu'une seule fois, le code.
ou plus simplement de créer une fonction et de l'affecter à la propriété événement des contrôles.
ilank est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h05   #11
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Citation:
Envoyé par ilank Voir le message
Bonjour,
une idée serait d'encapsuler contrôle et événements dans une classe.
tu n'auras de cette manière à écrire qu'une seule fois, le code.
Merci pour la réponse ! L'idée à l'air pas mal, le seul hic, je ne sait pas comment m'y prendre. En fait, je ne suis jamais passer par les classes et les encapsulation.

j'avais une idée, c'était de faire un formulaire dynamique avec CreateEventProc. Qu'en pensez vous ? Mais j'ai vu justement, que plutôt que d'utiliser cela, valais mieux utiliser des classes. Mais encore une fois, je ne sait pas faire ou du moins pas encore ...
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h28   #12
Membre Expert
 
Inscription : avril 2006
Messages : 1 049
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 049
Points : 1 229
Points : 1 229
Bonjour,
dans un premier temps le plus simple serait de créer une fonction publique pour gérer l'événement GotFocus des contrôles. Ensuite, il suffit d'affecter cette fonction à chacun des contrôles, ce, soit via la fenêtre des propriétés-onglet événement.
Sur réception focus : =nomdelafonction()

ou via du code vba au chargement du formulaire :

Ex: Pour l'exemple j'appelle la fonction GotFocus()
Code :
1
2
3
4
5
6
Private Sub Form_Load()
 Dim i as integer
 For i=1 to 243
  Controls("Emp_" & cstr(i)).OnGotFocus="=GotFocus()"
 Next i
End Sub
Un exemple de code pour cette fonction
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function GotFocus()
 Dim Ctrl As Access.TextBox 'ici placer le type de contrôle choisi
 Dim Rs As DAO.Recordset
 Dim Nom_Objet as String
 'Recupere le controle actif
 Set Ctrl=Screen.ActiveControl
 If Nz(Ctrl.Value,"")= "" Then
   Nom_Objet = InputBox("Saisir le nom de l'objet")
   If Len(Nom_Objet)>0 Then
    DoCmd.RunSQL "UPDATE Etagere SET Objet='" & Nom_Objet & "' WHERE Item='" & Ctrl.Name & "'"
    Ctrl.Value=Nom_Objet
   End if
 Else
  Msgbox "Emplacement non-vide"
 End if
End Function
ilank est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h35   #13
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Ca à l'aire de correspondre, en tout cas la forme me plait bien.

Je teste sa dans la journée, si fonctionne ! Je t'envoie une bouteille de Champagne
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 15h16   #14
Invité régulier
 
Inscription : septembre 2009
Messages : 41
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 41
Points : 6
Points : 6
Bon, j'ai tester ton code, et je tombe sur erreur !

Citation:
L'expression Sur réception focus entrée comme paramètre de la propriété de type événement est à l'origine d'une erreur. L'expression entrée requiert que le contrôle se trouve dans la fenêtre active.
Rapheux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 15h32   #15
Membre Expert
 
Inscription : avril 2006
Messages : 1 049
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 049
Points : 1 229
Points : 1 229
Bonjour,
l'erreur vient du fait qu'un des contrôles reçoit le focus avant que le formulaire ne soit visible à l'écran.
Pour y remédier, tu peux modifier légèrement la fonction e manière à obtenir :
Code :
1
2
3
4
5
6
7
Public Function GotFocus ()
 On Error Goto Error_GotFocus
.....
.....
...
Error_GotFocus:
End Function
ilank est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h03.


 
 
 
 
Partenaires

Hébergement Web