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

VBA Selection de toute la plage occupée d'une feuille

9 réponses
Avatar
Domi
Bonjour à tous,

Question double !

1°) je voudrais appliquer un traitement (formatage) à la totalité de la
plage utilisée sur une feuille

Quel code utiliser pour sélectionner la plage comprise entre A1 et la
dernière cellule contenant une valeur dans une feuille (dernière ligne et
dernière colonne occupée !)

2°) je voudrais ensuite appliquer ce même traitement à l'ensemble des
feuilles du classeur

Là encore quelqu'un pourrait-il m'indiquer le code ?

Merci pour votre aide

Domi

9 réponses

Avatar
Daniel.C
Bonjour.
Esssaie :

Sub UneFeuille()
Dim Plage As Range, l As Long, Col As Integer
Col = Cells.Find("*", [A1], , , , xlPrevious).Column
l = Cells.Find("*", [A1], , , , xlPrevious).Row
Set Plage = Range([A1], Cells(l, Col))
MsgBox Range([A1], Cells(l, Col)).Address
'ton formatage de la plage
End Sub

Sub PlusieursFeuuilles()
Dim Plage As Range, l As Long, Col As Integer, Sh As Worksheet
For Each Sh In Worksheets
With Sh
Col = .Cells.Find("*", .[A1], , , , xlPrevious).Column
l = .Cells.Find("*", .[A1], , , , xlPrevious).Row
Set Plage = Range(.[A1], .Cells(l, Col))
MsgBox Range([A1], Cells(l, Col)).Address
'ton formatage de la plage
End With
Next Sh
End Sub

Cordialement.
Daniel


Bonjour à tous,

Question double !

1°) je voudrais appliquer un traitement (formatage) à la totalité de la plage
utilisée sur une feuille

Quel code utiliser pour sélectionner la plage comprise entre A1 et la
dernière cellule contenant une valeur dans une feuille (dernière ligne et
dernière colonne occupée !)

2°) je voudrais ensuite appliquer ce même traitement à l'ensemble des
feuilles du classeur

Là encore quelqu'un pourrait-il m'indiquer le code ?

Merci pour votre aide

Domi


Avatar
FFO
Salut à toi

essaies ceci :

Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....

Pour toutes les feuilles :

For i = 1 to Sheets.Count
Sheets(i).Activate
Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....
Next

Celà devrait convenir

Dis moi !!!!!
Avatar
Daniel.C
Bonjour FFO
Il faut se méfier de xlCellTypeLastCell. Une cellule effacée ou vide
mais formatée peut fausser le résultat.
Cordialement.
Daniel

Salut à toi

essaies ceci :

Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....

Pour toutes les feuilles :

For i = 1 to Sheets.Count
Sheets(i).Activate
Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....
Next

Celà devrait convenir

Dis moi !!!!!


Avatar
michdenis
Bonjour Daniel,

Si tu permets, j'aimerais ajouter un petit détail à ta présentation.

A ) Quelle la dernière cellule recherchée dans la feuille ?
1 - Celle qui contient une donnée (valeur) ?
2 - Celle qui contient une formule ?
Dans ce dernier cas (formule), il arrive que certaines formules
retourne "" et non pas une valeur. Il faut porter une attention
particulière au paramètre LookIn de la méthode "Find".

Si on désire trouver la dernière cellule occupée soit par une formule
ou par une valeur, LookIn:=XlFormulas , si on désire trouver la dernière
cellule occupée par une Valeur, LookIn:=XlValues

B ) Le paramètre "SearchOrder" doit aussi être renseigner. Certains tableaux
n'ont pas nécessairement la forme rectangulaire ou la dernière colonne
ou ligne ne contient pas nécessairement des données dans chacune des
cellules de la plage... Fais quelques tests, tu verras !

C ) Si on fait une boucle sur plusieurs feuilles, tu as déjà testé ces lignes
d'erreur, si la feuille est vierge, une erreur de type 91 est retournée,
il est prudent d'utiliser le "On error resume next" en début de boucle.

Le temps me presse .... à plus tard !

Pour trouver la dernière ligne :
with worksheets("Feuil1")
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End with

Pour trouver la dernière colonne :
With Worksheets("Feuil1")
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
End with
Avatar
Daniel.C
Bonjour Denis.

A. On demande la dernière valeur sans préciser s'il s'agit d'une
constante ou d'une formule.
B. Honte à moi. Je rectifie :

Col = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).Column
l = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Set Plage = Range([A1], Cells(l, Col))
MsgBox Range([A1], Cells(l, Col)).Address
'ton formatage de la plage

Les mêmes modifs doivent être repportées dans l'autre macro.

C. Non, je n'ai pas écrit de routine d'erreur, le demandeur peut bien
bosser un peu. Il a écrit "toutes les feuilles" ;-)))

PS. Je n'ai pas non plus resetté les éventuels options ayant pu être
codées dans un précédent Find.
Merci pour tes remarques.
Daniel

Bonjour Daniel,

Si tu permets, j'aimerais ajouter un petit détail à ta présentation.

A ) Quelle la dernière cellule recherchée dans la feuille ?
1 - Celle qui contient une donnée (valeur) ?
2 - Celle qui contient une formule ?
Dans ce dernier cas (formule), il arrive que certaines formules
retourne "" et non pas une valeur. Il faut porter une attention
particulière au paramètre LookIn de la méthode "Find".

Si on désire trouver la dernière cellule occupée soit par une formule
ou par une valeur, LookIn:=XlFormulas , si on désire trouver la dernière
cellule occupée par une Valeur, LookIn:=XlValues

B ) Le paramètre "SearchOrder" doit aussi être renseigner. Certains tableaux
n'ont pas nécessairement la forme rectangulaire ou la dernière colonne
ou ligne ne contient pas nécessairement des données dans chacune des
cellules de la plage... Fais quelques tests, tu verras !

C ) Si on fait une boucle sur plusieurs feuilles, tu as déjà testé ces lignes
d'erreur, si la feuille est vierge, une erreur de type 91 est retournée,
il est prudent d'utiliser le "On error resume next" en début de boucle.

Le temps me presse .... à plus tard !

Pour trouver la dernière ligne :
with worksheets("Feuil1")
DerLig = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
End with

Pour trouver la dernière colonne :
With Worksheets("Feuil1")
DerCol = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
End with


Avatar
FFO
Bonjours michdenis

Je partage entièrement ta remarque ayant été mainte fois en proie ave c
cette particularité
Toutefois il ne sagit que de formater une sélection
Et une suppression des colonnes et lignes ayant ce type de cellules
avec enregistrement du fichier résoud la difficulté
C'est même conseillé pour éviter un embonpoint du document

A notre interlocuteur de statuer
Avatar
Domi
Merci pour la réponse,
quelques précisions :
La dernière cellule peut effectivement contenir une données en dur ou une
formule...
Il n 'y aura pas de feuille vide
Il y a des lignes et des colonnes entierement vides.

Domi

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

Bonjour FFO
Il faut se méfier de xlCellTypeLastCell. Une cellule effacée ou vide mais
formatée peut fausser le résultat.
Cordialement.
Daniel

Salut à toi

essaies ceci :

Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....

Pour toutes les feuilles :

For i = 1 to Sheets.Count
Sheets(i).Activate
Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....
Next

Celà devrait convenir

Dis moi !!!!!






Avatar
michdenis
La réponse t'a été donnée sur ce fil !




"Domi" a écrit dans le message de groupe de discussion :

Merci pour la réponse,
quelques précisions :
La dernière cellule peut effectivement contenir une données en dur ou une
formule...
Il n 'y aura pas de feuille vide
Il y a des lignes et des colonnes entierement vides.

Domi

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

Bonjour FFO
Il faut se méfier de xlCellTypeLastCell. Une cellule effacée ou vide mais
formatée peut fausser le résultat.
Cordialement.
Daniel

Salut à toi

essaies ceci :

Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....

Pour toutes les feuilles :

For i = 1 to Sheets.Count
Sheets(i).Activate
Range("A1", Range("A1").SpecialCells
(xlCellTypeLastCell).Address).Activate
Traitement Format.....
Next

Celà devrait convenir

Dis moi !!!!!






Avatar
lesage69
Le mercredi 09 Décembre 2009 à 13:03 par Domi :
Bonjour à tous,
Question double !
1°) je voudrais appliquer un traitement (formatage) à la
totalité de la
plage utilisée sur une feuille
Quel code utiliser pour sélectionner la plage comprise entre A1 et
la
dernière cellule contenant une valeur dans une feuille (dernière
ligne et
dernière colonne occupée !)
2°) je voudrais ensuite appliquer ce même traitement à
l'ensemble des
feuilles du classeur
Là encore quelqu'un pourrait-il m'indiquer le code ?
Merci pour votre aide
Domi
Bonjour à toutes et tous !
C'est un vieux sujet, mais pour ceux qui seraient intéressés par une solution simple et universelle (parce-que, sans vouloir blesser personne, tout ce qui est proposé ici est... comment dire... pour le moins alambiqué) :
Edit : Désolé pour l'absence d'indentation, c'est l'éditeur du forum qui supprime les tabulations...
Si les développeurs voulaient bien penser que les espaces sont parfois utiles ;)
VERSION BASIQUE :
Sub EffacerPlagesUtilisees()
Dim shtFeuille As Worksheet
For Each shtFeuille In ThisWorkbook.Worksheets ' Pour chaque feuille de calcul de ce classeur
With shtFeuille
.UsedRange.ClearContents ' Effacer le contenu de la plage utilisée
.Range("A1").Select ' Sélectionner la cellule A1
End With
Next
End Sub
VERSION AVEC CHOIX DU CLASSEUR
Sub EffacerPlagesUtilisees(Optional ByVal Classeur As Workbook)
Dim wbkClasseur As Workbook
Dim shtFeuille As Worksheet
' Si un classeur est passé en paramètre, s'applique à celui-ci, sinon à celui dans lequel s'exécute le code
Set wbkClasseur = IIf(Classeur Is Nothing, ThisWorkbook, Classeur)
For Each shtFeuille In wbkClasseur.Worksheets ' Pour chaque feuille de calcul du classeur
With shtFeuille
.UsedRange.ClearContents ' Effacer le contenu de la plage utilisée
.Range("A1").Select ' Sélectionner la cellule A1
End With
Next
End Sub
Et pour l'appeler :
Sub RazFeuilles()
' Effacer les plages utilisées de toutes les feuilles du classeur où s'exécute le code :
EffacerPlagesUtilisees
' Effacer les plages utilisées de toutes les feuilles du classeur Toto.xlsx
EffacerPlagesUtilisees Workbooks("Toto.xlsx")
End Sub
VERSION AVEC CHOIX DU CLASSEUR ET DES FEUILLES
Sub EffacerPlagesUtilisees(Optional ByVal Classeur As Workbook, _
Optional ByVal ListeFeuilles As String, _
Optional ByVal Separateur As String = ";")
Dim wbkClasseur As Workbook
Dim strFeuilles As String
Dim varFeuille As Variant
Dim shtFeuille As Worksheet
' Si un classeur est passé en paramètre, s'applique à celui-ci, sinon à celui dans lequel s'exécute le code
Set wbkClasseur = IIf(Classeur Is Nothing, ThisWorkbook, Classeur)
strFeuilles = Trim(feuilles) ' Pour éliminer les erreurs dues au chaînes vides
If strFeuille <> "" Then
For Each varFeuille In Split(ListeFeuilles, Separateur) ' Pour chaque feuille de calcul passée en paramètre
Set shtFeuille = wbkClasseur.Worksheets(varFeuille)
GoSub Traitement
Next
Else
For Each shtFeuille In wbkClasseur.Worksheets ' Pour chaque feuille de calcul du classeur
GoSub Traitement
Next
End If
Exit Sub
Traitement:
With shtFeuille
.UsedRange.ClearContents ' Effacer le contenu de la plage utilisée
.Range("A1").Select ' Sélectionner la cellule A1
End With
Return
End Sub
Et pour l'appeler :
Sub RazFeuilles()
' Effacer les plages utilisées de toutes les feuilles du classeur où s'exécute le code :
EffacerPlagesUtilisees
' Effacer les plages utilisées de toutes les feuilles du classeur Toto.xlsx :
EffacerPlagesUtilisees Workbooks("Toto.xlsx")
' Effacer les plages utilisées d'une liste de feuilles du classeur Toto.xlsx :
EffacerPlagesUtilisees Workbooks("Toto.xlsx"), "Feuil1;Feuil3"
' Effacer les plages utilisées d'une liste de feuilles du classeur où s'exécute le code :
EffacerPlagesUtilisees , "Feuil1;Feuil3"
End Sub
Voilà.
Eric CHEVRON - http://www.developpez.com/user/profil/336343/Le-Sage