Appeler un formulaire [Résolu]

Signaler
-
 Tessel75 -
Bonjour,
Existe-t-il une commande pour que, lorsqu'un formulaire est affiché en mode "formulaire Continu", et qu'on sélectionne un enregistrement, la liste des enregistrements remonte de telle sorte que ce soit l'enregistrement sélectionné qui apparaisse en haut de l'écran?
Il y a la commande "Scroll", mais je ne sais pas du tout comme elle fonctionne.
Merci pour vos connaissances.
Configuration: Windows / Firefox 88.0

12 réponses

Messages postés
15804
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
9 juin 2021
1 500
Bonjour,

Ai rien trouve sur votre commande "Scroll". Vous voulez arriver a quoi en mettant l'enregistrement selectionne en premiere ligne?
Merci de ta réponse.
Il s'agit d'un formulaire dont le champ principal est de type Mémo, càd très grand. Aussi quand le pointeur est en dehors de ce champ, il est mis en taille réduite, et il s'agrandit jusqu'à occuper presque toute la fenêtre quand on pointe dessus, et reprend sa taille initiale quand on en sort. De la sorte, à l'ouverture du formulaire en modeContinu , le champ "Mémo" étant replié, je peux voir 5 à 6 enregistrements/formulaires en même temps et choisir celui sur lequel je veux travailler.
Le problème est que, lorsque le champ Mémo se déploie, tous les formulaires voient leur champ Mémo se déployer en même temps. Aussi, si le formulaire sélectionné n'est pas en haut de la fenêtre, je ne le vois plus, mais je vois uniquement celui qui est en haut de la fenêtre parce que tous ont été abaissés de la hauteur du/des champ(s) Mémo de/des l'enregistrement qui le précède(nt).
C'est la raison pour laquelle je voudrais une commande qui relève automatiquement l'enregistrement sélectionné en haut de la fenêtre, pour que lorsque je le choisis, c'est bien celui-là qui apparaitra au milieu de la fenêtre et non pas son voisin.
Pour dire, le "Détail" du formulaire passe de 3,8cm de hauteur à 13,75cm et le champ-Mémo de 1,4cm à 11,5cm
En espérant avoir été un peu clair dans mes explications.
Merci
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
bonjour,
Merci à f894009 pour son excellent question!
Je pensais que plusieurs enregistrements étaient visibles, et que Tessel75 voulait mettre en haut un de ces enregistrements.
Je pense maintenant avoir compris que Tessel75 veut simplement rendre visible un des enregistrements qui n'est pas visible.
Si j'ai compris, je pense que c'est assez simple à réaliser.
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866 >
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021

Si je comprends, tu essayais de positionner l'enregistrement choisi en haut, avant de tout agrandir. Je ne vois pas comment faire cela.
Par contre, il est possible, je pense, de mémoriser l'enregistrement choisi, de tout agrandir, et ensuite de se positionner sur l'enregistrement mémorisé, de façon à ce qu'il soit visible.
La même technique est utilisée pour rafraichir un formulaire et ensuite se positionner sur l'enregistrement courant, ou, pour se positionner sur un enregistrement recherché.
Messages postés
15804
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
9 juin 2021
1 500
Bonjour,

Pas tout compris. Pour moi, c'est impossible de placer un enregistrement particulier en debut par un code VBA gerant la barre de defilement verticale.
Par contre avec un filtre sur click du champ, vous n'aurez que cet enregistrement sur le formulaire.

Ex: Formulaire Liste de Taches, source requete Tâches en cours sur une Table Tâche avec une cle primaire(Obligatoire). Marche aussi sur formulaire lie directement a un table avec cle primaire
Procedure evenementielle sur le champ Status du formulaire
Private Sub Status_Click()
    If Enreg <> 0 Then
        DoCmd.ShowAllRecords    'tous enregistrements
    Else
        Enreg = Me.ID      'numero de la cle de l'enregistrement du champ selectionne
        DoCmd.ApplyFilter , "[Tâches en cours].ID=" & Enreg   'filtre 
    End If
End Sub
Merci pour ta réponse.
Pour te figurer la chose, imagine un dictionnaire avec les mots et les définitions avec des exemples. Il y a un champ/contrôle Mot et un champ/contrôle Définition
Tu sélectionnes un mot et tu pointes le champ/contrôle Définition, alors il prend sa dimension de travail pour découvrir le texte de la définition, les exemples, les synonymes, etc. Quand on sort de ce contrôle, il se replie, et on peut en sélectionner un autre. C'est pour ça que pour moi, il est important de garder l'ensemble des enregistrements visibles en même temps, et j'ai peur qu'avec ta méthode de sélection d'un enregistrement, je ne puisse plus revenir à ma présentation en mode continu.
Messages postés
15804
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
9 juin 2021
1 500
Re,

Avec votre fichier, je pourrai peut-etre trouver une solution car je pige pas comment il fonctionne.
Désolé, ce n'est pas possible, il est trop gros et trop compliqué avec des codes VBA imbriqués. Même en essayant de l'alléger, il faudrait trop d'explications pour indiquer toutes les manœuvres.
Je peux juste essayer de construire un formulaire-type avec un contrôle à dimensions variables. Mais un peu de patience, s'il te plait, il me faut un certain temps.
Messages postés
15804
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
9 juin 2021
1 500
Re,
Ok, y a pas d'lezard
ça y est, c'est fait! Voir la pièce jointe :
https://cjoint.com/c/KFdno1mVIGC

Pour l'utilisation: Ouvrir le formulaire F_NotesRapides, il s'ouvre en mode continu.
Le contrôle qui pose problème est celui étiqueté "Citation et Commentaires"
Pour voir le problème que j'évoque, il faut se mettre qqpart au milieu de l'ensemble des enregistrements et pointer le contrôle "Citation et Commentaires", alors il s'agrandit et si l'enregistrement sélectionné n'est pas celui qui est en haut, il disparait au profit de celui qui était en haut.
Bonne visite !
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
il y a déjà un code qui intervient au moment de cette action, ou pas?
Messages postés
15804
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
9 juin 2021
1 500
Re,

Passez par le site https://mon-partage.fr/, car petit probleme de bloquage de votre fichier au telechargement(!!)
https://mon-partage.fr/f/hzB8nFEw/

https://cjoint.com/c/KFdq26YhvFC


J'ai fait une nouvelle version en format .mdb, en espérant que vous puissiez l'ouvrir. Merci.
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866 > Tessel75
ceci ne fonctionne pas, je continuerai à essayer, cela en inspirera peut-être d'autre:
Private Sub CitationRapide_GotFocus()
Dim rs As Recordset, np As Integer
np = Me.NoPage
Set rs = CurrentDb.OpenRecordset("select page from T_Notes where page=" + CStr(np), dbOpenDynaset)
rs.MoveFirst
Debug.Print rs!Page, rs.Bookmark
Call AgrandissementCitation
Me.Bookmark = rs.Bookmark
End Sub
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
moi j'ai pu le télécharger.
@Yg_Be , Merci pour ta réponse.
Le problème est aussi que, étant un pur autodidacte en VBA, je n'ai pas trop l'habitude de ce genre d'expression du code. Aussi il y a-t-il pas mal d'expression que je ne comprends pas, et ne sais pas ce qu'elles ordonnent. Je me permets donc de demander des explications.
CurrentDb.OpenRecordset("select page from T_Notes where page=" + CStr(np), dbOpenDynaset)
Pourquoi "select page", alors que le formulaire dont les données sont celles de T_Notes, est déjà ouvert, et le pointeur est sur le contrôle à agrandir ?
Par ailleurs qu'est ce que "CStr(np), et aussi "dbOpenDynaset" ?
Que commande la ligne "rs.MoveFirst" ?
Et de même "Debug.Print rs!Page, rs.Bookmark"
Merci
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
j'ai publié une autre suggestion en #17, qui me semble fonctionner.
debug.print
, cela permet simplement d'afficher des informations dans une fenêtre de débogage, tu peux supprimer cela ou le mettre en commentaire.
si tu fais une recherche
vba cstr
, tu trouveras une explication.
Malgré tout, j'ai copié le bout de code dans mon code, et rien ne se passe. Aucun mouvement; rien !
Désolé !
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866 > Tessel75
où as-tu copié quoi?
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
ceci semble fonctionner, après avoir ajouté au formulaire un contrôle, txtid, contenant la clé primaire de la table:
Private Sub CitationRapide_GotFocus()
Dim rs As Recordset
Set rs = Me.Recordset
rs.FindFirst ("NoNotesrap=" + CStr(txtid))
If Not rs.NoMatch Then
    Debug.Print rs!NoNotesRap, rs!Page, CStr(rs.Bookmark)
    Call AgrandissementCitation
    Me.Form.Bookmark = rs.Bookmark
    'Me.Refresh
    Me.CitationRapide.SetFocus
Else
    Debug.Print "oups"
End If
End Sub

@Yg_Be
Bravo, ça passe exactement comme je voulais, excepté pour la ligne
"rs.FindFirst ("NoNotesrap=" + CStr(txtid))",
que j'ai été obligé de supprimer parce qu'elle bloquait la procédure. Cela ne semble pas avoir affecter l'enchainement des ordres.
Il me renvoie "Erreur de syntaxe , Opérateur absent".
Maintenant pourrais-tu me détailler un peu la succession des commandes, parce que j'ai plusieurs autres formulaires et sous-formulaires de même type dans ma base, et je voudrais pouvoir reproduire la commande, or là, je suis bien content que ça s'exécute mais je n'y comprends rien.
Merci pour ta complaisance.
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021
866
l'erreur de syntaxe vient probablement du fait que tu n'as pas associé le contrôle au champ.

cela m'a permis de voir qu'on peut simplifier le code:
Private Sub CitationRapide_GotFocus()
Call AgrandissementCitation
Me.CitationRapide.SetFocus
End Sub
>
Messages postés
15960
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juin 2021

Excellent ! Parfait ! Exactement ce que je cherchais, et je préfère d'autant plus cette 2ème rédaction que je connais la commande "SetFocus" que je peux alors facilement reproduire pour tous mes autres formulaires et sous-formulaires.
Merci encore. Je mets en question résolue.