saisie semie automatique liste déroulante Access

saisie semie automatique liste déroulante Access - VB/VBA/VBS - Programmation

Marsh Posté le 11-06-2010 à 11:35:35    

Bonjour,  
 
Je travaille sur un formulaire access.  
Une liste déroulante appelée N°Abonné affiche le Numéro de l'abonné (numéro qui n'a aucune signification), le nom et le prénom de l'abonné. C'est bien un numéro d'abonné qui est enregistré dans ce champ.  
 
Je voudrai que lorsque je commence à taper le NOM d'un abonné dans cette liste déroulante, la sélection se place automatiquement sur le premier nom de la liste correspondant. Ainsi, en ayant tapé un NOM, je trouve la ligne correspondant au NUMERO.  
 
Par exemple, dans la liste j'ai les lignes suivantes:  
N°ABonné---------------NOM----------PRENOM  
1--------------------------MARTIN------Gilles  
2--------------------------MARIGNAN---Martine  
 
Si je tape "MAR" c'est la ligne 2 qui est sélectionnée (principe de la saisie automatique mais pas sur la colonne principale).  
 
Je ne sais pas si je suis très claire....  
 
Pouvez-vous m'aider???  

Reply

Marsh Posté le 11-06-2010 à 11:35:35   

Reply

Marsh Posté le 11-06-2010 à 11:53:13    

Hello
 
Il faut "betement" jouer sur les colonnes.
Donc la, si je comprends bien ta liste affiche 3 colonnes.
A verifier dans les propriétés de ta liste dans la propriété : Nbre Colonnes
Ensuite en dessous, toujours dans la fenetre propriété de ta liste, tu dois voire la propriété : largeurs colonnes
Avec par exemple : 2cm;2,5cm;3cm
Il suffit de remplacer le premier chiffre par 0
Ce qui donnerait : 0;2,5cm;3cm
Et la, miracle, le numéro n'apparait plus (mais c'est lui qui est utilisé pour stocker ou renvoyer des valeurs) mais seulement le nom. Et donc tu peux commencer a saisir dans la pioche pour atteindre un nom specifique.
 
Et comme je suis de bonne humeur, petit screen a l'appui :D
 
http://dje69r.free.fr/col.jpg


Message édité par SuppotDeSaTante le 11-06-2010 à 11:53:58

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 11-06-2010 à 12:19:09    

Ok super  
Jme voyais déjà devoir programmer en VBA pour ça!
Merci beaucoup!!!!

Reply

Marsh Posté le 11-06-2010 à 12:58:07    

Comment je fais maintenant pour créer un filtre sur mon formulaire?
J'ai créé une liste déroulante avec le nom de toutes les communes,
et je voudrais n'afficher que les abonnés de cette commune.
 
Sur quelle action créer le code? et comment j'écris ma fonction avec DoCmd.RunSQL (je m'empatouille avec les '";&;'&....)

Reply

Marsh Posté le 11-06-2010 à 14:09:01    

Oula, il y a beaucoup plus simple que toujours passer par du code "complexe"...
 
Ton formulaire doit avoir une requete comme source, ou une table. le mieux c'est une requete.
Comme ca dans le champ "numero de commune" de ta requete source, tu mets en critere ta pioche.
Et en code, tu n'as qu'un petit DoCmd.Requery a mettre apres mise a jour de ta pioche...
 
Regarde ca :
http://dje69r.free.fr/col2.jpg
 
En rouge : la source de la pioche, a savoir la table commune, et donc le numéro de commune.
En vert : la source du formulaire, une requete nommée "requete2" dont tu as la forme juste en dessous
En bleu : Le critere sur le numéro de commune dans la requete "requete2" qui est la source du formulaire qui filtre donc sur ce que contient la pioche du formulaire1
 
Donc en gros la requete n'affiche les infos que pour les communes de la table commune qui sont egales a la pioche. Et comme cette requete est la source du formulaire1, ton formulaire sera filtré. Juste un petit Requery comme dit plus haut a mettre sur mise a jour de ta pioche.


Message édité par SuppotDeSaTante le 11-06-2010 à 14:10:28

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 11-06-2010 à 15:25:03    

Merci beaucoup!!!

Reply

Marsh Posté le 11-06-2010 à 15:52:35    

:jap:
 
trop de code tue le code


Message édité par SuppotDeSaTante le 11-06-2010 à 15:53:13

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 17-06-2010 à 15:50:06    

Bonjour,  
 
J'ai maitenant un soucis de masque de saisie
j'ai une requête qui concatène 2 champs:
Tiroir : T1, à T4
Fibre: 1 à 144
J'aimerais pouvoir ranger par ordre alphabétique cette concaténation pour retrouver rapidement les fibres disponibles.
Seulement le tri ne fonctionne pas car ma chaine numérique possède 1 2 ou 3 caractère, de ce fait j'ai un ordre du sytle
T1.1
T1.13
T1.114
T1.2
C'est pas du tout ce que je cherche!  
J'ai changé le format de mon champ: il affiche fibre "002" au lieu de "2"
mais ce format ne s'enregistre pas dans la base, et de ce fait n'existe pas à la sortie de ma requête.
 
Pouvez-vous m'aider?

Reply

Marsh Posté le 17-06-2010 à 17:04:24    

Tu fais le format lors de la concatenation de la chaine.
 
2 champs calculés dans ta requete :
Un pour l'affichage comme tu as fait, du genre je pense : [Tiroir] & "." & [Fibre]
Un second pour le tri, tri croissant, que tu n'affiches pas : [Tiroir] & "." & Format$([Fibre];"000" )
 
Comme ca tes fibres seront comme ca : 001 ; 002 ; ... 099 ; ... ; 144
Et ca te donnera T1.001 ;...; T1.099 ; ... ; T1.144 qui une fois trié te les mettras dans le bon ordre, mais ce champ est masqué et ne sert qu'au tri
Tu te retrouveras donc bien avec ton champ trié, qui lui est affiché comme cela :
T1.1
T1.2
T1.13
T1.14
Etc.


Message édité par SuppotDeSaTante le 17-06-2010 à 17:07:14

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 17-06-2010 à 17:29:30    

Merci beaucoup encore une fois!!!!! :-))

Reply

Marsh Posté le 17-06-2010 à 17:29:30   

Reply

Marsh Posté le 17-06-2010 à 22:14:40    

Reply

Marsh Posté le 21-06-2010 à 16:06:50    

j'ai créé un formulaire avec deux onglets.
Chaque onglet dépend d'un sous-formulaire.
Chaque sous-formulaire dépend d'une requête.
 
