Supprimer les lignes quand la cellule de la colonne B est vide

SCHMITX

Habitué
Bonjour

Je souhaite réaliser une macro sur Excel qui supprimera automatiquement la ligne, si la cellule dans la colonne B est vide.

Mon tableau se définit sur la plage B5:J100
Lorsque la macro s'exécute, il faut que toutes les lignes s'effacent si et seulement si la cellule en B est vide.

J'ai déja crée un code, mais lorsque je l'exécute, mais ce dernier ne fait effacer que quelques une des lignes et il faut que je clic plusieurs fois sur le bouton active x pour supprimer les autres

Range("B:B").Select
For Each cell In Range("B:B")
If cell.Value = "" Then
cell.EntireRow.Delete Shift:=xlUp
End if
Next cell
 

zeb

Modérateur
Salut Schmitx,

Sais-tu ce que signifie ?
Alors s'il te plaît, modifie ton message en remplaçant
par
Code:
.
 

SCHMITX

Habitué
Oupss désolé :sweat:

Donc je remet tout depuis le début lol

Bonjour

Je souhaite réaliser une macro sur Excel qui supprimera automatiquement la ligne, si la cellule dans la colonne B est vide.

Mon tableau se définit sur la plage B5:J100
Lorsque la macro s'exécute, il faut que toutes les lignes s'effacent si et seulement si la cellule en B est vide.

Pour information, j'ai crée une plage de cellule dynamique que j'ai nommé "suppression_lignes_raison_des_depenses" pour la colonne B5:B100

J'ai déja crée un code, mais lorsque je l'exécute, mais ce dernier ne fait effacer que quelques une des lignes et il faut que je clic plusieurs fois sur le bouton active x pour supprimer les autres

[cpp]Private Sub CommandButton1_Click()

Dim cell As Range


For Each cell In Range("suppression_lignes_raison_des_depenses")
If cell.Value = "" Then
cell.EntireRow.Delete Shift:=xlUp

End If

Next cell

End Sub[/cpp]
 

zeb

Modérateur
Salut,

Donc je remet tout depuis le début lol
Rhooooo, j'explique pourtant tout ça, et en image, s'il vous plaît :
Vous devez être connecté pour voir les images.

Pas mal du tout ta syntaxe, c'est même excellent. Mais le problème n'est pas là !
J'explique tout ici :

Si tu as tout compris, refais ton code :)
Si tu n'as rien compris, relis le topic :o
Si tu es entre les deux, fais-nous en part ;)

A te lire.
 

SCHMITX

Habitué
Merci, ton topic m'a été d'une grande aide.

Effectivement j'ai réussi à comprendre pourquoi celà ne fonctionnais pas avec mon code, et j'ai réussi à en créer un qui fonctionne.

Cependant, j'ai utilisé la boucle "for next" avec comme valeur de variable: "i" qui est définit de la ligne 44 à 7.
Or, ce que je voudrais se serai définir la variable par rapport à une plage de cellule dynamique.

voici mon code

[cpp]Private Sub CommandButton1_Click()



Dim i As Integer

For i = 44 To 7 Step -1

If cells(i, 14).Value = "" Then

cells(i, 14).EntireRow.Delete Shift:=xlUp

End If[/cpp]

Comment faire pour remplacer
i = 44 to 7 step - 1 par
"i" = plage de cellule dynamique ?



Next


End Sub
 

oozenot

Expert
rooooooo,

l'indentation, le next manquant :fou:

POur ce qui est de ta question... il va falloir que tu fasse faire a VB une recherche du début et de la fin de ton tableau (par exemple)

pour ce faire tu as 2 possibilités :
- soit tu as un tableau avec une colonne dont les cellules sont toujours remplies ... et dans ce cas tu regarde la premiere cellule remplie et la derniere et ton tableau se trouve entre les 2 !!
(assez efficace mais dangeureux ... NEVER trust user input )
- soit tu effectue ton opération sur toute la feuille excel mais comme dans ton cas il faut supprimer des lignes de cellulles vide ... il y en aura un paquet.. et ca risque peut etre d'etre plus lent a l'execution..

donc si je transpose ca en code tu risque d'avoir besoins de :
.Range() , .END()
de telle maniere a faire qqch comme ca :
[cpp]
dim first_cell as Range
dim last_cell as Range
dim i as long
dim ws_xxxx as worksheet

set ws_xxxx = Worksheets("...") '// définition de ta feuille excel !!!

set first_cell = ws_xxxx.Columns( ...).end(...) '// trouve la premiere cellule
set last_cell = ws_xxxx.range(first_cell, first_cell.column).end() '// trouve la derniere cellule

for i = last_cell to first_cell step -1 '// ta boucle s'effectue sur le tableau peut importe ou il commence et ou il termine
[...]
Next
[/cpp]

mainetnant l'autre sollution est de faire cette recherche sur toute la feuille et ainsi de supprimer toutes les lignes qui ont une cellule vide dans la colonne qui t'intéresse :
dans ce cas utilise range sur toute la feuille !!!
[cpp]
dim i as long '// les integer ne vont qu'a 32367 (qqch comme ca) or les lignes excel vont jusqu'a 65536

for i = 65536 to 1 step -1
[...]
Next
[/cpp]
 

zeb

Modérateur
Ben, elle est où la réponse que je faisais à Schmitx ???????

-------------------

Salut les jeunes,

Eh, oozenot, je crois que tu n'as tout bien compris ;)

D'abord, regarde mieux le message de Schmitx, le Next et le End Sub y sont, mais tous seuls, à la fin du mesage :lol: :lol: :lol: Il y en a un qui s'est planté :pt1cable:

Ensuite, la plage est connue, elle porte un nom : Range("suppression_lignes_raison_des_depenses" ).

Donc il ne s'agit pas de la trouver, mais de l'utiliser.

J'ai quelques devinettes pour Schmitx :

Soit plage, une plage de cellules donnée.
Exemple :
Code:
Dim plage As Range
Set plage = Range("B5:J100")

Combien cette plage contient-elle de cellules ?
Réponse : plage.Cells.Count
Quelle est la première cellule de cette plage ?
Réponse : plage.Cells(1)
Quelle est la ligne de la première cellule de cette plage ?
Réponse : plage.Cells(1).Row
Quelle est la dernière cellule de cette plage ?
Réponse : :kaola: :kaola: :kaola:
C'est à toi de trouver tout seul [:nyghost]
(J'ai dans l'idée que les questions et réponses précédentes devraient t'aider quand même ;) )
 

oozenot

Expert
ah, ben forcément,
s'ai fait ma réponse en partant du dernier code proposé... je ne pensais apas qu'il ne s'agissait que d'un bout.. ;)

bah de toute facon ca peut toujours servir ... :D
et je n'ai meme plus besoin de répondre... tu as déja tout prévu.. sacré zeb... :D

bon ben j'ai fais un passage inutile !! mdr
... :sleep:
 

zeb

Modérateur
Absolument pas. Tous les avis sont bons, pis sur l'indentation, t'as parfaitement raison :o

:)

Alors Schmitx, ces devinettes ?
 

SCHMITX

Habitué
J'ai regardé ta proposition de code.
Alors j'ai commencé à rédiger mais cela ne vas pas. Donc si je n'ai pas réussi c'est certainement parce que je n'ai pas saisi la logique du code.
En fait je vais d'abord chercher à savoir pourquoi on doit le rédiger de cette manière et ensuite je reviendrai pour l'écrire et l'adopter à mon problème.
Donc si tu peux simplement m'aiguiller en m'expliquant le rôle de la fonction count puis ce que signifie exactement ce que l'on place dans les parenthèse après cells, celà pourrais m'aider d'avantage.
Merci

Je met quand même mon code, le message d'erreur étant "utilisation incorrect de la propriété de count"

[cpp]Dim plage As Range
Set plage = Range("n7;n46")
plage.cells.Count
plage.cells (1)
plage.cells(1).Row
plage.cells (31)
end sub
[/cpp]
 

zeb

Modérateur
Nan mais qu'est-ce que c'est que ça ? :ouch:

Je te donne des fonctions qui renvoient des informations qui sont censées t'aider.
Elles sont faites pour être utilisées dans des calculs, pas pour être mises directement comme ça.

Essaie comme ça, par exemple pour Count :
Code:
MsgBox plage.cells.Count

Et quand t'as compris ce que ça renvoie, réfléchis.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 057
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut