Hum. Faut quand même un minimum d'efforts pour lire le code et le comprendreIl n'est alors pas difficile de voir ce qu'il faut adapter. L'avantage, c'est que comme la plage est définie une seule fois au début de la procédure, il suffit en fait de modifier l'adresse de la plage r.
doit être modifié en
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set r = Range("a2:a" & Range("a1048576").End(xlUp).Row)
A toi de voir si tu bornes par rapport la dernière ligne de V, de A ou d'une autre colonne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set r = Range("V2:V" & Range("V1048576").End(xlUp).Row)
Attention que le code que je propose travaille sur la feuille active. Si tu veux travailler avec une feuille particulière, il te suffit de préfixer r de l'objet Worksheet qui pointe vers la bonne feuille comme l'avait fait Arturo. A nouveau, pour une ligne de plus, on gagne en clarté de code et on évite des f.range("v2:v" & derligne) répétés dans le code, en travaillant avec une plage qui est définie une fois au début de la procédure. Le code gagne en légèreté, en lisibilité et en maintenance car après l'affectation de la plage à R, on ne travaille plus qu'avec R. Si la localisation ou la taille de R change, on n'a qu'une ligne à modifier au lieu d'aller pêcher dans le code toutes les lignes à modifier. Je rappelle qu'un tableau structuré ne demanderait aucune modification de code pour continuer malgré le déplacement ou le dimensionnement
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 Sub DeleteRows() Dim ID As String Dim r As Range Dim sh As Worksheet Set sh = Sheets("DOSSIERS Les invisibles") ID = InputBox("Saisissez l'ID à supprimer svp") If ID <> "" Then Set r = sh.Range("v2:v" & sh.Range("v1048576").End(xlUp).Row) If Application.CountIfs(r, ID) > 0 Then If MsgBox("Voulez-vous supprimer les lignes pour cet id?", vbQuestion + vbYesNo) = vbYes Then r.Replace what:=ID, replacement:="", lookat:=xlWhole r.SpecialCells(xlCellTypeBlanks).EntireRow.Delete End If Else MsgBox "L'ID n'a pas été trouvé dans le tableau" End If Else MsgBox "Aucun ID n'a été saisi" End If End Sub
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
merci je vais tester en fait je fais bénévolement en plus de mon travail donc pas beaucoup de temps pour le mettreen application.
Bonsoir je viens de tester il bloque à r.SpecialCells(xlCellTypeBlanks).EntireRow.Delete je comprends pas bien SpecialCells(xlCellTypeBlanks puis je vous laisser le fichier excel pour que je le récupère ensuite une fois corrigé. Le pire je ne sais pas pourquoi j'ai le userform Frmodification qui se lance ensuite Merci beaucoup
Il ne me reste que cela à corriger pour faire fonctionner mon classeur.Tableau de bord général Les Invisibles.xlsm
Login si besoin
Jamal
mdp: 123
Le code que je t'ai donné (comme ceux des autres intervenants) ne peut pas fonctionner pour un tableau structuré. il ne fonctionne que pour des plages "classiques" d'Excel. Je t'ai donné celui-là dans un premier temps parce que depuis le début de la discussion, les codes donnés illustrent un traitement "classique" des données. C'est parce que tu es dans un tableau structuré que tu rencontre cette erreur, déjà mentionnée au message #18. Comme quoi, éviter l'erreur par un On Error Resume Next comme je l'ai lu dans une réponse ne sert à rien et évite simplement de réfléchir à la cause de l'erreur, et donc probablement d'en causer une autre ailleurs (ou ne pas exécuter ce qui doit l'être, comme la suppression de la ligne dans le cas qui nous occupe).
Comme je l'ai dit, l'utilisation d'un tableau structuré te dispenserait de devoir préciser la feuille et la colonne V, de devoir rechercher la dernière ligne, et de supprimer les lignes entières car dans un tableau structuré, on ne supprime les données que sur les colonnes du tableau. On ne peut pas supprimer des lignes non contiguës d'une feuille si elles contiennent des lignes de tableau structuré, d'où le problème que tu rencontres.
Dans un tableau structuré, on ne sait pas supprimer des parties de lignes. Supprimer une cellule d'un tableau structuré revient à supprimer la ligne entière du tableau qui contient cette cellule (donc sans rien supprimer ni à gauche ni à droite du tableau).
Voici le code corrigé par rapport à cette nouvelle donne. Tu remarqueras que l'on n'a plus besoin de préciser la feuille, ni de rechercher la dernière ligne, ni de préciser la colonne V, ni de supprimer la ligne entière (EntireRow)... Que du bonheur, en somme. Si tu déplaces ton tableau, latéralement ou verticalement sur la feuille où sur une autre, si tu insères ou supprimes des colonnes (pas la colonne [identifiant OE], évidemment), ton code continue à fonctionner sans aucune modification. Ca amène de la sécurité, de la pérennité, de la fiabilité, une réduction du code (et donc du risque d'erreurs) et une meilleure lisibilité du code. Il te faudra modifier ton code uniquement en cas de renommage du tableau ou de la colonne utilisée dans ton code.
Pense à nommer ton tableau (Tableau2, ce n'est pas très explicite) et note que lorsque tu l'auras renommé, il faudra adapter ton code car la modification en Excel n'est pas reportée en VBA.
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 Private Sub btnsupdelabasebddinv_Click() Dim ID As String Dim r As Range ID = InputBox("Saisissez l'ID à supprimer svp") If ID <> "" Then Set r = Range("Tableau2[identifiant OE]") If Application.CountIfs(r, ID) > 0 Then If MsgBox("Voulez-vous supprimer les lignes pour cet id?", vbQuestion + vbYesNo) = vbYes Then r.Replace what:=ID, replacement:="", lookat:=xlWhole r.SpecialCells(xlCellTypeBlanks).Delete End If Else MsgBox "L'ID n'a pas été trouvé dans le tableau" End If Else MsgBox "Aucun ID n'a été saisi" End If End Sub
Tu as placé du code sur le Selection_Change de la feuille. La suppression des lignes alors que tu es dans la feuille amène une modification de la sélection, et donc le code évènementiel (qui lance le userform) est lancé lors de la suppression des lignes. Tu aurais intérêt soit à désactiver les évènements le temps du traitement, soit à afficher le userform plutôt sur un double click dans le tableau. Perso, je choisirais la seconde solution.
NB: Je n'ai pas eu besoin du login et du mot de passe... La "sécurité" de ton classeur est à revoir![]()
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Franchement je dis chapeau depuis le temps que je cherche c'est un truc de fou.
Merci pour l'asso que je bosse avec,Ils pourront plus se consacrer pour les personnes qui recherchent du travail.
Je vais modifier mon tableau et aussi faire un tableau structuré, il fallait juste que je lance la machine pour qu'ils puissent travailler à l asso.
merci encore pour tout
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