Bonsoir
Si je sélectionne plusieurs ligne et que je veux les supprimer à l'aide d'un bouton.
Comment ont dit en vba : supprime les lignes sélectionnée ?
Merci
Justine
Bonsoir
Si je sélectionne plusieurs ligne et que je veux les supprimer à l'aide d'un bouton.
Comment ont dit en vba : supprime les lignes sélectionnée ?
Merci
Justine
Bonjour.
Cordialement
Code : Sélectionner tout - Visualiser dans une fenêtre à part DoCmd.RunCommand acCmdDelete
Bonsoir RobiPMS
Merci
grâce au petit code que tu m'as passé j'ai testé, mais ça ne supprime qu'un enregistrement à la fois
je voudrais supprimer la plage sélectionnée (plusieurs à la fois)
J'ai mis ce code grâce au code que tu m'as passé, j'ai trouvé ça sur le site :
Private Sub cmdSupprimer_Click()
On Error GoTo GestionErreurs
'Désactive l'affichage des messages système
DoCmd.SetWarnings False
If MsgBox("Voulez-vous vraiment supprimer cet enregistrement ?", _
vbQuestion + vbYesNo + vbDefaultButton2, "Suppression") = vbYes Then
'Sélection de l'enregistrement
DoCmd.RunCommand acCmdSelectRecord
'Exécution de la commande
DoCmd.RunCommand acCmdDeleteRecord
End If
Exit_cmdSupprimer:
'Réactive l'affichage des messages système
DoCmd.SetWarnings True
Exit Sub
GestionErreurs:
Select Case Err.Number
Case 2046
'Affichage d'un message
MsgBox _
"La commande ""Supprimer l'enregistrement"" n'est pas disponible pour l'instant !", _
vbInformation, "Erreur !"
Resume Exit_cmdSupprimer
Case Else
MsgBox "Une erreur inattendue s'est produite !" & vbNewLine & "Erreur no : " _
& Err.Number & vbNewLine & Err.Description, vbCritical, "Erreur !"
Resume Exit_cmdSupprimer
End Select
End Sub
Que faut il faire pour dire supprime tout ce qu'on a sélectionné ?
Merci
Justine
Bonjour.
Je pense que le plus simple et fiable pour arriver à ce que tu souhaites (si j'ai bien compris tu veux sélectionner des enregistrements dans un formulaire, puis les supprimer en une fois) serait ceci :
1. Tu ajoutes un champ Oui/Non à la table source de ton formulaire (tu le nommes par exemple "selection"), avec comme valeur par défaut Non
2. Dans le formulaire, tu sélectionnes les enregistrements à supprimer en cochant la case à cocher liée à ce champ Oui/Non
Ensuite tu as plusieurs possibilités pour supprimer les enregistrements. La plus simple à réaliser me semble être celle-ci :
- Tu crées une requête suppression où le critère est le champ "selection" sur Oui. Appelons cette requête "Suppr_select"
Et dans ton code, plutôt que d'utiliser la commande DoCmd.RunCommand acCmdDeleteRecord, tu lances la requête suppression. Ce qui donnerait, dans ton code :
Parmi les autres possibilités :
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
27
28 Private Sub cmdSupprimer_Click() On Error GoTo GestionErreurs 'Désactive l'affichage des messages système DoCmd.SetWarnings False If MsgBox("Voulez-vous vraiment supprimer les enregistrements sélectionnés?", _ vbQuestion + vbYesNo + vbDefaultButton2, "Suppression") = vbYes Then 'Cas où l'utilisateur clique sur Oui DoCmd.OpenQuery "suppr_select" Else 'cas où l'utilisateur clique sur Non Exit sub End If Exit_cmdSupprimer: 'Réactive l'affichage des messages système DoCmd.SetWarnings True Exit Sub GestionErreurs: Select Case Err.Number Case 2046 'Affichage d'un message MsgBox _ "La commande ""Supprimer l'enregistrement"" n'est pas disponible pour l'instant !", _ vbInformation, "Erreur !" Resume Exit_cmdSupprimer Case Else MsgBox "Une erreur inattendue s'est produite !" & vbNewLine & "Erreur no : " _ & Err.Number & vbNewLine & Err.Description, vbCritical, "Erreur !" Resume Exit_cmdSupprimer End Select End Sub
- tu crées une requête normale, avec comme critère le champ de sélection sur Oui. Dans le code tu ouvres la requête, tu sélectionnes tous les enregistrements et tu les supprimes.
- tu fais tout dans le code avec une requête de suppression en SQL
Si tu veux mettre en œuvre cette dernière solution, et que tu as besoin d'aide, dis-le.
Cordialement
Bonjour Robi et merci
ALors j'ai fais ta première solution qui me plait beaucoup
Je l'ai testé et c'est bizarre car lorsque je sélectionne ce que je veux supprimer. Tout est supprimé sauf le premier sélectionné. (pourquoi ça fait ça ?)
Ensuite j'ai un autre problème qui s'impose car avant je rajoutais cette ligne de code juste après (if msgbox ....)
Car enfaîte quand je supprime un élève je supprime l'historique de l'élève.
Code : Sélectionner tout - Visualiser dans une fenêtre à part CurrentDb.Execute "delete from historique where IDELEVE=" & IDELEVE, dbFailOnError
Pour le moment quand je supprime un élève l'historique est bien supprimé avec la ligne de code que j'ai mis en haut
Mais maintenant que je veux supprimer plusieurs grâce à ta solution j'ai 2 problèmes
> Le premier sélectionné n'est pas supprimé
> comment dire dans le code supprime toutes les historiques des élèves sélectionnés
Merci du temps que tu m'accordes
Justine
Bonjour Justine.
Puisque tu utilise déjà le SQL dans ton code, on va faire de même pour la suppression des sélectionnés. Donc tu convertis ta requête suppression en SQL. Et ça a l'avantage d'éviter que on ne la lance par erreur...
Quant à la non suppression du premier c'est probablement une question d'actualisation du formulaire. Moi, pour éviter tout problème quand je fais ce genre de chose, je ferme mon formulaire au début de la procédure, avant l'exécution des requêtes et je le rouvre à la fin de la procédure. Cela évite un éventuel conflit si tu supprimes un enregistrement en cours d'affichage et considéré à ce moment comme impossible à modifier, et la réouverture du formulaire fait que tout est actualisé après l'exécution des requêtes.
En supposant que tes tables s'appellent Elèves et historique, et que le champ commun soit IDELEVE (tu adaptes, sinon...)
Dans le code, d'abord la suppression de l'historique, puis la suppression des sélectionnés :
Tiens-moi au courant...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 DoCmd.Close acForm, "le_nom_de_ton_formulaire" CurrentDb.Execute "DELETE DISTINCTROW historique.*, Elèves.selection FROM historique INNER JOIN Elèves ON historique.IDELEVE = Elèves.IDELEVE WHERE (((Elèves.selection)=Yes));" CurrentDb.Execute "DELETE Elèves.* FROM Elèves WHERE Elèves.selection=Yes" DoCmd.OpenForm "le_nom_de_ton_formulaire"
RL
Partager