Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Sélection d'une plage de cellule dans un tableau sans noms définis

17 réponses
Avatar
Coriandre
Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant à la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection / suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules (pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille, mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6) dans
un tableau sur la feuille active, sans préciser le nom de cette feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée "fin" ?

Merci de votre aide.

--
Coriandre

10 réponses

1 2
Avatar
Daniel
Bonjour.
Sélectionne ta plage et exécute la macro :

Sub test()
Dim Plage As Range, c As Range
With Selection
For i = .Row + .Rows.Count - 1 To .Row Step -1
If Application.CountA(Intersect(Rows(i), Selection)) = 0 Then
Rows(i).Delete
End If
Next i
End With
End Sub

Cordialement.
Daniel
"Coriandre" a écrit dans le message de news:

Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant à
la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection /
suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes
vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules
(pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille,
mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6)
dans
un tableau sur la feuille active, sans préciser le nom de cette feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée "fin"
?

Merci de votre aide.

--
Coriandre



Avatar
Coriandre
Merci de ta proposition.

J'avais bien vu ce code en cherchant par Google.
Mais une partie du problème est justement dans la sélection de la plage.
Je ne veux pas que l'utilisateur ait à sélectionner lui-même la plage où il
faut ôter les lignes vides.

La plage (au nombre de lignes variables) doit donc être définie dans la
macro : plage = lignes entre la ligne de la cellule qui contient "Début" et
la ligne de la cellule qui contient "Totaux", et ce, quelle que soit la
feuille sélectionnée (plusieurs feuilles contenant le même tableau).

En ce qui concerne ma deuxième question, j'ai pu constater qu'on peut
sélectionner une plage entre deux cellules nommées :
--------------------------
Sub Macro9()

'Création des noms définis :
ActiveWorkbook.Names.Add Name:="premier", RefersToR1C1:="þuil1!R1C4"
ActiveWorkbook.Names("dernier").Comment = ""
ActiveWorkbook.Names.Add Name:="coucou", RefersToR1C1:="þuil1!R10C7"
ActiveWorkbook.Names("coucou").Comment = ""

'Puis sélection de la plage :
Range("premier:dernier").Select
End Sub
---------------------------

Mais je souhaite pouvoir appliquer cette macro à n'importe quelle feuille
active contenant le tableau, et pas seulement à la feuille 1.
Comment faire ?
Lorsque je remplace Feuil1 par ActiveWorksheet, j'obtiens bien des noms
définis, mais non sélectionnables, et cela me renvoie un message d'erreur...

Cordialement,
--
Coriandre

_____________________________________

"Daniel" a écrit dans le message de
news:
Bonjour.
Sélectionne ta plage et exécute la macro :

Sub test()
Dim Plage As Range, c As Range
With Selection
For i = .Row + .Rows.Count - 1 To .Row Step -1
If Application.CountA(Intersect(Rows(i), Selection)) = 0 Then
Rows(i).Delete
End If
Next i
End With
End Sub

Cordialement.
Daniel
"Coriandre" a écrit dans le message de news:

Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant à
la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection /
suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes
vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules
(pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille,
mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6)
dans
un tableau sur la feuille active, sans préciser le nom de cette feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée "fin"
?

Merci de votre aide.

--
Coriandre







Avatar
Daniel
Remplace "selection" par l'adresse de ta plage, comme [A20:W70] par exemple.
Daniel
"Coriandre" a écrit dans le message de news:

Merci de ta proposition.

J'avais bien vu ce code en cherchant par Google.
Mais une partie du problème est justement dans la sélection de la plage.
Je ne veux pas que l'utilisateur ait à sélectionner lui-même la plage où
il
faut ôter les lignes vides.

La plage (au nombre de lignes variables) doit donc être définie dans la
macro : plage = lignes entre la ligne de la cellule qui contient "Début"
et
la ligne de la cellule qui contient "Totaux", et ce, quelle que soit la
feuille sélectionnée (plusieurs feuilles contenant le même tableau).

En ce qui concerne ma deuxième question, j'ai pu constater qu'on peut
sélectionner une plage entre deux cellules nommées :
--------------------------
Sub Macro9()

