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

7 réponses

1 2
Avatar
Daniel
Pour une exécution sur toute les feuilles :

Sub test()
Dim LigneDeb As Long, LigneFin As Long, Col As Integer
Dim sh As Worksheet
On Error Resume Next
For Each sh In Sheets
LigneDeb = sh.Cells.Find("Début", , , xlWhole).Row
LigneFin = sh.Cells.Find("Totaux", , , xlWhole).Row
For i = LigneFin To LigneDeb Step -1
If Application.CountA(sh.Rows(i)) = 0 Then
sh.Rows(i).Delete
End If
Next i
Next sh
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



Avatar
Philippe.R
Re Coriandre,

Essaye à présent avec le code ci dessous :

Sub suplignesi()
'MPFE le 11/08/2007
Dim caYes As Boolean, derLigtab As Long, premliGtab As Integer
caYes = False
'On recherche la dernière ligne utile de la feuille
derLigtab = Range("a1234").End(xlUp).Row
'On recherche la première ligne utile de la feuille
premliGtab = Range("a1").End(xlDown).Row
For i = derLigtab To premliGtab Step -1
'On s'assure que la dernière ligne utile de la feuille appartient
' au tableau
If Cells(i, 1) = "Totaux" Then
caYes = True
ElseIf caYes = False Then
GoTo suite
End If
If caYes = True And Cells(i, 1).Value = "" Then Cells(i, 1) _
.EntireRow.Delete
suite:
Next i
--
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
Coriandre
Grands mercis à Daniel et à Philippe pour leurs deux belles solutions, de
forme un peu différente mais de résultat identique et positif.

Cela m'aidera d'autant plus que j'avais besoin de code équivalent pour
d'autres macros.

Un mystère demeure, dans ma seconde question, et j'ose abuser : peut-on
créer par macro un nom défini dans le tableau d'un classeur contenant x fois
le même tableau, sans préciser de quelle feuille il s'agit ?
(Par exemple pour pouvoir facilement supprimer ce nom défini et le recréer
sur un tableau d'une autre feuille...)

Il faudrait peut-être que ce soit la feuille qui soit la variable, mais
comment procéder concrètement ?

Merci encore de vos lumières.

--
Coriandre
Avatar
Philippe.R
Bonsoir,
On peut faire ça par exemple :

Sub ouderprem_et_nomme()
'Affecte de amnière volatile le nom toto à la cellule de colonne A de la
feuille active qui
' contient la valeur "Totaux"
Dim caYes As Boolean, derLigtab As Long, premliGtab As Integer
On Error Resume Next
For h = 1 To Sheets.Count
Sheets(h).Select
caYes = False
'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) = "Totaux" Then
caYes = True
ActiveWorkbook.Names.Add Name:="toto", RefersTo:="=" & Cells(i,
1).Address
MsgBox Sheets(h).Name & Cells(i, 1).Address & " " & [toto]
ElseIf caYes = False Then
GoTo suite
End If
suite:
Next i
Next h
End Sub
--
Avec plaisir
Philippe.R
"Coriandre" a écrit dans le message de
news:
Grands mercis à Daniel et à Philippe pour leurs deux belles solutions, de
forme un peu différente mais de résultat identique et positif.

Cela m'aidera d'autant plus que j'avais besoin de code équivalent pour
d'autres macros.

Un mystère demeure, dans ma seconde question, et j'ose abuser : peut-on
créer par macro un nom défini dans le tableau d'un classeur contenant x
fois le même tableau, sans préciser de quelle feuille il s'agit ?
(Par exemple pour pouvoir facilement supprimer ce nom défini et le recréer
sur un tableau d'une autre feuille...)

Il faudrait peut-être que ce soit la feuille qui soit la variable, mais
comment procéder concrètement ?

Merci encore de vos lumières.

--
Coriandre



Avatar
Daniel
Essaie :
ActiveWorkbook.Names.Add Name:="titi", RefersToR1C1:="=!R1C1:R10C1"
Daniel
"Coriandre" a écrit dans le message de news:

Grands mercis à Daniel et à Philippe pour leurs deux belles solutions, de
forme un peu différente mais de résultat identique et positif.

Cela m'aidera d'autant plus que j'avais besoin de code équivalent pour
d'autres macros.

Un mystère demeure, dans ma seconde question, et j'ose abuser : peut-on
créer par macro un nom défini dans le tableau d'un classeur contenant x
fois le même tableau, sans préciser de quelle feuille il s'agit ?
(Par exemple pour pouvoir facilement supprimer ce nom défini et le recréer
sur un tableau d'une autre feuille...)

Il faudrait peut-être que ce soit la feuille qui soit la variable, mais
comment procéder concrètement ?

Merci encore de vos lumières.

--
Coriandre



Avatar
Philippe.R
Re,

Pour affecter le même nom à une cellule de différentes feuilles, l'aide
fourni cette procédure :
"==============================================================="
Le résultat de cette opération est également appelé référence 3D.

Dans le menu Insertion, pointez sur Nom, puis cliquez sur Définir.
Dans la zone Noms dans le classeur, tapez le nom.
Si la zone "Fait référence à" contient une référence, sélectionnez le signe
égal (=) et la référence,
puis appuyez sur RET.ARR.
Dans la zone Fait référence à, tapez = (signe égal).
Cliquez sur l'onglet correspondant à la première feuille de calcul à
référencer.
Maintenez la touche MAJ enfoncée et cliquez sur l'onglet correspondant à la
dernière feuille de
calcul à référencer.
Sélectionnez la cellule ou la plage de cellules à référencer.
"==============================================================="

--
Avec plaisir
Philippe.R
"Coriandre" a écrit dans le message de
news:
Grands mercis à Daniel et à Philippe pour leurs deux belles solutions, de
forme un peu différente mais de résultat identique et positif.

Cela m'aidera d'autant plus que j'avais besoin de code équivalent pour
d'autres macros.

Un mystère demeure, dans ma seconde question, et j'ose abuser : peut-on
créer par macro un nom défini dans le tableau d'un classeur contenant x
fois le même tableau, sans préciser de quelle feuille il s'agit ?
(Par exemple pour pouvoir facilement supprimer ce nom défini et le recréer
sur un tableau d'une autre feuille...)

Il faudrait peut-être que ce soit la feuille qui soit la variable, mais
comment procéder concrètement ?

Merci encore de vos lumières.

--
Coriandre



Avatar
Coriandre
Merci encore à Philippe et Daniel de leur aide !

--
Coriandre

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

"Philippe.R" <AS_rauphil_at_wanadoo.fr> a écrit dans le message de
news:%
Bonsoir,
On peut faire ça par exemple :
--
Avec plaisir
Philippe.R


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

"Daniel" a écrit dans le message de
news:
Essaie :
ActiveWorkbook.Names.Add Name:="titi", RefersToR1C1:="=!R1C1:R10C1"
Daniel


1 2