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

cafiniou13

Habitué
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.

[cpp]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[/cpp]

A votre bon coeur!
 

cafiniou13

Habitué
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:
 

zeb

Modérateur
Donne-nous ta solution, que la réponse puisse servir à d'autres, s'il te plaît.
 

cafiniou13

Habitué
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
[cpp]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
[/cpp]

By pour ce sujet, et à bientôt sur d'autres problèmes, car soyez en sûr il y en aura d'autres! :pt1cable:
 

zeb

Modérateur
Zeb S.A. - Service de nettoyage du code :
Code:
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

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 :)
 

cafiniou13

Habitué
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 :
[cpp] BDP.Range("A2:Q21").Sort Key1:=Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal
[/cpp]
Le reste fonctionne à merveille.
A+
 

zeb

Modérateur
J'ai été prof, autrefois... D'où mon gros défaut de ne pas donner de solution quand elle est trop facile ;)

________________________


[fixed]
BDP.Range("A2:Q21").Sort Key1:=Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal
¯¯¯¯\_____________/ ??\_________/
Range #1 Range #2[/fixed]

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

cafiniou13

Habitué
Bonjour Zeb,

Bon d'accord ! tu as encore tout compris.
Voici le nouveau code de la ligne de tri :
[cpp]BDP.Range("A2:Q21").Sort Key1:=BDP.Range("P2"), Header:=xlNo, DataOption1:=xlSortNormal
[/cpp]
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.


 

zeb

Modérateur
C'est le piège !
[fixed]Range() = ActiveSheet.Range()[/fixed]

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.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 078
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut