Bonjour à tous,
Encore une petite question...
J'ai un formulaire avec un sous formulaire, j'aurais besoin de sélectionner plusieurs enregistrements avec Shift ou Ctrl et d'exécuter une action sur ce groupe d'enregistrement.
Une idée ?
Merci
Bonjour à tous,
Encore une petite question...
J'ai un formulaire avec un sous formulaire, j'aurais besoin de sélectionner plusieurs enregistrements avec Shift ou Ctrl et d'exécuter une action sur ce groupe d'enregistrement.
Une idée ?
Merci
Bonjour jean-paul lepetit,
Voici une fonction qui parcourt les enregistrements sélectionnés avec le bouton "shift". A mettre dans un module standard.
Il y a cependant un problème, dès que vous cliqué sur un bouton de commande (mon exemple) vous perdez le focus des enregistrements sélectionnés. Pour contourner cette restriction, dans votre sous formulaire inclure une variable comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Function DisplayRecord(oForm As Access.Form, lHeight As Long) Dim i As Long Dim rst As DAO.Recordset ' Récupérer les enregistrements Set rst = oForm.RecordsetClone ' Aller au premier enregistrement rst.MoveFirst ' Aller au premier enregistrement sélectionné rst.Move oForm.SelTop - 1 ' Parcourir les enregistrement ' MsgBox pour chaque enregistrement For i = 1 To lHeight MsgBox rst![Un_champ_de_votre_formulaire] rst.MoveNext Next i Set rst = Nothing End Function
Cela va fonctionner si vous lancez la fonction à partir de votre sous formulaire. Si vous voulez lancez la fonction du formulaire principal il va falloir récupérer le "SelHeight" du sous formulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Option Compare Database Option Explicit Dim lHeight As Long Private Sub btnSelection_Click() DisplayRecord Me, lHeight End Sub Private Sub Form_Click() lHeight = Me.SelHeight End Sub
Bonne journée
Bonsoir,
Merci pour ton code, je teste ça et reviens vers toi si j'ai des questions...
Bonjour Robert,
Je n'ai pas trouvé comment utiliser ta fonction
oForm c'est le nom de mon sous formulaire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Function DisplayRecord(oForm As Access.Form, lHeight As Long)
lHeight nombre d'enregistrements dans mon SF ?
Bonjour jean-paul lepetit,
En répondant à vos questions je viens de réaliser que la fonction n'est pas complète. En effet si on sélectionne en partant du bas du formulaire et en remontant le ".SelTop" n'est pas bon. Voici la fonction modifiée pour fonctionner de bas en haut et de haut en bas dans un formulaire.
Comme expliqué dans le poste #2, la fonction est à mettre dans un module standard.
La fonction accepte en argument "oForm" qui est un formulaire et "lHeight" qui représente le nombre de lignes sélectionnées et "lTop" qui représente dernière la ligne sélectionnée.
Dans votre formulaire ou sous-formulaire ligne 4 et 5 sont les variables en entête de formulaire. Lignes 7 à 9 sont l'appel de la fonction à l'aide d'un bouton de commande positionné en entête ou pied de formulaire. Les ligne 11 à 14 sont l'événement déclenché à chaque click sur le "RecordSelector" de votre formulaire ou sous-formulaire. Explication du .selheight et du .seltop
Comme vous pouvez le constater j'ai ajouté un argument "lTop" dans la fonction et ensuite dans le code on teste si le "SelTop" est la plus petite ligne sélectionnées, si ce n'est pas le cas on remet le curseur sur la plus petite ligne. (lignes 12 à 14)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Option Compare Database Option Explicit Dim lHeight As Long Dim lTop As Long Private Sub btnSelection_Click() DisplayRecord Me, lHeight, lTop End Sub Private Sub Form_Click() lHeight = Me.SelHeight lTop = Me.SelTop End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Function DisplayRecord(oForm As Access.Form, lHeight As Long, lTop As Long) Dim i As Long Dim rst As DAO.Recordset ' Récupérer les enregistrements Set rst = oForm.RecordsetClone ' Aller au premier enregistrement rst.MoveFirst ' Aller au premier enregistrement sélectionné If oForm.SelTop > lTop Then oForm.SelTop = lTop End If rst.Move oForm.SelTop - 1 ' Parcourir les enregistrement ' MsgBox pour chaque enregistrement For i = 1 To lHeight MsgBox rst![LeChampDésiré] rst.MoveNext Next i Set rst = Nothing End FunctionPas vraiment, c'est plutôt le formulaire ou sous-formulaire. C'est un "Object" "Access.Form". On le passe en argument avec le "Me" de la ligne 8 du code dans le formulaire.oForm c'est le nom de mon sous formulaire ?
Pas tout à fait, c'est le nombre d'enregistrements sélectionnés. Je vous ai mis en lien les explications Microsoft qui sont très claires.lHeight nombre d'enregistrements dans mon SF ?
Bonne journée
bonjour robert1957 et Jean-paul lepetit,
@Robert1957:certes, mais il faut déclarer les variables en Public car il y a un message "Type d'argument byRef incompatible" à la compilation.Envoyé par Robert1957
Ensuite pour que le code fonctionne à partir d'un bouton du formulaire avec une sélection dans le sous-formulaire (ce qui est, je pense, le cas pour le formulaire de Jean-Paul) il faut passer l'appel de la fonction comme ceci:et ce code reste dans le sous-formulaire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part DisplayRecord Me.Controls("NomDuSousFormulaire").Form, lHeight, lTop
on pourrait aussi mettre le bouton dans l'entête du sous-formulaire ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Form_Click() lHeight = Me.SelHeight lTop = Me.SelTop End Sub
En tout cas, merci Robert1957 pour ce code
Bonjour tee_grandbois,
Les variables auront besoin d'être déclarées publiques seulement si l'appel de la fonction est fait par le formulaire père. Si le bouton, comme dans mon exemple, est dans l'entête ou le pied de formulaire du sous-formulaire, les variables doivent être déclarées en entête du module du sous-formulaire. C'est une meilleure pratique (encapsulation). Je tente de ne pas déclaré de variable publique, si c'est possible, sinon je les inscrits toutes dans un module que je nomme "moPublic" ce qui permet de s'y retrouver plus facilement si l'application est un peu conséquente. Dans le cas présent, pour faire rapide on pourrait créer 2 champs texte (invisible) dans le formulaire père et y placer l'information pour l'appel de la fonction. Ce serait un "Workaround" qui éviterait de déclaré 2 variables publiques. À voir... Il y aurait aussi la possibilité de modifier la fonction pour passer un seul argument et aller plutôt chercher l'information dans 2 champs texte que l'on positionnerait dans l'entête du sous-formulaire, invisible, et qui serait alimentés au click du "RecordSelector". À voir... Ce ne sont pas les solutions qui manquent...
Pour ce qui est de l'appel de la fonction, s'il est fait dans le formulaire père vous avez tout à fait raison sur la manière de faire l'appel.
Bonne journée
Bonjour tee_grandbois, jean-paul lepetit,
Voici ce que pourrait avoir l'air la même fonction mais avec 2 champs texte invisible (nommé: txtSelHeight, txtSelTop) en entête ou pied de page du sous formulaire.
Le sous formulaire avec appel de la fonction:
L'appel de la fonction dans le formulaire père:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Option Compare Database Option Explicit Private Sub btnSelection_Click() 'Ici l'appel de la fonction DisplayRecord Me End Sub Private Sub Form_Click() Me.txtSelHeight = Me.SelHeight Me.txtSelTop = Me.SelTop End Sub
La fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub btnSelection_Click() DisplayRecord Me.Controls("Le_nom_du_sous-formulaire").Form End Sub
Bonne journée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Function DisplayRecord(oForm As Access.Form) Dim i As Long Dim rst As DAO.Recordset ' Récupérer les enregistrements Set rst = oForm.RecordsetClone ' Aller au premier enregistrement rst.MoveFirst ' Aller au premier enregistrement sélectionné If oForm.SelTop > oForm.txtSelTop Then oForm.SelTop = oForm.txtSelTop End If rst.Move oForm.SelTop - 1 ' Parcourir les enregistrement ' MsgBox pour chaque enregistrement For i = 1 To oForm.txtSelHeight MsgBox rst![Un_champ_de_votre_formulaire] rst.MoveNext Next i Set rst = Nothing End Function
ça paraît bien ...
dans la fonction je rajouterai bien (en ligne 10) :
pour le cas où on sélectionne le curseur du nouvel enregistrement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 rst.MoveLast rst.MoveFirst If rst.RecordCount > 0 Then ... End If
ERRATUM:
c'est plutôt comme cela qu'il faut traiter le cas où le curseur du nouvel enregistrement fait partie de la sélection:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 For i = 1 To oForm.txtSelHeight If Not rst.EOF Then MsgBox rst.Fields(0) rst.MoveNext End If Next i
Bonjour tee_grandbois,
Bien vu, c'est un détail auquel je n'avais pas pensé.
Bonne journée
Bonjour tee_grandbois, jean-paul lepetit,
Tant qu'a être dans les améliorations, l'utilisation de la collection "TempVars" est tout désigné pour remplacer des variables publiques dans notre exemple.
Le code du sous-formulaire:
Pour le formulaire principal, pas de modification:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Option Compare Database Option Explicit Private Sub btnSelection_Click() DisplayRecord Me End Sub Private Sub Form_Click() 'On crée et renseigne les variables TempVars!tvSelHeight = Me.SelHeight TempVars!tvSelTop = Me.SelTop End Sub Private Sub Form_Close() 'A la fermeture du formulaire on détruit les variables TempVars.Remove ("tvSelHeight") TempVars.Remove ("tvSelTop") End Sub
La fonction avec la suggestion de tee_grandbois et les "TempVars":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Option Compare Database Option Explicit Private Sub btnForm_Click() DisplayRecord Me.Controls("Le_nom_du_sous-formulaire").Form End Sub
Je crois que c'est plus propre comme code que les variables publiques ou les txtBox invisibles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Function DisplayRecord(oForm As Access.Form) Dim i As Long Dim rst As DAO.Recordset ' Récupérer les enregistrements Set rst = oForm.RecordsetClone ' Aller au premier enregistrement rst.MoveFirst ' Aller au premier enregistrement sélectionné If oForm.SelTop > TempVars!tvSelTop Then oForm.SelTop = TempVars!tvSelTop End If rst.Move oForm.SelTop - 1 ' Parcourir les enregistrement ' MsgBox pour chaque enregistrement For i = 1 To TempVars!tvSelHeight If Not rst.EOF Then MsgBox rst.Fields(0) rst.MoveNext End If Next i Set rst = Nothing End Function
Bonne journée
en effet, je n'y pense jamais, les "TempVars" sont arrivées après que j'ai cessé mon activité professionnelle.Envoyé par Robert1957
bonne journée à toi, moi c'est bonne soirée en France .. .![]()
Merci à tous les deux,
la dernière version avec les "TempVars" fonctionne à merveille.
Il a juste fallu que je l'adapte à l'action dont j'ai besoin (suppression d'enregistrements).
il faudra que je me penche un peu plus sur ces bestioles.... (les TempVars)
Encore Merci
tout ça pour ça ? mais la touche Suppr suffisait !Il a juste fallu que je l'adapte à l'action dont j'ai besoin (suppression d'enregistrements).
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager