Votre question

VBA recherche d'une valeur d'après ListBox et suppression de la ligne

Tags :
  • Nettoyage
  • Programmation
  • VB
Dernière réponse : dans Programmation
24 Juillet 2008 18:18:33

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.

  1. Private Sub CommandValider_Click()
  2. Dim BDP As Worksheet
  3. Dim T As Range
  4. Dim TituASup As String
  5.  
  6. Set BDP = Worksheets("BD poste")
  7. TituASup = ConfirmSUP.TitulaireASUP.Value
  8. Set T = BDP.Columns(1).Cells.Find(what:=TituASup)
  9.  
  10. If T Is Nothing Then
  11. MsgBox "Le titulaire n'a pas pu être supprimé. Vérifiez que vous avez sélectionné un Titulaire, sinon consultez votre Administrateur."
  12. Unload Me
  13. Else
  14. BDP.Columns(1).Cells.Find(what:=TituASup).ClearContents
  15. End If
  16.  
  17. Set T = Nothing
  18. Unload Me
  19. End Sub


A votre bon coeur!

Autres pages sur : vba recherche valeur listbox suppression ligne

29 Juillet 2008 13:37:15

A force de chercher j'ai fini par trouver (même si ma solution est plutôt archaique), donc pas la peine de vous casser la tête sur le problème.


Aller va sans rancune :hello: 
a b L Programmation
29 Juillet 2008 15:06:06

Donne-nous ta solution, que la réponse puisse servir à d'autres, s'il te plaît.
Contenus similaires
29 Juillet 2008 15:18:33

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à ! :sol: 
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 :ouch:  .
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!!!! :D  :D  :D 
  1. Private Sub CommandValider_Click()
  2. Dim BDP As Worksheet
  3. Dim BDF As Worksheet
  4. Dim BDQ As Worksheet
  5. Dim BDA As Worksheet
  6. Dim GFDP As Worksheet
  7. Dim T As Range
  8. Dim TituASup As String
  9.  
  10. Set BDP = Worksheets("BD poste")
  11. Set BDF = Worksheets("BD form")
  12. Set BDQ = Worksheets("BD qualif")
  13. Set BDA = Worksheets("BD activ")
  14. Set GFDP = Worksheets("Gestion FDP")
  15. TituASup = ConfirmSUP.TitulaireASUP.Value
  16. Set T = BDP.Columns(1).Cells.Find(What:=TituASup)
  17.  
  18. Application.ScreenUpdating = False
  19.  
  20. If T Is Nothing Then
  21. MsgBox "Le titulaire n'a pas pu être supprimé. Vérifiez que vous avez sélectionné un Titulaire, sinon consultez votre Administrateur."
  22. Unload Me
  23. Else
  24. ' On efface les 15 cellules à droite de la cellule active recherchée
  25. BDP.Select
  26. BDP.Columns(1).Cells.Find(What:=TituASup).Select
  27. Range(ActiveCell(1, 1), ActiveCell(1, 15)).ClearContents
  28.  
  29. ' On supprime la colonne correspondant au titulaire dans la feuille BD Form'
  30. BDF.Select
  31. BDF.Rows(1).Cells.Find(What:=TituASup).EntireColumn.Delete
  32.  
  33. ' On supprime la colonne correspondant au titulaire dans la feuille BD QUALIF'
  34. BDQ.Select
  35. BDQ.Rows(1).Cells.Find(What:=TituASup).EntireColumn.Delete
  36.  
  37. ' On supprime la colonne correspondant au titulaire dans la feuille BD Form'
  38. BDA.Select
  39. BDA.Rows(1).Cells.Find(What:=TituASup).EntireColumn.Delete
  40.  
  41. ' On tri le tableau selon colonne ordre pour éviter qu'il y ait des lignes vides dans le tableau
  42. BDP.Select
  43. Range("A2:Q21").Select
  44. Selection.Sort Key1:=Range("P2"), Order1:=xlAscending, Header:=xlNo, _
  45. OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  46. DataOption1:=xlSortNormal
  47. End If
  48. Set T = Nothing
  49.  
  50. ' Retour à la feuille gestiondes fiches de poste
  51. GFDP.Select
  52. ' On décharge le formulaire
  53. Unload Me
  54.  
  55. Application.ScreenUpdating = True
  56.  
  57. 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! :pt1cable: 
a b L Programmation
29 Juillet 2008 16:24:50

Zeb S.A. - Service de nettoyage du code :
  1. Private Sub CommandValider_Click()
  2. Dim BDP As Worksheet
  3. Dim T As Range
  4. Dim TituASup As String
  5.  
  6. Set BDP = Worksheets("BD poste" )
  7. TituASup = ConfirmSUP.TitulaireASUP.Value
  8.  
  9. Set T = BDP.Columns(1).Find(What:=TituASup)
  10. If T Is Nothing Then
  11. MsgBox "Le titulaire n'a pas pu être supprimé. " & _
  12. "Vérifiez que vous avez sélectionné un Titulaire, " & _
  13. "sinon consultez votre Administrateur."
  14. Exit Sub
  15. Else
  16. ' // On efface les 15 cellules à droite de la cellule trouvée
  17. Dim c As Range
  18. Set c = BDP.Columns(1).Find(What:=TituASup)
  19. Range(c, c(, 15)).ClearContents
  20.  
  21. ' // On supprime les colonnes correspondant au titulaire dans chaque feuille
  22. Worksheets("BD form" ).Rows(1).Find(What:=TituASup).EntireColumn.Delete
  23. Worksheets("BD qualif" ).Rows(1).Find(What:=TituASup).EntireColumn.Delete
  24. Worksheets("BD activ" ).Rows(1).Find(What:=TituASup).EntireColumn.Delete
  25.  
  26. ' // On tri le tableau selon colonne ordre pour éviter qu'il y ait des lignes vides dans le tableau
  27. BDP.Range("A2:Q21").Sort Key1:=Range("P2" ), Header:=xlNo, DataOption1:=xlSortNormal
  28.  
  29. Set T = Nothing
  30. End If
  31.  
  32. ' // Retour à la feuille gestion des fiches de poste
  33. Worksheets("Gestion FDP").Select
  34.  
  35. ' // On décharge le formulaire
  36. Unload Me
  37. End Sub


  • Non, pas de select. :fou:  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. :o 
  • Tu mets T à vide s'il est vide. C'est inutile. --> Spa bien. :o  (Spa grave plus plus :o  )
  • 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]
  • Ligne 37, un Select ? Oui !!!!! :bounce:  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 :) 
    29 Juillet 2008 17:04:13

    A tout hasard, tu ne songes pas à faire des formations ?! :sol: 
    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é ! :D 
    Je viens d'essayer ton code et j'ai toujours la même erreur d'exécution 1004 sur la ligne de tri :
    1. BDP.Range("A2:Q21").Sort Key1:=Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal

    Le reste fonctionne à merveille.
    A+
    a b L Programmation
    29 Juillet 2008 23:22:48

    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 :
    ? BDP.Range("A2:Q21").Address(External:=True)
    ? Range("A2").Address(External:=True)
    N'y-a-t'il rien qui te dérange ?
    Si oui, tu as ta solution. (Donne-la quand même pour les autres ;)  )
    30 Juillet 2008 08:40:37

    Bonjour Zeb,

    Bon d'accord ! tu as encore tout compris.
    Voici le nouveau code de la ligne de tri :
    1. 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.


    a b L Programmation
    30 Juillet 2008 11:24:46

    C'est le piège !
    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.