Mon sous-formulaire fonctionne nickel en me demandant quelle est la valeur du Modifiable17sur lequel il doit baser son exécution (déduction : la requête est correcte) (j'avais cette ligne dans ma requête : WHERE (NRO.NomNRO=[Formulaires]![RechercheNRO]![Modifiable17]))
 
Dans mon formulaire principal, en modifiant le modifiable17, j'ai le droit de re-rentrer manuellement ce que je viens d'indiquer dans la liste déroulante (RequêteRechercheNROPassif.NomNRO)..... GRRRR
 pourquoi?

Reply

Marsh Posté le 21-06-2010 à 16:14:10    

ah et ce même paramètre m'est également demandé à l'ouverture du formulaire avant même que j'ai touché au modifiable...

Reply

Marsh Posté le 21-06-2010 à 18:39:48    

Citation :

Mon sous-formulaire fonctionne nickel en me demandant quelle est la valeur du Modifiable17sur lequel il doit baser son exécution (déduction : la requête est correcte) (j'avais cette ligne dans ma requête : WHERE (NRO.NomNRO=[Formulaires]![RechercheNRO]![Modifiable17]))


Ca c'est pas normal il ne devrait rien de te demander. Soit le nom du formulaire principal est mal orthographié soit c'est celui du controle Modifiable17


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 22-06-2010 à 08:12:40    

Effectivement, j'ai retiré les sou-formulaires, puis les ai remis en place, j'avais du les modifier pendant qu'ils se trouvaient encore sur le formulaire principal.

Reply

Marsh Posté le 28-06-2010 à 11:34:27    

C'est encore moi!
 
Ma base de données avance bien, j'ai le clic précis maintenant.
Mais nouvelle problématique: le publipostage.
J'ai des couriers types à envoyer à des propriétaires selon leur type de passage (façade, souterrain,...). Je compte créer un bouton sur le formulaire qui affiche toutes les caractéristiques du propriétaire. Ce bouton analyserai le type de passage et ouvrirai automatiquement le courier publiposté adéquat.
Comment faire?

Reply

Marsh Posté le 28-06-2010 à 11:58:54    

Comme toujours, sois un peu plus explicite ;)
 
Pour le publipostage deux solutions :
Word se connecte a ta base de données et fusionne
Access pilote Word pour le publipostage


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2010 à 12:01:07    

C'est access qui piloterai Word: depuis la page du propriétaire concerné, le code détermine le publipostage approprié et renvoie le document word.
Je voudrais que tout soit piloté par Access

Reply

Marsh Posté le 28-06-2010 à 14:01:54    

Citation :

J'ai des couriers types à envoyer à des propriétaires selon leur type de passage (façade, souterrain,...). Je compte créer un bouton sur le formulaire qui affiche toutes les caractéristiques du propriétaire. Ce bouton analyserai le type de passage et ouvrirai automatiquement le courier publiposté adéquat.


Faut etre plus precis, c'est vraiment trop vague la...
 
Sinon un bout de code pour piloter Word :

Code :
  1. Set Wrd = CreateObject("word.application" )
  2. 'Ouvre le document de fusion
  3.     Wrd.Documents.Open CheminVersTonModeleDeFusion
  4.    
  5.     With Wrd.ActiveDocument.MailMerge
  6.         .OpenDataSource Name:=CheminVersTaBase, LinkToSource:=True, AddToRecentFiles:=False, Connection:="TaTable", SQLStatement:="SELECT * FROM `TaTable`"
  7.         .Destination = wdSendToNewDocument
  8.         .Execute
  9.     End With


Message édité par SuppotDeSaTante le 28-06-2010 à 14:02:19

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 28-06-2010 à 15:06:44    

le but est d'imprimer le courrier type à envoyer (par la poste, pas de mail) au propriétaire d'une parcelle.
J'ai plusieurs documents word type selon le type de passage de la fibre. Les champs liés sont nom, prénom ville
En cliquant sur le bouton, ca ouvrirait le document word adéquat avec les champs qui correspondent à l'enregistrement sur lequel je suis sur access. Ce document part à l'impression ensuite.

Reply

Marsh Posté le 28-06-2010 à 15:27:21    

Et bah tu as le code dont tu as besoin dans mon dernier post.
 
Il faut te faire un document de fusion pour chaque type, tu appelles tel ou tel document de fusion que tu lies a une table qui contient le ou les enregistrements a fusionner, tu fusionnes le document et tu as tes documents pret a etre imprimer...


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 29-06-2010 à 14:06:39    

Merci pour la piste!!
Avec un peu de recherche je suis arrivée à quelque chose de très sympathique!!
 

Reply

Marsh Posté le 29-06-2010 à 19:49:37    

Ca serait sympa de partager ici au cas ou qqun ai le meme 'souci' ;)


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 30-06-2010 à 09:02:15    

oui j'ai essayé de mettre le code en copie, pour que ce soit dans un encadré au post mais je sais pas où il est le bouton! lol
jfais juste copié collé ou ya autre chose pour la mise en forme?

Reply

Marsh Posté le 30-06-2010 à 09:16:49    

moé lol Donc re pour ceux qui ont suivi.
 
ok Donc voilà mon code, une première fonction déclenchée au clic, qui fait appel à une requête déjà écrite pour déterminer le type de passage.  

Code :
  1. Sub MergeBM()
  2. 'Définitions
  3. Dim sql As String
  4. Dim database As DAO.database
  5. Dim qry As DAO.QueryDef
  6. Dim recordset As DAO.recordset
  7. 'Implémentations
  8. Set database = Application.CurrentDb
  9. Set qry = database.QueryDefs("RequêteTypePassage" )
  10. qry.Parameters("PARAM_NUM" ).Value = Forms!CréationConvention!Modifiable27
  11. Set rs = qry.OpenRecordset
  12. 'Conditions
  13. Debug.Print rs.Fields(0) 'pour afficher le résultat dans la fenêtre d'exécution
  14. Select Case rs.Fields(0)
  15. Case "façade"
  16.    Call MergeFacade
  17. Case "surplomb"
  18.    Call MergeSurplomb
  19. Case "souterrain"
  20.    Call MergeSouterrain
  21. Case "façade+boîtier"
  22.    Call MergeFacadeBoitier
  23. Case Else
  24.    MsgBox ("Pas de trame type définie pour ce type de passage" )
  25. End Select
  26. End Sub

 
 En fonction du type, je renvoie vers la fonction appropriée.  