'Création des noms définis :
ActiveWorkbook.Names.Add Name:="premier", RefersToR1C1:="þuil1!R1C4"
ActiveWorkbook.Names("dernier").Comment = ""
ActiveWorkbook.Names.Add Name:="coucou", RefersToR1C1:="þuil1!R10C7"
ActiveWorkbook.Names("coucou").Comment = ""

'Puis sélection de la plage :
Range("premier:dernier").Select
End Sub
---------------------------

Mais je souhaite pouvoir appliquer cette macro à n'importe quelle feuille
active contenant le tableau, et pas seulement à la feuille 1.
Comment faire ?
Lorsque je remplace Feuil1 par ActiveWorksheet, j'obtiens bien des noms
définis, mais non sélectionnables, et cela me renvoie un message
d'erreur...

Cordialement,
--
Coriandre

_____________________________________

"Daniel" a écrit dans le message de
news:
Bonjour.
Sélectionne ta plage et exécute la macro :

Sub test()
Dim Plage As Range, c As Range
With Selection
For i = .Row + .Rows.Count - 1 To .Row Step -1
If Application.CountA(Intersect(Rows(i), Selection)) = 0 Then
Rows(i).Delete
End If
Next i
End With
End Sub

Cordialement.
Daniel
"Coriandre" a écrit dans le message de news:

Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant à
la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection /
suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et
je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer
une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes
vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules
(pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille,
mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6)
dans
un tableau sur la feuille active, sans préciser le nom de cette feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée
"fin"
?

Merci de votre aide.

--
Coriandre











Avatar
Philippe.R
Bonsoir Coriandre,
Je propose de ne pas nommer de plage de manière temporaire dans chaque
feuille (trop de risque de confusion lors du balayage des différents
tableaux à mes yeux) ; en revanche le code ci dessous suppose qu'il n'y ait
en colonne A de la feuille que des éléments appartenant aux tableaux

Sub suplignes()
'MPFE le 09/08/2007
'On recherche la dernière ligne du tableau
derligtab = Range("a1234").End(xlUp).Row
'On recherche la première ligne
premligtab = Range("a1").End(xlDown).Row
For i = derligtab To premligtab Step -1
If Cells(i, 1).Value = "" Then Cells(i, 1).EntireRow.Delete
Next i
End Sub
--
Avec plaisir
Philippe.R
"Coriandre" a écrit dans le message de
news:
Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant à
la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection /
suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes
vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules
(pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille,
mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6)
dans
un tableau sur la feuille active, sans préciser le nom de cette feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée "fin"
?

Merci de votre aide.

--
Coriandre



Avatar
Coriandre
Bonjour,

Merci Philippe de ta proposition, que j'ai essayée.

Mais là encore, le problème de la sélection d'une plage variable d'un
tableau au nombre de lignes variable entre deux lignes contenant des mots
fixes n'est pas résolu.
En effet, cette macros supprime aussi les lignes vides situées sous le
tableau.
Elle sélectionne dans son opération toutes les lignes de la feuille à partir
de la ligne 1234 (ou moins selon l'adaptation, mais le problème reste
entier).

Or j'ai des données cachées sous le tableau (données qui ne peuvent être
situées ailleurs que sur la même feuille que le tableau, dont il dépend).
Je souhaite qu'elles restent à bonne distance sous le tableau, sans que
cette distance soit raccourcie par la suppression des lignes vides sous le
tableau.

Je ne veux donc ôter de lignes vides que dans le tableau, ni au dessus, ni
au dessous.

Ce tableau a donc une ligne de début, avec en colonne B (par exemple) le mot
"Début", et une ligne de fin avec en colonne B (par exemple) le mot
"Totaux".
Entre ces lignes, les lignes de données variables, et de nombre variable.

Je pourrais peut-être nommer temporairement les cellules contenant le mot
"Totaux" et "Début", par exemple en "debut" et "totaux" et changer tes
données Range("a1234") par Range("totaux"), et Range("a1") par
Range("debut"), puis supprimer les noms définis.

Mais ce n'est pas très "joli" comme solution, et cela comporte
l'inconviénient que tu évoques ("trop de risque de confusion lors du
balayage"... ).

En attendant, j'ai contourné le problème de cette manière, encore moins
"jolie", et un peu "tordue" :
j'ai inscrit un point de police petite et fondue dans la couleur de la
feuille dans chaque cellule B sous le tableau (entre le tableau et mes
données cachées), afin que la ligne ne soit pas considérée comme vide, et
j'ai écrit la macro suivante :

------------------------------
Sub supprimer_lignes_vides()
Application.ScreenUpdating = False

'Suppression des lignes vides :

Dim i As Long
Dim Plage As Range
Set Plage = Range("B4:B70")
For i = Plage.Cells.Count To 1 Step -1
If Plage.Cells(i).Value = Empty Then
Plage.Cells(i).EntireRow.Delete

'Ajout à chaque ligne supprimée d'une nouvelle ligne vide sous le tableau
(10 lignes au dessous) :

If c Like "Totaux" Then
c.EntireRow.Select
ActiveCell.Offset(10, 0).Rows("1:1").EntireRow.Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End If
End If
Next
End Sub
-----------------------------

Mais j'aimerais bien une solution plus élégante...

--
Coriandre

"Philippe.R" <AS_rauphil_at_wanadoo.fr> a écrit dans le message de
news:u$
Bonsoir Coriandre,
Je propose de ne pas nommer de plage de manière temporaire dans chaque
feuille (trop de risque de confusion lors du balayage des différents
tableaux à mes yeux) ; en revanche le code ci dessous suppose qu'il n'y
ait en colonne A de la feuille que des éléments appartenant aux tableaux

Sub suplignes()
'MPFE le 09/08/2007
'On recherche la dernière ligne du tableau
derligtab = Range("a1234").End(xlUp).Row
'On recherche la première ligne
premligtab = Range("a1").End(xlDown).Row
For i = derligtab To premligtab Step -1
If Cells(i, 1).Value = "" Then Cells(i, 1).EntireRow.Delete
Next i
End Sub
--
Avec plaisir
Philippe.R
"Coriandre" a écrit dans le message de
news:
Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant à
la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection /
suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes
vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules
(pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille,
mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6)
dans
un tableau sur la feuille active, sans préciser le nom de cette feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée "fin"
?

Merci de votre aide.

--
Coriandre






Avatar
Coriandre
Bonjour,

Daniel propose :
"Remplace "selection" par l'adresse de ta plage, comme [A20:W70] par
exemple."

Mon tableau comporte un nombre de lignes variables, non strictement défini
entre 20 et 70 par exemple.

De plus, il y a des données sous le tableau, qui doivent impérativement
rester présentes et ne pas être effacées par la macro effaceuse.

Mon problème réside donc dans la sélection d'une plage variable située entre
deux lignes (première et dernière du tableau) dont les mots dans les
cellules sont fixes.
(Exemple : "Début" dans la colonne B de la première ligne, "Totaux" dans la
colonne B de la dernière ligne).

Peut-on définir cette plage à partir, par exemple, de ces mots contenus dans
l'une des cellules de la première ligne et de la dernière ligne du tableau ?

Ou autre moyen de sélectionner cette plage variable entre deux lignes, sans
utiliser de noms définis ?

--
Coriandre

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

"Daniel" a écrit dans le message de
news:%
Remplace "selection" par l'adresse de ta plage, comme [A20:W70] par
exemple.
Daniel
"Coriandre" a écrit dans le message de news:

Merci de ta proposition.

J'avais bien vu ce code en cherchant par Google.
Mais une partie du problème est justement dans la sélection de la plage.
Je ne veux pas que l'utilisateur ait à sélectionner lui-même la plage où
il
faut ôter les lignes vides.

La plage (au nombre de lignes variables) doit donc être définie dans la
macro : plage = lignes entre la ligne de la cellule qui contient "Début"
et
la ligne de la cellule qui contient "Totaux", et ce, quelle que soit la
feuille sélectionnée (plusieurs feuilles contenant le même tableau).

En ce qui concerne ma deuxième question, j'ai pu constater qu'on peut
sélectionner une plage entre deux cellules nommées :
--------------------------
Sub Macro9()

'Création des noms définis :
ActiveWorkbook.Names.Add Name:="premier", RefersToR1C1:="þuil1!R1C4"
ActiveWorkbook.Names("dernier").Comment = ""
ActiveWorkbook.Names.Add Name:="coucou", RefersToR1C1:="þuil1!R10C7"
ActiveWorkbook.Names("coucou").Comment = ""

'Puis sélection de la plage :
Range("premier:dernier").Select
End Sub
---------------------------

Mais je souhaite pouvoir appliquer cette macro à n'importe quelle feuille
active contenant le tableau, et pas seulement à la feuille 1.
Comment faire ?
Lorsque je remplace Feuil1 par ActiveWorksheet, j'obtiens bien des noms
définis, mais non sélectionnables, et cela me renvoie un message
d'erreur...

Cordialement,
--
Coriandre

_____________________________________

"Daniel" a écrit dans le message de
news:
Bonjour.
Sélectionne ta plage et exécute la macro :

Sub test()
Dim Plage As Range, c As Range
With Selection
For i = .Row + .Rows.Count - 1 To .Row Step -1
If Application.CountA(Intersect(Rows(i), Selection)) = 0 Then
Rows(i).Delete
End If
Next i
End With
End Sub

Cordialement.
Daniel
"Coriandre" a écrit dans le message de news:

Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant
à
la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection /
suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et
je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer
une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes
vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de
la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules
(pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille,
mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer
une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6)
dans
un tableau sur la feuille active, sans préciser le nom de cette
feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée
"fin"
?

Merci de votre aide.

--
Coriandre















Avatar
Philippe.R
Bonjour Coriandre,
Vu l'arbre en boule !
Je regarde ça à tête reposée après la sieste et te dis.
;o)))
--
Avec plaisir
Philippe.R
"Coriandre" a écrit dans le message de
news:%
Bonjour,

Merci Philippe de ta proposition, que j'ai essayée.

Mais là encore, le problème de la sélection d'une plage variable d'un
tableau au nombre de lignes variable entre deux lignes contenant des mots
fixes n'est pas résolu.
En effet, cette macros supprime aussi les lignes vides situées sous le
tableau.
Elle sélectionne dans son opération toutes les lignes de la feuille à
partir de la ligne 1234 (ou moins selon l'adaptation, mais le problème
reste entier).

Or j'ai des données cachées sous le tableau (données qui ne peuvent être
situées ailleurs que sur la même feuille que le tableau, dont il dépend).
Je souhaite qu'elles restent à bonne distance sous le tableau, sans que
cette distance soit raccourcie par la suppression des lignes vides sous le
tableau.

Je ne veux donc ôter de lignes vides que dans le tableau, ni au dessus, ni
au dessous.

Ce tableau a donc une ligne de début, avec en colonne B (par exemple) le
mot "Début", et une ligne de fin avec en colonne B (par exemple) le mot
"Totaux".
Entre ces lignes, les lignes de données variables, et de nombre variable.

Je pourrais peut-être nommer temporairement les cellules contenant le mot
"Totaux" et "Début", par exemple en "debut" et "totaux" et changer tes
données Range("a1234") par Range("totaux"), et Range("a1") par
Range("debut"), puis supprimer les noms définis.

Mais ce n'est pas très "joli" comme solution, et cela comporte
l'inconviénient que tu évoques ("trop de risque de confusion lors du
balayage"... ).

En attendant, j'ai contourné le problème de cette manière, encore moins
"jolie", et un peu "tordue" :
j'ai inscrit un point de police petite et fondue dans la couleur de la
feuille dans chaque cellule B sous le tableau (entre le tableau et mes
données cachées), afin que la ligne ne soit pas considérée comme vide, et
j'ai écrit la macro suivante :

------------------------------
Sub supprimer_lignes_vides()
Application.ScreenUpdating = False

'Suppression des lignes vides :

Dim i As Long
Dim Plage As Range
Set Plage = Range("B4:B70")
For i = Plage.Cells.Count To 1 Step -1
If Plage.Cells(i).Value = Empty Then
Plage.Cells(i).EntireRow.Delete

'Ajout à chaque ligne supprimée d'une nouvelle ligne vide sous le tableau
(10 lignes au dessous) :

If c Like "Totaux" Then
c.EntireRow.Select
ActiveCell.Offset(10, 0).Rows("1:1").EntireRow.Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End If
End If
Next
End Sub
-----------------------------

Mais j'aimerais bien une solution plus élégante...

--
Coriandre

"Philippe.R" <AS_rauphil_at_wanadoo.fr> a écrit dans le message de
news:u$
Bonsoir Coriandre,
Je propose de ne pas nommer de plage de manière temporaire dans chaque
feuille (trop de risque de confusion lors du balayage des différents
tableaux à mes yeux) ; en revanche le code ci dessous suppose qu'il n'y
ait en colonne A de la feuille que des éléments appartenant aux tableaux

Sub suplignes()
'MPFE le 09/08/2007
'On recherche la dernière ligne du tableau
derligtab = Range("a1234").End(xlUp).Row
'On recherche la première ligne
premligtab = Range("a1").End(xlDown).Row
For i = derligtab To premligtab Step -1
If Cells(i, 1).Value = "" Then Cells(i, 1).EntireRow.Delete
Next i
End Sub
--
Avec plaisir
Philippe.R
"Coriandre" a écrit dans le message de
news:
Bonjour,

J'ai trouvé sur le Net beaucoup de lignes de code en vba correspondant à
la
suppression de lignes vides en partant du bas ou du haut de la feuille
Excel, mais je n'ai pas trouvé de code permettant la sélection /
suppression
de lignes comprises dans un tableau sans utiliser de nom défini.

(Veuillez me pardonner si c'est par maladresse dans la méthode de
recherche.)

J'ai en effet un même tableau reproduit sur de nombreuses feuilles, et
je
voudrais agir sur ce tableau avec une seule macro, sans avoir à créer
une
macro spécifique à chaque tableau de chaque feuille.

L'action en question : sur la feuille sélectionnée et sur elle seule,
supprimer les lignes vides entre deux lignes précises du tableau.

1) Ma première question :

Soit un tableau au nombre de lignes variables,
- dont l'en-tête comporte le mot : "Début"
- dont la première cellule de la dernière ligne (Ax) comporte le mot :
"Totaux".

Schéma :

Début I B1 I C1
-------------------------
A2 I B2 I C2
-------------------------
A3 I B3 I C3
-------------------------
A(x) I B(x) I C(x)
-------------------------
Totaux I B(x+1) I C(x+1)


=> Comment, par macro, sélectionner / supprimer / modifier les lignes
vides
de ce tableau situées au dessus de la ligne "Totaux" et au dessous de la
ligne "Début", sans avoir à nommer de cellules ou de plages de cellules
(pas
de noms définis) ?

2) Ma deuxième question, à partir de ce même tableau :

=> Peut-on créer et supprimer par vba des noms définis sur une feuille,
mais
sans préciser le nom de la feuille ?
Il s'agit de créer temporairement des noms définis (exemple : nommer une
plage "debut" entre A3 et D3, et une autre plage "fin" entre A6 et D6)
dans
un tableau sur la feuille active, sans préciser le nom de cette feuille.
(Comme préciser plus haut, ce tableau se répètante sur de nombreuses
feuilles, et je voudrais une seule macro exécutable sur chacune de ces
feuilles).

Une fois ces noms définis créés, comment sélectionner / modifier les
cellules comprises entre la plage nommée "debut" et la plage nommée
"fin" ?

Merci de votre aide.

--
Coriandre










Avatar
Daniel
Mon tableau comporte un nombre de lignes variables, non strictement défini
entre 20 et 70 par exemple.

De plus, il y a des données sous le tableau, qui doivent impérativement
rester présentes et ne pas être effacées par la macro effaceuse.

Bonjour.

Comment définir ton tableau par rapport aux données qui se trouvent dessous
?
Le cellule en haut et à gauche de ton tableau est-elle fixe ?
Comment peut-on déterminer la dernière ligne du tableau ?
Daniel

Avatar
Coriandre
De : Daniel
Comment définir ton tableau par rapport aux données qui se trouvent
dessous ?
Le cellule en haut et à gauche de ton tableau est-elle fixe ?
Comment peut-on déterminer la dernière ligne du tableau ?


La cellule en haut à gauche de mon tableau est fixe (exemple contenant le
mot "Début"), ainsi que la cellule en bas à gauche contenant le mot
"Totaux".
Je ne veux pas toucher aux lignes sous le tableau, ni à celles du dessus.

Encore une fois, ce ne me serait pas difficile à résoudre s'il s'agissait
d'un seul tableau sur une seule feuille, sur lequel je pourrais définir des
noms pour les lignes de début et de fin.
Mais ce tableau se répète sur beaucoup de feuilles, et doit subir le même
traitement, chaque tableau indépendamment de l'autre.


Pour info, correction de ma solution batarde donnée dans mon message à
Philippe :

------------------------------
Sub supprimer_lignes_vides()
Application.ScreenUpdating = False

'Suppression des lignes vides :

Dim i As Long
Dim Plage As Range
Set Plage = Range("B4:B70")
For i = Plage.Cells.Count To 1 Step -1
If Plage.Cells(i).Value = Empty Then
Plage.Cells(i).EntireRow.Delete

'Ajout à chaque ligne supprimée d'une nouvelle ligne vide
'sous le tableau (10 lignes au dessous),
'identique aux lignes sus et sous jacentes :

For Each c In Range("A4:A70")
If c Like "Totaux par modes de paiement" Then
c.Offset(10, 0).Rows("1:1").EntireRow.Select
Selection.Copy
ActiveCell.Offset(1, 0).Select
Selection.Insert Shift:=xlDown
End If
Next c

End If
Next
End Sub
-----------------------------

Je choisis donc une plage élargie comprenant le tableau et un certain nombre
de lignes au dessous (A4 à A70), en tapant large pour laisser libre
l'introduction de suffisament de lignes dans la plage variable, sans
atteindre les données cachées sous le tableau (elles commencent à A100),
puis à chaque ligne vide supprimée, je rajoute juste sous le tableau une
ligne pour conserver l'écart entre les données cachées et le bas du tableau.

Mais c'est bien tordu, et intellectuellement peu satisfaisant...

--
Coriandre

Avatar
Daniel
Essaie :

Sub test()
Dim LigneDeb As Long, LigneFin As Long, Col As Integer
LigneDeb = Cells.Find("Début", , , xlWhole).Row

LigneFin = Cells.Find("Totaux", , , xlWhole).Row
For i = LigneFin To LigneDeb Step -1
If Application.CountA(Rows(i)) = 0 Then
Rows(i).Delete
End If
Next i
End Sub

Daniel
"Coriandre" a écrit dans le message de news:

De : Daniel
Comment définir ton tableau par rapport aux données qui se trouvent
dessous ?
Le cellule en haut et à gauche de ton tableau est-elle fixe ?
Comment peut-on déterminer la dernière ligne du tableau ?


La cellule en haut à gauche de mon tableau est fixe (exemple contenant le
mot "Début"), ainsi que la cellule en bas à gauche contenant le mot
"Totaux".
Je ne veux pas toucher aux lignes sous le tableau, ni à celles du dessus.

Encore une fois, ce ne me serait pas difficile à résoudre s'il s'agissait
d'un seul tableau sur une seule feuille, sur lequel je pourrais définir
des noms pour les lignes de début et de fin.
Mais ce tableau se répète sur beaucoup de feuilles, et doit subir le même
traitement, chaque tableau indépendamment de l'autre.


Pour info, correction de ma solution batarde donnée dans mon message à
Philippe :

------------------------------
Sub supprimer_lignes_vides()
Application.ScreenUpdating = False

'Suppression des lignes vides :

Dim i As Long
Dim Plage As Range
Set Plage = Range("B4:B70")
For i = Plage.Cells.Count To 1 Step -1
If Plage.Cells(i).Value = Empty Then
Plage.Cells(i).EntireRow.Delete

'Ajout à chaque ligne supprimée d'une nouvelle ligne vide
'sous le tableau (10 lignes au dessous),
'identique aux lignes sus et sous jacentes :

For Each c In Range("A4:A70")
If c Like "Totaux par modes de paiement" Then
c.Offset(10, 0).Rows("1:1").EntireRow.Select
Selection.Copy
ActiveCell.Offset(1, 0).Select
Selection.Insert Shift:=xlDown
End If
Next c

End If
Next
End Sub
-----------------------------

Je choisis donc une plage élargie comprenant le tableau et un certain
nombre de lignes au dessous (A4 à A70), en tapant large pour laisser libre
l'introduction de suffisament de lignes dans la plage variable, sans
atteindre les données cachées sous le tableau (elles commencent à A100),
puis à chaque ligne vide supprimée, je rajoute juste sous le tableau une
ligne pour conserver l'écart entre les données cachées et le bas du
tableau.

Mais c'est bien tordu, et intellectuellement peu satisfaisant...

--
Coriandre



1 2