FAQ Excel
FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
- Que représentent les objets Range et Cells ?
- Comment fonctionnent les références Excel ?
- Comment décaler une plage ?
- Comment redimensionner une plage ?
- Que représente l'objet Area ?
- Quelles différences entre UsedRange et CurrentRegion ?
- Comment sélectionner les cellules d'une colonne ?
- Peut-on récupérer une plage de cellules contenant les cellules en erreurs ?
- Comment savoir si une plage fait référence à une cellule ou à plusieurs, voire à plusieurs plages ?
- Comment récupérer la plage filtrée par AutoFilter ?
- Comment demander à l'utilisateur de sélectionner une plage de cellule ?
- Comment gérer les encadrements par le code ?
- Comment vérifier si une cellule appartient à une plage ?
- Comment définir un objet Range contenant les cellules qui ne sont pas à l'intersection entre deux plages ?
- Comment répéter la même donnée dans toutes les cellules sélectionnées ?
- Comment sélectionner les cellules vides d'une plage ?
- Comment créer un tableau d'une dimension à partir de cellules discontinues ?
- Comment se déplacer rapidement vers la fin d'une plage de cellules ?
Toute la difficulté de la programmation Excel se retrouve dans ces concepts. Il n'existe pas d'objet Cell. Cells donne accès à une collection de cellules représentant les cellules de tout objet contenant une ou plusieurs cellules. L'objet Range représente un ensemble de cellules. Il peut en contenir une ou plusieurs, contiguës ou non. De ce fait un objet Range peut contenir plusieurs objets Range. De nombreuses propriétés / méthodes de l'objet Range renvoient un Objet Range. Un objet Range contient toujours une collection Cells. La plupart des Q/R de cette FAQ portent sur la manipulation des objets Range .
Excel gère deux systèmes de références. La notation A1 est telle que les lignes sont représentées par des nombres croissants, du haut vers le bas, et les colonnes par des lettres croissantes, de gauche à droite. La notation L1C1 est telle que les lignes sont des nombres précédés de 'L' et les colonnes des nombres précédés de 'C'. Utiliser l'un ou l'autre de ces systèmes ne change rien. Il faut juste utiliser le même que celui dans lequel Excel est. C'est pour cela que généralement on force le mode d'Excel par le code. Quelle que soit le type de référence, Excel gère aussi une notation absolue et une notation relative. Celle-ci peut être différente pour les lignes et les colonnes.
Lien : Tutoriel sur les références absolues et relatives (pierre.fauconnier)
On utilise généralement la méthode OffSet Ainsi :
Range
(
"A1:C1"
).Offset
(
1
, 1
)
Renvoie la plage (Range) "B2:D2".
Dans certains cas particuliers, on peut utiliser les méthodes Next ou Previous pour
décaler vers des cellules adjacentes.
Par exemple :
MsgBox
Range
(
"A1"
).Next.Address
(
True
, True
, xlA1, False
)
Renvoie $B$1
On utilise la méthode Resize pour redimensionner une plage quand on connaît le nombre de lignes et de colonnes de la nouvelle plage.
MsgBox
Range
(
"A1"
).Resize
(
3
, 2
).Address
(
True
, True
, xlA1)
Renvoie $A$1:$B$3.
Notons que comme dans le cas de Offset, l'objet renvoyé est un Range. Il est donc possible de combiner plusieurs de ces ordres.
Range
(
"A1"
).Resize
(
3
, 2
).Offset
(
,1
).ClearContents
L'objet Area n'existe pas. Il existe une collection Areas qui renvoie l'ensemble des plages continues d'un objet Range. En lui-même, tout objet Range possède au moins un élément dans sa collection Areas, qui peut être lui même si Range est une plage continue. En général, on énumère la collection.
Dim
objRange As
Range
For
Each
objRange In
Range
(
"A3:A12,D10:E21,I1:I16"
).Areas
objRange.Merge
False
Next
UsedRange est la plage des cellules utilisées dans une feuille. CurrentRegion est la plage rectangulaire de cellules non vides qui entourent l'objet Range sur lequel on fait l'appel de CurrentRegion. CurrentRegion doit être utilisé avec précaution car il a parfois un comportement piégeux. Imaginons qu'il existe un tableau rempli en A1:C3 et que toutes les autres cellules soit vides, alors
MsgBox
Cells
(
2
, 4
).CurrentRegion.Address
(
True
, True
, xlR1C1)
Renvoie R1C1:R3C4
Plusieurs cas:
Sélectionner toute la colonne
Range
(
"A1"
).EntireColumn.Select
Sélectionner les cellules non vides de la colonne
Range
(
"A1"
).EntireColumn.SpecialCells
(
xlCellTypeConstants).Select
Attention, si vous voulez compter dans les cellules non vides, celles qui contiennent une formule il faut
Application.Union
(
Range
(
"A1"
).EntireColumn.SpecialCells
(
xlCellTypeConstants), Range
(
"A1"
).EntireColumn.SpecialCells
(
xlCellTypeFormulas)).Select
Sélectionner une plage de valeurs continues
Range
(
"A1"
, Range
(
"A1"
).End
(
xlDown)).Select
Sélectionner de la première à la dernière cellule non vide en prenant les cellules vides incluses
Range
(
"A1"
, Range
(
"A1"
).EntireColumn.Find
(
What:=
"*"
, SearchDirection:=
xlPrevious)).Select
C'est assez simple :
Dim
objWorksheet As
Worksheet, objRange As
Range
Set
objWorksheet =
ThisWorkbook.Worksheets
(
1
)
Set
objRange =
objWorksheet.UsedRange.SpecialCells
(
xlCellTypeFormulas, xlErrors)
C'est assez logique puisque seules les cellules contenant une formules peuvent être en erreur.
Il faut utiliser la propriété Count des collections visées. C'est la collection Cells pour le nombres de cellules, Areas pour le nombre de plages. Un code Exemple pourrait être.
Dim
Msg As
String
, objRange As
Range
With
ThisWorkbook.Worksheets
(
1
).Range
(
"A3:A11,D7:E14,G1:G4,I15:J23,C22:F22"
)
Msg =
"La plage contient "
&
.Cells.Count
&
" cellules dans "
&
.Areas.Count
&
" plages continues"
&
vbCrLf
For
Each
objRange In
.Areas
Msg =
Msg &
"La plage "
&
objRange.AddressLocal
(
False
, False
, xlA1) &
" contient "
&
objRange.Cells.Count
&
" cellules"
&
vbCrLf
Next
End
With
MsgBox
Msg
Excel masque les lignes ne répondant pas au filtre, il suffit donc de récupérer la plage des cellules visibles.
Range
(
"A2:C21"
).AutoFilter
Field:=
1
, Criteria1:=
">10"
,
Range
(
"A2:C21"
).SpecialCells
(
xlCellTypeVisible).Copy
Destination:=
Range
(
"A24"
)
Vous connaissez surement la fonction InputBox, mais connaissez-vous la méthode InputBox de l'objet Application ?
Pour tous les détails sur cette méthode, reportez-vous à l'aide en ligne de VBA Excel, mais voici un exemple pour générer
une boite de dialogue qui attend une cellule ou un groupe de cellules :
Dim
P As
Range
On
Error
Resume
Next
Set
P =
Application.InputBox
(
"Sélectionnez une cellule ou une plage :"
, Type
:=
8
)
On
Error
GoTo
0
If
P Is
Nothing
Then
MsgBox
"Sélection annulée"
Pour information, les autre types disponibles pour la méthode InputBox :
0 : Formule
1 : Nombre
2 : String
4 : Booléen
8 : Range
16 : Erreur
64 : Tableau
Il existe deux approches. On veut encadrer le contour externe de la plage, on utilise BordersAround.
objRange.BorderAround
xlContinuous, xlMedium, xlColorIndexAutomatic
On souhaite mettre des bordures particulières, on passe par l'élément de la collection Borders :
Dim
objWorksheet As
Worksheet, objRange As
Range
Set
objWorksheet =
ThisWorkbook.ActiveSheet
Set
objRange =
objWorksheet.Range
(
objWorksheet.Cells
(
1
, 1
), objWorksheet.Cells
(
10
, 10
))
With
objRange.Borders
With
.Item
(
xlInsideHorizontal)
.ColorIndex
=
5
.LineStyle
=
xlContinuous
.Weight
=
xlThin
End
With
End
With
On veut tout encadrer :
With
objRange.Borders
.ColorIndex
=
5
.LineStyle
=
xlContinuous
.Weight
=
xlThin
End
With
Utilisez la méthode Intersect :
Sub
Test
(
)
VerifIntersection Range
(
"A1"
)
VerifIntersection Range
(
"B10"
)
End
Sub
Sub
VerifIntersection
(
Cellule As
Range)
Dim
Plage As
Range
'Définit la plage de référence
Set
Plage =
Range
(
"A5:B15"
)
If
Not
Intersect
(
Plage, Cellule) Is
Nothing
Then
MsgBox
Cellule.Address
&
" appartient à la plage "
&
Plage.Address
Else
MsgBox
Cellule.Address
&
" n'appartient pas à la plage "
&
Plage.Address
End
If
End
Sub
Les méthodes Union et Intersect renvoient la fusion ou l'intersection de deux objets Range.
La procédure suivante renvoie un objet Range inverse (contenant les cellules qui sont différentes entre deux plages).
Dim
A As
Range, B As
Range, C As
Range
Dim
Cell As
Range, Commun As
Range, PlageResultat As
Range
Set
A =
Range
(
"A1:A10"
)
Set
B =
Range
(
"A7:A15"
)
Set
Commun =
Application.Intersect
(
A, B)
For
Each
Cell In
Union
(
A, B)
If
Intersect
(
Cell, Commun) Is
Nothing
Then
If
PlageResultat Is
Nothing
Then
Set
PlageResultat =
Cell
Else
Set
PlageResultat =
Union
(
PlageResultat, Cell)
End
If
End
If
Next
Cell
MsgBox
PlageResultat.Address
Sélectionnez la plage de cellule.
Saisissez la donnée à recopier.
Pour valider, utilisez simultanément les touches clavier Ctrl+Entrée.
Le texte saisi apparaît dans chaque cellule de la sélection.
Il est bien sûr possible de saisir une formule dans plusieurs cellules en même temps,
en procédant de la même valeur pour la validation. Notez toutefois que la formule doit
être rédigée par rapport à la cellule active
En VBA :
Pour une donnée
Range
(
"B4:d4"
).Value
=
"Bonjour"
Et pour une formule avec références relatives, il faut tenir compte de la cellule
du coin supérieur gauche de la plage pour la création des références :
Range
(
"B4:d4"
).Formula
=
"=b3"
placera les formules "=b3", "=c3", "=d3" respectivement en B4, C4 et D4
Dans les versions antérieures d'Excel,
Sélectionnez la plage de cellules.
Menu 'Edition'
Bouton 'Atteindre'
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Cellules vides'
Dans Excel 2007,
Onglet Accueil
Groupe Edition
Cliquez sur la commande 'Rechercher et sélectionner'
Bouton 'Atteindre'
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Cellules vides'
La procédure crée un tableau d'une dimension, à partir des données passées
dans la fonction.
Une fonction qui retourne un tableau doit impérativement être déclarée en type Variant.
Function
CreationTableau
(
ParamArray Cellules1
(
)) As
Variant
'Adapté de :
'http://support.microsoft.com/?kbid=213403
'
Dim
VarTab
(
) As
Variant
Dim
Temp As
Variant
Dim
i As
Integer
Dim
w As
Integer
, X As
Integer
, y As
Integer
, z As
Integer
i =
1
'Boucle sur les éléments du tableau de paramètres.
For
X =
0
To
UBound
(
Cellules1)
If
TypeName
(
Cellules1
(
X)) =
"Range"
Then
Set
Temp =
Cellules1
(
X)
'Vérifie si le paramètre passé à la fonction est une cellule simple
'ou une plage.
If
IsArray
(
Temp) Then
'Intègre chaque cellule de la plage dansle tableau.
For
y =
1
To
UBound
(
Temp.Value
)
For
z =
1
To
UBound
(
Temp.Value
, 2
)
'Permet de filtrer les cellules vides.
'If Not IsEmpty(Temp(y, z).Value) Then
ReDim
Preserve
VarTab
(
1
To
i)
VarTab
(
i) =
Temp
(
y, z).Value
i =
i +
1
'End If
Next
z
Next
y
Else
'Permet de filtrer les cellules vides.
'If Not IsEmpty(Temp) Then
'Intègre la cellule dans le tableau.
ReDim
Preserve
VarTab
(
1
To
i)
VarTab
(
i) =
Temp
i =
i +
1
'End If
End
If
Else
ReDim
Preserve
VarTab
(
1
To
i)
VarTab
(
i) =
Cellules1
(
X)
i =
i +
1
End
If
Next
X
CreationTableau =
VarTab
End
Function
Vous pouvez indiquer des cellules uniques (E1), des plages (A1:A10, C1:C10) ou des données (80) lorsque vous appelez la fonction :
Sub
Test
(
)
Dim
Tb As
Variant
, xTab As
Variant
Tb =
CreationTableau
(
Range
(
"A1:A10"
), Range
(
"C1:C10"
), Range
(
"E1"
), 80
)
'--- Vérifie si le tableau est vide ---
On
Error
Resume
Next
'xTab va prendre la valeur Empty si le tableau est vide.
xTab =
UBound
(
Tb)
On
Error
GoTo
0
'Renvoie le nombre d'éléments du tableau
If
Not
IsEmpty
(
xTab) Then
MsgBox
UBound
(
Tb)
End
Sub
Sélectionnez une cellule dans votre tableau.
Positionnez la souris sur un des bords de la cellule active, en fonction de la zone que vous désirez atteindre.
Bord droit --> atteindre dernière colonne du tableau
Bord gauche --> atteindre la première colonne du tableau
Bord inférieur --> atteindre la dernière ligne du tableau
Bord supérieur --> atteindre la première ligne du tableau
Ensuite, double-cliquez sur le bord de la cellule.
La cellule active va se déplacer jusqu'au bord du tableau (dans la limite des cellules contigües non vides).