Exemple d'une de ces fonctions de publipostage  

Code :
  1. Sub MergeFacade()
  2. 'Déclaration des variables
  3. Dim db As DAO.database
  4. Dim query As DAO.QueryDef
  5. Dim rs As DAO.recordset
  6. Dim oAppli
  7. Dim oDoc
  8. 'Affectation des objets d'accès aux données
  9. Set db = Application.CurrentDb
  10. Set query = db.QueryDefs("RequêtePublipostageFaçade" )
  11. query.Parameters("PARAM_NUM" ).Value = Forms!CréationConvention!Modifiable27
  12. Set rs = query.OpenRecordset
  13. Set oAppli = CreateObject("Word.Application" )
  14. Set oDoc = oAppli.Documents.Open("\\...\trame type\AccessFusionFaçade.dotm" )
  15. oAppli.Visible = True
  16. 'Boucle pour la récupération de données
  17. While Not rs.EOF
  18.    oDoc.Bookmarks("Commune" ).Range.Text = rs.Fields("Commune" )
  19.    oDoc.Bookmarks("Nom" ).Range.Text = rs.Fields("Nom" )
  20.    oDoc.Bookmarks("Commune2" ).Range.Text = rs.Fields("Commune" )
  21.    oDoc.Bookmarks("Adresse" ).Range.Text = rs.Fields("Adresse" )
  22.    oDoc.Bookmarks("Parcelle" ).Range.Text = rs.Fields("Parcelle" )
  23.    oDoc.Bookmarks("Parcelle2" ).Range.Text = rs.Fields("Parcelle" )
  24.    oDoc.SaveAs ("C:\Documents and Settings\All Users\Documents\" & rs.Fields(0) & ".doc" )
  25.    rs.MoveNext
  26. Wend
  27. 'Libération des objets
  28. rs.Close
  29. Set rs = Nothing
  30. db.Close
  31. Set db = Nothing
  32. End Sub


Reply

Marsh Posté le 30-06-2010 à 09:20:04    

:jap:
 
Je te laisse effacer la multitude de poste ;)
 
(Modification de ton message http://forum-images.hardware.fr/themes_static/images_forum/1/edit.gif, coche "Effacer message" en dessous de la zone de saisie)


Message édité par SuppotDeSaTante le 30-06-2010 à 09:20:27

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 01-07-2010 à 15:35:03    

Bon rebelote avec l'exportation sous excel qui fonctionne pas. Ca c'est ce que j'aimerais faire : on entre une date, on clique, et ça sort la liste des abonnés raccordés depuis cette date. La requête fonctionne bien.

Code :
  1. Sub Rapport()
  2. 'Déclaration des variables
  3. Dim db As database
  4. Dim query As QueryDef
  5. Dim rs As recordset
  6. Dim oAppli
  7. Dim oDoc
  8. Dim param As String
  9. 'Affectation des objets d'accès aux données
  10. Set db = Application.CurrentDb
  11. Set query = db.QueryDefs("RequêteRapportRaccordés" )
  12. param = Forms!RechercheAbonnés!Texte66
  13. query.Parameters("PARAM_DATE" ).Value = param
  14. param = Replace(param, "/", "-" )
  15. 'Set rs = query.OpenRecordset
  16. Set oAppli = CreateObject("Excel.Application" )
  17. oAppli.Visible = True
  18. Set oDoc = oAppli.Workbooks.Add
  19. oDoc.Sheets("Feuil1" ).Select
  20. oDoc.Sheets("Feuil1" ).Name = "mafeuille"
  21. oDoc.SaveAs ("RaccordésAvantLe" & param & ".xls" )
  22. DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, query, "RaccordésAvantLe" & param & ".xls", True, "A2"
  23. End Sub


et ca fonctionne pas car apparement query n'est pas une requête
 
et sinon j'ai tenté avec ce qui existe sur Internet, c'est-à-dire une requete temporaire.
Et là.... Rien ,rien d'affiché dans le fichier excel, même pas le nom des colonnes.
 
Help please?

Reply

Marsh Posté le 01-07-2010 à 18:21:10    

Et pourquoi tu créés pas "betement" une requete dans Access, vu que tu n'as pas de choses particuliere sur cette requete, et derriere un simple docmd.transferspreadsheet ??


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-07-2010 à 09:08:59    

ba le simple doCmd.Transferspreadsheet ne m'a jamais rien affiché dans excel...! sais pas pourquoi. Pas plus de succès avec le OutputTo
Finalement j'ai une solution qui fonctionne, je me suis servie du code automation : http://cafeine.developpez.com/acce [...] xcel/#LV-A,  
ça marche, mais comme c'est du code, c'est légèrement plus long à exécuter.

Reply

Marsh Posté le 06-07-2010 à 14:16:11    

Ya-t-il un moyen de demander à access d'attribuer le prochain numéro automatique disponible à un nouvel enregistrement?
explications : après une (ou plusieurs) manipulation inconnue, je passe de l'abonné N° 135 à l'abonné N° 56976394.
Comment puis-je rendre access à la raison?

Reply

Marsh Posté le 06-07-2010 à 14:24:03    

A part :
- supprimer tout ce qu'il y a apres le 135, puis compacater la base
- Stocker dans une table temporaire tout ce qu'il y a apres le 135, compacter la base, ajouter de la table temporaire a la table
- Stocker dans une table temporaire tout ce qu'il y a apres le 135, supprimer tout ce qu'il y a apres le 135, ajouter dans la table en forcant le numéro automatique


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 06-07-2010 à 14:28:43    

il n'y a plus rien après le N°135, la base se compacte à la fermeture.
Mais à la réouverture, le nouveau prochain abonné est le n° 56 millions...
Faut-il un autre type de compactage? Comment "ajouter dans la table en forcant le numéro automatique"?

Reply

Marsh Posté le 06-07-2010 à 15:15:56    

Hum apres compactage de la base DES DONNEES normalement il doit repartir a plus 1 sur chaque table depuis le derniere numéro auto...
 
C'est quelle version d'Access déjà ?


Message édité par SuppotDeSaTante le 06-07-2010 à 15:20:03

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 06-07-2010 à 15:42:59    

access 2007

Reply

Marsh Posté le 06-07-2010 à 15:44:17    

C'est bien le fichier où sont les données (Tables) et pas celle ou tu as les programmes (Formulaires, requetes etc.) que tu compactes on est d'accord ?
 
Bouton Office, Gerer base de données (ou un truc dns le genre  j'ai pas le 2007 sous les yeux), Compacter la base


Message édité par SuppotDeSaTante le 06-07-2010 à 15:44:59

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 06-07-2010 à 15:46:01    

je n'ai pas encore séparé la base en 2, car je crée encore des formulaires

Reply

Marsh Posté le 06-07-2010 à 16:03:28    

Bah la dsl, je ne vois pas...


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 07-07-2010 à 12:40:17    

Il semble que le fait de fractionner la base de données en 2 résolve le problème.
En fractionnant, il y a compactage et le numéro automatique de ma base redevient raisonnable.
 
Merci d'avoir trouvé la piste!

Reply

Marsh Posté le 07-07-2010 à 17:22:20    

Reply

Marsh Posté le 12-07-2010 à 17:00:20    

J'ai une requête insert into qui ne fonctionne pas en VBA:

Code :
  1. Dim sql As String
  2. If IsNull(Me.N°OS) = True Then
  3.    MsgBox ("Complétez d'abord les informations concernant l'OS! " )
  4. Else
  5.    sql = "INSERT INTO NRO (N°OS) VaLUES (" & Me.N°OS & " ) WHERE NRO.NomNRO = " & Me.NomNRO & ";"
  6.    'sql = "INSERT INTO NRO (N°OS) VaLUES ('56') WHERE NRO.NomNRO = 'BEL001';"
  7.    CurrentDb.Execute sql
  8.    DoCmd.Requery
  9. End If


à la ligne CurrenDB.Execute sql,  
Access m'affiche : "la requête doit être construite à partir d'au moins une table ou une requête source"
késaco???


Message édité par MerryvorRa le 12-07-2010 à 17:00:59
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed