VBA recherche d'une valeur d'après ListBox et suppression de la ligne
Dernière réponse : dans Programmation
Re bonjour,
Pas beaucoup plus experte que mon dernier message, j'aurais besoin d'un coup de pouce.
J'ai réussi à trouver comment récupérer un nom d'une listbox et à chercher ce nom dans la 1ère colonne de ma feuille "BD poste" pour le supprimer, mais je n'arrive pas à supprimer sur cette même ligne trouvée les données qui sont dans les colonnes B à N et la colonne Q. Je ne veux pas supprimer les éléments des colonnes O et P car j'ai des formules dedans.
A votre bon coeur!
Pas beaucoup plus experte que mon dernier message, j'aurais besoin d'un coup de pouce.
J'ai réussi à trouver comment récupérer un nom d'une listbox et à chercher ce nom dans la 1ère colonne de ma feuille "BD poste" pour le supprimer, mais je n'arrive pas à supprimer sur cette même ligne trouvée les données qui sont dans les colonnes B à N et la colonne Q. Je ne veux pas supprimer les éléments des colonnes O et P car j'ai des formules dedans.
Private Sub CommandValider_Click()
Dim BDP As Worksheet
Dim T As Range
Dim TituASup As String
Set BDP = Worksheets("BD poste")
TituASup = ConfirmSUP.TitulaireASUP.Value
Set T = BDP.Columns(1).Cells.Find(what:=TituASup)
If T Is Nothing Then
MsgBox "Le titulaire n'a pas pu être supprimé. Vérifiez que vous avez sélectionné un Titulaire, sinon consultez votre Administrateur."
Unload Me
Else
BDP.Columns(1).Cells.Find(what:=TituASup).ClearContents
End If
Set T = Nothing
Unload Me
End Sub
A votre bon coeur!
Autres pages sur : vba recherche valeur listbox suppression ligne
Lassé par la pub ? Créez un compte
Oh! Zeb,
Je croyais que tu avais disparu de la surface du forum ou que tu me boudais.
Je suis contente de vois que tu es toujours là !
Ne cri pas au scandale quand tu veras le code ci-dessous, je suis sûre que tu vas faire à peu près cette tête
.
Mais c'est le seul moyen que j'ai trouvé pour y arriver !
Ca à au moins le mérite de fonctionner comme on dit, après je pense qu'il y a du nettoyage à faire!!!!
By pour ce sujet, et à bientôt sur d'autres problèmes, car soyez en sûr il y en aura d'autres!
Je croyais que tu avais disparu de la surface du forum ou que tu me boudais.
Je suis contente de vois que tu es toujours là !
Ne cri pas au scandale quand tu veras le code ci-dessous, je suis sûre que tu vas faire à peu près cette tête
.Mais c'est le seul moyen que j'ai trouvé pour y arriver !
Ca à au moins le mérite de fonctionner comme on dit, après je pense qu'il y a du nettoyage à faire!!!!
Private Sub CommandValider_Click()
Dim BDP As Worksheet
Dim BDF As Worksheet
Dim BDQ As Worksheet
Dim BDA As Worksheet
Dim GFDP As Worksheet
Dim T As Range
Dim TituASup As String
Set BDP = Worksheets("BD poste")
Set BDF = Worksheets("BD form")
Set BDQ = Worksheets("BD qualif")
Set BDA = Worksheets("BD activ")
Set GFDP = Worksheets("Gestion FDP")
TituASup = ConfirmSUP.TitulaireASUP.Value
Set T = BDP.Columns(1).Cells.Find(What:=TituASup)
Application.ScreenUpdating = False
If T Is Nothing Then
MsgBox "Le titulaire n'a pas pu être supprimé. Vérifiez que vous avez sélectionné un Titulaire, sinon consultez votre Administrateur."
Unload Me
Else
' On efface les 15 cellules à droite de la cellule active recherchée
BDP.Select
BDP.Columns(1).Cells.Find(What:=TituASup).Select
Range(ActiveCell(1, 1), ActiveCell(1, 15)).ClearContents
' On supprime la colonne correspondant au titulaire dans la feuille BD Form'
BDF.Select
BDF.Rows(1).Cells.Find(What:=TituASup).EntireColumn.Delete
' On supprime la colonne correspondant au titulaire dans la feuille BD QUALIF'
BDQ.Select
BDQ.Rows(1).Cells.Find(What:=TituASup).EntireColumn.Delete
' On supprime la colonne correspondant au titulaire dans la feuille BD Form'
BDA.Select
BDA.Rows(1).Cells.Find(What:=TituASup).EntireColumn.Delete
' On tri le tableau selon colonne ordre pour éviter qu'il y ait des lignes vides dans le tableau
BDP.Select
Range("A2:Q21").Select
Selection.Sort Key1:=Range("P2"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End If
Set T = Nothing
' Retour à la feuille gestiondes fiches de poste
GFDP.Select
' On décharge le formulaire
Unload Me
Application.ScreenUpdating = True
End Sub
By pour ce sujet, et à bientôt sur d'autres problèmes, car soyez en sûr il y en aura d'autres!
Zeb S.A. - Service de nettoyage du code :
Non, pas de select.
Ca bouffe tellement de ressource et ça clignote tellement qu'on est obligé de faire des Application.ScreenUpdating = False. Donc on vire les Select et les ScreenUpdating.
Tu fais deux fois un Unload Me si T est vide. --> Spa bien.
Tu mets T à vide s'il est vide. C'est inutile. --> Spa bien.
(Spa grave plus plus
)
Regarde lignes 18/19, comment mémoriser une cellule pour s'en reservir sans la sélectionner.
Ligne 28, j'ai viré les paramètres par défaut. Ca se discute. Mais je suis partisan de ne pas mettre les valeurs par défaut, comme ça on voit bien ce que l'on fait explicitement. Le reste, c'est par défaut ![[:spamafote] [:spamafote]]()
Ligne 37, un Select ? Oui !!!!!
Voilà le cas où c'est utile
J'ai supprimé Cells qui ne servait pas à grand'chose après Rows() ou Columns()
Curieusement, j'ai viré les variables qui pointaient vers des worksheets quand l'utilisation de ces variables était unique. C'est du point de détail. Et on peut éventuellemet se justifier du contraire.
Tu vois, ce n'était pas un si gros nettoyage
Private Sub CommandValider_Click()
Dim BDP As Worksheet
Dim T As Range
Dim TituASup As String
Set BDP = Worksheets("BD poste" )
TituASup = ConfirmSUP.TitulaireASUP.Value
Set T = BDP.Columns(1).Find(What:=TituASup)
If T Is Nothing Then
MsgBox "Le titulaire n'a pas pu être supprimé. " & _
"Vérifiez que vous avez sélectionné un Titulaire, " & _
"sinon consultez votre Administrateur."
Exit Sub
Else
' // On efface les 15 cellules à droite de la cellule trouvée
Dim c As Range
Set c = BDP.Columns(1).Find(What:=TituASup)
Range(c, c(, 15)).ClearContents
' // On supprime les colonnes correspondant au titulaire dans chaque feuille
Worksheets("BD form" ).Rows(1).Find(What:=TituASup).EntireColumn.Delete
Worksheets("BD qualif" ).Rows(1).Find(What:=TituASup).EntireColumn.Delete
Worksheets("BD activ" ).Rows(1).Find(What:=TituASup).EntireColumn.Delete
' // On tri le tableau selon colonne ordre pour éviter qu'il y ait des lignes vides dans le tableau
BDP.Range("A2:Q21").Sort Key1:=Range("P2" ), Header:=xlNo, DataOption1:=xlSortNormal
Set T = Nothing
End If
' // Retour à la feuille gestion des fiches de poste
Worksheets("Gestion FDP").Select
' // On décharge le formulaire
Unload Me
End Sub
Ca bouffe tellement de ressource et ça clignote tellement qu'on est obligé de faire des Application.ScreenUpdating = False. Donc on vire les Select et les ScreenUpdating.
(Spa grave plus plus
)![[:spamafote] [:spamafote]](http://m.bestofmedia.com/sfp/design/usr/fr/smilies/3e/46/spamafote.gif)
Voilà le cas où c'est utile
Tu vois, ce n'était pas un si gros nettoyage
A tout hasard, tu ne songes pas à faire des formations ?!
Je pense que tu aurais bon nombre d'adepte.
Pour les Select, au début j'avais tout viré, mais j'avais des bugs pour le tri dans une plage de cellule où il y a des cellules vides en bas et à droite, au final j'ai remis les select pour me sortir de ce mauvais pas! J'avoue c'était la solution de facilité !
Je viens d'essayer ton code et j'ai toujours la même erreur d'exécution 1004 sur la ligne de tri :
Le reste fonctionne à merveille.
A+
Je pense que tu aurais bon nombre d'adepte.
Pour les Select, au début j'avais tout viré, mais j'avais des bugs pour le tri dans une plage de cellule où il y a des cellules vides en bas et à droite, au final j'ai remis les select pour me sortir de ce mauvais pas! J'avoue c'était la solution de facilité !
Je viens d'essayer ton code et j'ai toujours la même erreur d'exécution 1004 sur la ligne de tri :
BDP.Range("A2:Q21").Sort Key1:=Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal
Le reste fonctionne à merveille.
A+
J'ai été prof, autrefois... D'où mon gros défaut de ne pas donner de solution quand elle est trop facile
________________________
BDP.Range("A2:Q21").Sort Key1:=Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal
¯¯¯¯\_____________/ ??\_________/
Range #1 Range #2
Rhoooo !
Mets un point d'arrêt sur cette ligne ([9]) et lance ta macro.
Quand tout s'immobilise avant l'erreur fatidique, ouvre la fenêtre Exécution et tape l'une après l'autre ces commandes :
Si oui, tu as ta solution. (Donne-la quand même pour les autres
)
________________________
BDP.Range("A2:Q21").Sort Key1:=Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal
¯¯¯¯\_____________/ ??\_________/
Range #1 Range #2
Rhoooo !
Mets un point d'arrêt sur cette ligne ([9]) et lance ta macro.
Quand tout s'immobilise avant l'erreur fatidique, ouvre la fenêtre Exécution et tape l'une après l'autre ces commandes :
? BDP.Range("A2:Q21").Address(External:=True)
? Range("A2").Address(External:=True)
N'y-a-t'il rien qui te dérange ?? Range("A2").Address(External:=True)
Si oui, tu as ta solution. (Donne-la quand même pour les autres
)
Bonjour Zeb,
Bon d'accord ! tu as encore tout compris.
Voici le nouveau code de la ligne de tri :
Il y a quand même quelque chose que je ne trouve pas très logique : on enlève les "Select" et "Selection" et on ne modifie rien de plus et il change de référence de feuille !!! C'est ce que j'ai découvert en tapant les lignes que tu m'as donné dans la fenêtre Exécution.
Merci Zeb pour m'avoir mis sur la voix! Et pour tout le reste bien sûr!
A+ sur d'autres sujet car j'ai loin d'avoir fini mon projet.
Bon d'accord ! tu as encore tout compris.
Voici le nouveau code de la ligne de tri :
BDP.Range("A2:Q21").Sort Key1:=BDP.Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal
Il y a quand même quelque chose que je ne trouve pas très logique : on enlève les "Select" et "Selection" et on ne modifie rien de plus et il change de référence de feuille !!! C'est ce que j'ai découvert en tapant les lignes que tu m'as donné dans la fenêtre Exécution.
Merci Zeb pour m'avoir mis sur la voix! Et pour tout le reste bien sûr!
A+ sur d'autres sujet car j'ai loin d'avoir fini mon projet.
C'est le piège !
Je vire et fais virer les Select/Activate parce qu'ils consomment énormément de ressources. Pour trois feuilles, douze cellules, ce n'est pas très grave, mais pour 3x256x65536 cellules (onglets/colonnes/lignes), ça commence à faire beaucoup ! Surtout vers la fin. On peut traiter les 50 millions de cellules d'un classeur Excel standard en quelques instants, à condition de ne pas faire de Select.
Range() = ActiveSheet.Range()
Je vire et fais virer les Select/Activate parce qu'ils consomment énormément de ressources. Pour trois feuilles, douze cellules, ce n'est pas très grave, mais pour 3x256x65536 cellules (onglets/colonnes/lignes), ça commence à faire beaucoup ! Surtout vers la fin. On peut traiter les 50 millions de cellules d'un classeur Excel standard en quelques instants, à condition de ne pas faire de Select.
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumVba recherche valeur dans fichier fermã
- ForumExcel vba recherche valeur dans colonne
- ForumVba recherche ligne
- ForumVba valeur listbox
- ForumSuppression ligne en vba
- ForumVba valeur d'une listbox
- ForumVba recherche ligne contenant
- ForumVba excel recherche valeur dans cellule
- ForumExcel vba suppression de ligne si condition
- ForumRecherche valeur cellule vba
- Voir plus