FAQ Excel
FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
- A quoi correspond la notation [A1] ?
- Peut on cacher les valeurs nulles sans écrire de formules ?
- Comment protéger une plage de cellules dans la feuille ?
- Comment gérer les erreurs dans les cellules ?
- Pourquoi passer par un tableau pour manipuler des plages de valeurs ?
- Comment fonctionnent les recopies de cellules ?
- Comment effacer une plage de cellules mais pas les formules qu'elle contient ?
- Comment définir un nombre maxi de caractères à saisir dans les cellules ?
- Comment limiter les saisies par le code ?
- Comment protéger les cellules qui contiennent des formules ?
- Comment retrouver les numéros des dernières lignes et dernières colonnes renseignées dans une feuille ?
- Comment transposer des colonnes en lignes ?
- Comment séparer les mots d'une phrase saisie dans une cellule ?
- Comment positionner une cellule dans le coin supérieur gauche de l'application ?
- Comment retrouver les cellules fusionnées ?
- Comment identifier les dépendants contenus sur d'autres feuilles ?
- Comment identifier rapidement la dernière cellule utilisée dans la feuille ?
- Comment faire clignoter une cellule ?
- Comment utiliser la bibliothèque DAO pour créer une requête SQL sur une plage de cellules ?
- Comment empêcher l'écriture dans une cellule ?
- Comment forcer la saisie en majuscules dans une cellule ?
- Comment identifier par macro la dernière cellule utilisée dans la feuille spécifiée ?
- Comment récupérer le nom de la feuille correspondant à la déclaration d'un objet Range ?
- Comment mettre un dégradé dans le fond d'une cellule ?
- Comment effectuer un retour à la ligne dans une cellule ?
- Comment supprimer tous les accents dans une chaîne de caractères ?
- Comment atteindre rapidement la cellule active si elle n'est plus visible ?
- Est t'il possible ajouter des listes de recopie personnalisées sous Excel 2007 ?
- 9.1. Les plages (18)
- 9.2. Les cellules et plages nommées (16)
- 9.3. Les commentaires (9)
- 9.4. Les listes de validation (7)
C'est un appel implicite à la méthode Evaluate. Il s'agit en fait d'un interpréteur (le même que celui qui interprète les formules Excel). On peut faire des utilisations très complexes de cette méthode.
Par exemple :
MaValeur =
Application.Evaluate
(
"LOG(A1*3+2)"
)
Cela peut s'écrire aussi :
MaValeur =
[LOG
(
A1*
3
+
2
)]
Notez qu'il n'y a pas de guillemets lorsqu'on utilise la notation crochets. L'interprétation des plages,
dans notre cas A1, demande que le système de référence soit homogène. Si ma feuille était en référence LC j'obtiendrais
une incompatibilité de type.
Il faut utiliser les formats de cellules.
objSheet.UsedRange.NumberFormat
=
"0;-0;;@"
Sélectionnez toutes les cellules de la feuille.
Effectuez un Clic droit.
Sélectionnez l'option "format de cellule" dans le menu contextuel.
Sélectionnez l'onglet Protection.
Décochez l'option "Verrouillée".
Cliquez sur le bouton OK pour valider.
Sous Excel 2007, cette opération peut également être effectuée directement depuis la feuille de calcul.
Après avoir sélectionné les cellules : Onglet Accueil dans le ruban / Menu "Format" dans le groupe
"cellules" / Cliquez sur l'option "Verrouiller la cellule".
Refaites la manipulation inverses pour reverrouiller.
Lorsque l'icône du cadenas est en surbrillance, cela signifie que la cellule est verrouillée.
Ensuite, sélectionnez uniquement la plage de cellules que vous souhaitez protéger.
Effectuez un Clic droit.
Sélectionnez l'option "format de celllule" dans le menu contextuel.
Sélectionnez l'onglet Protection.
Cochez l'option "verrouillée".
Cliquez sur le bouton OK pour valider.
Ensuite, utilisez le menu Outils /Protection / Protéger la feuille .
Assurez vous que l'option "protéger la feuille et le contenu des cellules verrouillées" est cochée.
Saisissez votre mot de passe (en option).
Cliquez sur le bouton OK pour valider.
Des erreurs peuvent parfois apparaître dans les formules de calcul.
L'erreur peut être la conséquence d'une saisie erronée, mais peut parfois aussi être inévitable: Exemple des formules dans un tableau
de bord prérempli et complété à chaque fin de mois. Les cellules contenant des formules pour les prochains mois peuvent logiquement
renvoyer une erreur car les données ne sont pas encore renseignées.
Excel dispose de plusieurs outils qui permettent d'identifier et gérer ces erreurs. Il est intéressant de connaître la signification les codes d'erreur, de cerner la cause et pouvoir ainsi trouver une solution corrective plus facilement.
Consultez l'article sur la gestion des erreurs.
Ce n'est pas toujours une nécessité, mais cela permet d'accélérer le code. Sur les grandes collections, il convient d'éviter l'énumération qui est très lente.
Comparez la rapidité d'exécution du code entre
Dim
ObjCell As
Range
For
Each
ObjCell In
Range
(
"A1:J65535"
).Cells
ObjCell.Value
=
ObjCell.Value
*
2
+
3
Next
et
Dim
Montab As
Variant
, cmpt1 As
Long
, cmpt2 As
Long
Montab =
Range
(
"A1:J65535"
).Value
For
cmpt1 =
LBound
(
Montab, 1
) To
UBound
(
Montab, 1
)
For
cmpt2 =
LBound
(
Montab, 2
) To
UBound
(
Montab, 2
)
Montab
(
cmpt1, cmpt2) =
Montab
(
cmpt1, cmpt2) *
2
+
3
Next
cmpt2
Next
cmpt1
Range
(
"A1:J65535"
).Value
=
Montab
Le deuxième code s'exécute environ 20 fois plus vite.
Il existe globalement deux types de recopies. La recopie incrémentée (AutoFill) et la non-incrémentée. Une recopie incrémentée consiste à recopier une plage en incrémentant une des propriétés suivantes
* xlFillDefault : laisse excel choisir l'incrément
* xlFillSeries : Recopie avec les paramètres de la série si ceux-ci existent
* xlFillCopy : Sans incrément (utilisez plutôt la méthode Fill)
* xlFillFormats : Recopie le format sans les valeurs
* xlFillValues : Utilise l'incrément par défaut, mais ne recopie pas les formules
* xlFillDays : Incrémente les jours
* xlFillWeekdays : Incrémente les noms de jours
* xlFillMonths : Incrémente les mois
* xlFillYears : Incrémente les années
* xlLinearTrend : Tendance linéaire
* xlGrowthTrend : Tendance géométrique
Evidemment la recopie doit pouvoir trouver la valeur de l'incrément, il faut donc que la source contiennent au moins deux cellules.
Range
(
"F29:F30"
).AutoFill
Destination:=
Range
(
"F29:F43"
), Type
:=
xlGrowthTrend
Cells
(
29
, 6
).Resize
(
2
).AutoFill
Destination:=
Cells
(
29
, 6
).Resize
(
10
), Type
:=
xlFillDefault
La recopie non incrémentée utilise une des méthodes Fill directionnelles: FillDown, FillUp, FillLeft, FillRight. Il faut que la cellule opposée au sens contienne une valeur ou une formule.
Cells
(
29
, 6
).Resize
(
10
).FillDown
Sélectionnez la plage de cellules.
Appuyez sur la touche F5 du clavier.
Cliquez sur le bouton "Cellules".
Sélectionnez "Constantes".
Cochez le ou les types de données à supprimer (texte, nombre ...).
Cliquez sur le bouton "Ok".
Les cellules correspondantes sont sélectionnées.
Vous pouvez alors appuyer sur la touche "Suppr" du clavier pour supprimer le contenu des cellules tout en conservant
les formules dans la plage initialement sélectionnée.
La même solution par macro :
Range
(
"A1:A10"
).SpecialCells
(
xlCellTypeConstants, 3
).ClearContents
Sélectionnez la ou les cellules à paramétrer.
Ensuite, utilisez le menu Données/Validation.
Sélectionnez l'onglet Options.
Dans le champ Autoriser :, sélectionnez la ligne "Longueur du texte".
Dans le champ Données :, sélectionnez la ligne "inférieure ou égale à".
Dans le champ Longueur :, précisez le nombre de caractères à autoriser dans les cellules sélectionnées.
Cliquez sur le bouton OK pour valider.
Désormais, un message d'alerte s'affiche lorsque vous saisissez un nombre de caractères supérieur à la valeur paramétrée.
On utilise les validations comme par le menu. L'exemple suivant restreint les valeurs saisissables de G1, entre 10 et 100
With
Range
(
"G1"
).Validation
.Add
Type
:=
xlValidateWholeNumber, AlertStyle:=
xlValidAlertStop, _
Operator:=
xlBetween, Formula1:=
"10"
, Formula2:=
"100"
.IgnoreBlank
=
True
.InCellDropdown
=
True
.ErrorMessage
=
"La valeur doit être comprise entre 10 et 100"
.ShowInput
=
True
.ShowError
=
True
End
With
Sans macro :
Sélectionnez toutes les cellules de la feuille
Clic droit dans la feuille
Format de cellule
Onglet Protection
Décochez l'option "Verrouillée"
Cliquez sur le bouton OK pour valider
Menu Edition
Atteindre
Cliquez sur le bouton 'Cellules'
Sélectionnez l'option 'Formules'
Cliquez sur le bouton OK pour valider
Clic droit dans la feuille (assurez vous que les cellules contenant des formules
sont toujours sélectionnées)
Format de cellule
Onglet Protection
Cochez l'option "Verrouillée"
Cliquez sur le bouton OK pour valider
Ensuite, protégez la feuille. Seules les formules seront protégées en écriture.
Nota :
Pour sélectionner les cellules contenant des formules 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 'Formules'
Par macro :
Sub
Test
(
)
ProtectionCellules_Formules Worksheets
(
"Feuil3"
), "DVP"
End
Sub
Sub
ProtectionCellules_Formules
(
Ws As
Worksheet, PassWord As
String
)
On
Error
Resume
Next
With
Ws
.Unprotect
PassWord 'Le mot de passe est en option
.Cells.Locked
=
False
.Cells.SpecialCells
(
xlCellTypeFormulas).Locked
=
True
.EnableSelection
=
xlUnlockedCells
.Protect
PassWord
End
With
End
Sub
Et si vous souhaitez déprotéger la feuille :
Sub
Deprotege
(
)
Worksheets
(
"Feuil3"
).Unprotect
"DVP"
End
Sub
UsedRange (premier exemple).
Cet exemple envoie le nombre de lignes renseignées dans la feuille, où qu'elles soient.
Si les lignes 1 à 10 et 17 à 19 sont vides, mais que les lignes 11 à 16 et 20 à 24 sont renseignées, le résultat est 11 (6 + 5).
Dim
NbLignes As
Integer
NbLignes =
ActiveSheet.UsedRange.Rows.Count
Nota :
Pensez à adapter le type de variable utilisé.
Dans l'exemple précédent, un message d'erreur (dépassement de capacité) survient si la procédure renvoie plus de 32 767 lignes.
UsedRange (2eme exemple).
Renvoie le numéro de la première ligne renseignée dans la feuille.
Dim
LaPremiereLigne As
Integer
LaPremiereLigne =
ActiveSheet.UsedRange.Row
CurrentRegion (premier exemple).
Cette propriété Définit une plage de toutes les cellules contiguës, délimitées par les premières lignes et colonnes vides.
Ici la procédure renvoie la dernière ligne de la Plage.
S'il n'y a pas de ligne vide dans la plage de données, que la cellule "Cel" se trouve dans la
plage de données, la macro renvoie la dernière ligne de la plage de données, non de la feuille.
Dim
DerniereLigne As
Integer
DerniereLigne =
Range
(
Cel).CurrentRegion.End
(
xlDown).Row
CurrentRegion (deuxième exemple).
Renvoie l'adresse de la plage des cellules contiguës :
Dim
strPlage As
String
strPlage =
Range
(
"A15"
).CurrentRegion.Address
(
False
, False
)
'Exemple : "A4:N25"
Range
(
Col 65536
).End
(
xlUp)
Renvoie la dernière ligne renseignée dans la colonne spécifiée.
Pour connaître le numéro de la dernière ligne absolue renseignée dans la colonne A, utilisez :
Dim
DerniereLigne As
Integer
DerniereLigne =
Range
(
"A65536"
).End
(
xlUp).Row
Range("A1").End(xlDown)
Renvoie le numéro de la dernière ligne, avant la première cellule vide, en descendant à partir de la cellule spécifiée.
Dim
DerniereLigne As
Integer
DerniereLigne =
Range
(
"A1"
).End
(
xlDown).Row
Un autre exemple qui renvoie le numéro de la dernière ligne, avant la première cellule vide de la colonne C, en partant de la cellule C15 :
Dim
DerniereLigne As
Integer
DerniereLigne =
Range
(
"C15"
).End
(
xlDown).Row
Range(...).SpecialCells(xlCellTypeLastCell)
Renvoie la dernière ligne absolue non vide dans la feuille.
Attention: Si des lignes sont supprimées dans la plage, enregistrez préalablement le fichier pour que la
procédure renvoie la réelle dernière ligne (idem pour les colonnes supprimées).
Dim
DerniereLigne As
Integer
DerniereLigne =
Range
(
"A1"
).SpecialCells
(
xlCellTypeLastCell).Row
Range(...).SpecialCells(xlCellTypeLastCell).Address
Renvoie l'adresse absolue de la dernière cellule renseignée dans la feuille :
Dim
AdresseAbsolue As
String
AdresseAbsolue =
Range
(
"A1"
).SpecialCells
(
xlCellTypeLastCell).Address
Le principe est identique pour les colonnes :
DerniereColonne =
ActiveSheet.UsedRange.Columns.Count
DernièreColonne =
Selection.CurrentRegion.End
(
xlToRight).Column
DerniereColonne =
Range
(
"A1"
).End
(
xlToRight).Column
DerniereColonne =
Range
(
"IV1"
).End
(
xlToLeft).Column
'où IV est la dernière colonne d'une feuille de calculs => 256)
DerniereColonne =
Range
(
"A1"
).SpecialCells
(
xlCellTypeLastCell).Column
Identifier des plages de cellules.
Toutes les combinaisons sont possibles.
Exemple :
Dim
strPlage As
String
strPlage =
Range
(
Cells
(
1
,1
), Cells
(
Range
(
"A65536"
).End
(
xlUp).Row
, _
Range
(
"IV1"
).End
(
xlToLeft).Column
)).Address
Ou en tant qu'objet, avec une instance :
Dim
objPlage As
Range
Set
objPlage =
Range
(
Cells
(
1
,1
), Cells
(
Range
(
"A65536"
).End
(
xlUp).Row
, _
Range
(
"IV1"
).End
(
xlToLeft).Column
))
Dim
strPlage As
String
srtPlage =
Range
(
"A1:"
&
Range
(
"A1"
).SpecialCells
(
xlCellTypeLastCell).Address
).Address
Pour sélectionner la plage, utilisez :
Range
(
"A1:"
&
Range
(
"A1"
).SpecialCells
(
xlCellTypeLastCell).Address
).select
Pour transformer une plage verticale de cellules sous forme de plage horizontale :
Sélectionnez votre tableau.
Effectuez un "Copier".
Sélectionnez ensuite une cellule vide sous le tableau.
Menu Edition/Collage spécial
Cochez l'option "Transposé" dans la boîte de dialogue.
Cliquez sur le bouton OK pour valider.
Chaque mot séparé par un espace sera inséré dans une cellule différente.
Sélectionnez la cellule ou la plage de données sources.
Utilisez le menu Données/Convertir.
Sélectionnez l'option "Largeur fixe".
Cliquez sur le bouton "Suivant".
A l'étape suivante, vous pouvez modifier manuellement la scission entre les données.
Cliquez sur le bouton "Suivant".
Paramétrez le type de données et la cellule de destination.
Cliquez sur le bouton "Terminer".
Vous pouvez aussi créer des formules pour extraire les mots contenu dans la cellule.
Si par exemple les données sont en A1, saisissez cette formule en B1, puis utilisez la poignée de recopie
vers la droite.
=SI
(COLONNE
()-1
>NBCAR
($A$1
)-NBCAR
(SUBSTITUE
($A$1
;" "
;""
));DROITE
($A$1
;NBCAR
($A$1
)-TROUVE
("^^"
;SUBSTITUE
($A$1
;" "
;"^^"
;NBCAR
($A$1
)-NBCAR
(SUBSTITUE
($A$1
;" "
;""
)))));SI
(COLONNE
()-1
=1
;STXT
($A$1
;1
;TROUVE
("^^"
;SUBSTITUE
($A$1
;" "
;"^^"
;1
))-1
);STXT
($A$1
;TROUVE
("^^"
;SUBSTITUE
($A$1
;" "
;"^^"
;COLONNE
()-1
-1
))+1
;TROUVE
("^^"
;SUBSTITUE
($A$1
;" "
;"^^"
;COLONNE
()-1
))-TROUVE
("^^"
;SUBSTITUE
($A$1
;" "
;"^^"
;COLONNE
()-1
-1
))-1
)))
Une autre solution par macro :
'Extrait les données séparées par un espace dans la cellule A1
Sub
extractionMots
(
)
Dim
Tableau
(
) As
String
Dim
i As
Integer
'découpe la chaine en fonction des espaces " "
'le résultat de la fonction Split est stocké dans un tableau
Tableau =
Split
(
Range
(
"A1"
), " "
)
'boucle sur le tableau pour visualiser le résultat
For
i =
0
To
UBound
(
Tableau)
'Le résultat s'affiche dans la premiere ligne, à
'partir de la cellule B1.
Range
(
"A1"
).Offset
(
0
, i +
1
) =
Tableau
(
i)
Next
i
End
Sub
Sub
Test
(
)
Deplace Range
(
"K20"
)
End
Sub
'Positionne la cellule spécifiée dans le coin supérieur gauche
'de l'application.
Sub
Deplace
(
Cellule As
Range)
Dim
Ligne As
Integer
, Colonne As
Integer
Ligne =
Cellule.Row
Colonne =
Cellule.Column
With
ActiveWindow
.ScrollRow
=
Ligne
.ScrollColumn
=
Colonne
End
With
End
Sub
Cet exemple applique une couleur jaune dans les cellules fusionnées de la feuille nommée Feuil1.
Sub
VisualiserCellulesFusionnees
(
)
Dim
Cell As
Range
'Boucle sur les cellules utilisées dans la feuille
For
Each
Cell In
Worksheets
(
"Feuil1"
).UsedRange.Cells
'Si la cellule est fusionnée
'Colorie en jaune si la cellule est fusionnée
If
Cell.MergeCells
Then
Cell.MergeArea.Interior.ColorIndex
=
6
Next
Cell
End
Sub
La propriété d'identification des dépendants fonctionne uniquement sur la feuille active et ne peut pas suivre les références
distantes (sur les autres feuilles).
La procédure suivante recherche les dépendants d'une cellule dans toutes les feuilles du classeur.
Nota :
Cet exemple ne gère pas les cellules et les plages nommées.
Option
Explicit
Sub
Test
(
)
'Liste les dépendants de la cellule D4, dans la Feuil2
ListeDependents Worksheets
(
"Feuil2"
).Range
(
"D4"
)
End
Sub
Sub
ListeDependents
(
Cellule As
Range)
Dim
Ws As
Worksheet
Dim
Plage As
Range, Cell As
Range, DirectDep As
Range
Dim
i As
Integer
, x As
Integer
Dim
Cible As
String
, strDepenDent As
String
, strRefer As
String
'La liste des dépendants va être stockée dans une collection
Dim
Un As
New
Collection
'Active la feuille contenant la cellule à contrôler
Cellule.Parent.Activate
strDepenDent =
Cellule.Parent.Name
&
"!"
&
Cellule.Address
(
0
, 0
)
'Vérifie s'il y a des dépendants directs dans la feuille :
On
Error
Resume
Next
'Définit la plage de cellules dépendantes, dans la feuille active
Set
Plage =
Cellule.DirectDependents.Cells
On
Error
GoTo
0
If
Not
Plage Is
Nothing
Then
'Boucle sur les dépendants contenus dans la feuille active
For
Each
DirectDep In
Cellule.DirectDependents.Cells
Un.Add
Cellule.Parent.Name
&
"!"
&
DirectDep.Address
, _
Cellule.Parent.Name
&
"!"
&
DirectDep.Address
Next
DirectDep
End
If
Set
Plage =
Nothing
'Boucle sur les autres feuilles du classeur :
For
Each
Ws In
ThisWorkbook.Worksheets
'Si la feuille est différente de la feuille active
If
Ws.Name
<>
Cellule.Parent.Name
Then
On
Error
Resume
Next
'Définit la plage de cellules contenant des formules
Set
Plage =
Ws.UsedRange.SpecialCells
(
xlCellTypeFormulas)
On
Error
GoTo
0
'Vérifie si la feuille contient des formules
If
Not
Plage Is
Nothing
Then
'Boucle sur les cellules contenant des formules
For
Each
Cell In
Plage
'Gestion des références relatives et absolues
Cible =
Replace
(
Cell.Formula
, "$"
, ""
)
'Vérifie si le nom de la feuille apparait dans la formule.
If
InStr
(
1
, Cible, Cellule.Parent.Name
) >
0
Then
'Vérifie si la formule contient une référence correspondant à la
'cellule à contrôler
i =
0
i =
InStr
(
1
, Cible, strDepenDent)
'Si la référence est trouvée on l'intègre dans la collection
If
i >
0
And
Not
IsNumeric
(
Mid
(
Cible, i +
Len
(
strDepenDent), 1
)) Then
Un.Add
Ws.Name
&
"!"
&
Cell.Address
, Ws.Name
&
"!"
&
Cell.Address
Else
'Recherche des références dans les plages de cellules
For
x =
1
To
Len
(
Cible)
i =
0
i =
InStr
(
1
, Cible, ":"
)
If
i >
0
Then
strRefer =
ExtractionReferences
(
Cible)
'Si la cellule à contrôler se trouve dans la plage,
'on l'intègre dans la collection.
If
VerifIntersect
(
Cellule, Range
(
strRefer)) And
_
InStr
(
1
, Cible, Cellule.Parent.Name
&
"!"
&
strRefer) >
0
Then
On
Error
Resume
Next
Un.Add
Ws.Name
&
"!"
&
Cell.Address
, Ws.Name
&
"!"
&
Cell.Address
On
Error
GoTo
0
Exit
For
End
If
Cible =
Mid
(
Cible, i +
1
)
Else
Exit
For
End
If
Next
x
'--------------
End
If
End
If
Next
Cell
End
If
End
If
Set
Plage =
Nothing
Next
Ws
'Boucle sur la collection qui contient la liste des dépendants
For
i =
1
To
Un.Count
'Affiche le résultat dans la fenêtre d'exécution (Ctrl+G)
Debug.Print
Un.Item
(
i)
Next
i
End
Sub
'Extrait les références spécifiées dans les formules
Function
ExtractionReferences
(
Chaine As
String
) As
String
Dim
i As
Integer
, j As
Integer
Dim
strPlage As
String
, Caract As
String
i =
InStr
(
1
, Chaine, ":"
)
'Renvoie la référence avant les deux points ":"
For
j =
i -
1
To
1
Step
-
1
Caract =
Mid
(
Chaine, j, 1
)
Select
Case
Asc
(
Caract)
Case
48
To
57
, 65
To
90
, 97
To
122
strPlage =
Caract &
strPlage
Case
Else
: Exit
For
End
Select
Next
j
strPlage =
strPlage &
":"
'Renvoie la référence après les deux points ":"
For
j =
i +
1
To
Len
(
Chaine)
Caract =
Mid
(
Chaine, j, 1
)
Select
Case
Asc
(
Caract)
Case
48
To
57
, 65
To
90
, 97
To
122
strPlage =
strPlage &
Caract
Case
Else
: Exit
For
End
Select
Next
j
ExtractionReferences =
strPlage
End
Function
'Vérifie si la référence extraite dans la formule a une intersection
'avec la cellule dont on contrôle les dépendances.
Function
VerifIntersect
(
objDepend As
Range, objReference As
Range) As
Boolean
Dim
objRange As
Range
Set
objRange =
Intersect
(
objDepend, objReference)
If
objRange Is
Nothing
Then
VerifIntersect =
False
Else
VerifIntersect =
True
End
If
End
Function
Utilisez simultanément sur les touches clavier Ctrl+Maj+Fin.
Vous remarquerez que la dernière cellule est parfois au-delà de la plage de données utilisée. Supprimer tous ces
lignes et colonnes, entre cette cellule et la plage de données utile, permet :
* De ne pas imprimer des pages vides supplémentaires.
* De libérer de l'espace mémoire et donc de diminuer sensiblement la taille de votre classeur.
Cet exemple renvoie alternativement Vrai/Faux dans la cellule A1, toutes les secondes.
' --- Dans le module objet du classeur :
Option
Explicit
'évènement ouverture du classeur.
Private
Sub
Workbook_Open
(
)
'Lance la procédure
GetTempo
End
Sub
'Avant la fermeture du classeur :
Private
Sub
Workbook_BeforeClose
(
Cancel As
Boolean
)
'Désactive la procédure de temporisation
Application.OnTime
EarliestTime:=
Now
, Procedure:=
"GetTempo"
, Schedule:=
False
End
Sub
' --- Dans un module standard :
Option
Explicit
Dim
vTempo As
Boolean
Sub
GetTempo
(
)
vTempo =
Not
vTempo
Application.OnTime
Now
+
TimeValue
(
"00:00:01"
), "GetTempo"
[Feuil1!A1] =
vTempo
End
Sub
Vous devez activer la référence Microsoft DA0 3.6 Object Library pour
utiliser la bibliothèque DAO :
Dans l'éditeur de macros,
Menu Outils
Références
Cochez la ligne "Microsoft DA0 3.6 Object Library".
Cliquez sur le bouton OK pour valider.
Sub
DoCmdRunSQL
(
ByVal
sql As
String
, ByVal
rDest As
Range)
Dim
db As
DAO.Database
Dim
rs As
DAO.Recordset
Set
db =
DAO.OpenDatabase
(
ActiveWorkbook.FullName
, False
, False
, "Excel 8.0;HDR=YES;"
)
Set
rs =
db.OpenRecordset
(
sql, DAO.dbOpenSnapshot
)
rDest.CopyFromRecordset
rs
Set
rs =
Nothing
Set
db =
Nothing
End
Sub
Un exemple d'appel de la procédure :
DoCmdRunSQL "SELECT * FROM [feuil1$A3:D600] WHERE age > 18"
, sheets
(
"Résultat"
).range
(
"A1"
)
La table s'écrit [NomOnglet$PlageCellules].
Dans cet exemple, le résultat de la requête est affiché dans la cellule A1 de la feuille "Résultat".
Sélectionner la (les) cellule(s).
Menu Données.
Validation
Dans la liste déroulante "Autoriser:", choisissez "Personnaliser".
Dans le champ "Formule:", saisissez =""
Cliquez sur le bouton OK pour valider.
Nota :
Dans Excel 2007, le menu validation est accessible depuis l'onglet "Données" dans le ruban. Ensuite cliquez sur le bouton
"Validation de données" dans le groupe "Outils de données".
Vous pouvez utiliser la fonction validation de données pour forcer la saisie de majuscules :
Menu Données.
Validation.
Cliquez sur l'onglet 'Options'.
Sélectionnez 'Personnalisé' dans le menu déroulant 'Autoriser'.
Dans le champ 'Formule', saisissez :
=EXACT
(A1
;MAJUSCULE
(A1
))
Cliquez sur le bouton OK pour valider.
Si vous désirez également empêcher la saisie de valeurs numériques, ajoutez :
=ET
(EXACT
(A1
;MAJUSCULE
(A1
));ESTTEXTE
(A1
))
Sub
Test
(
)
Dim
Cible As
Range
'Effectue la recherche dans la feuille active
Set
Cible =
DerniereCellule
(
ActiveSheet)
If
Not
Cible Is
Nothing
Then
MsgBox
Cible.Address
&
vbCrLf
&
Cible.Value
Else
MsgBox
"La feuille est vide."
End
If
End
Sub
Function
DerniereCellule
(
Ws As
Worksheet) As
Range
Dim
NumLigne As
Double
, NumCol As
Integer
'Vérification si la feuille est totalement vide
If
Ws.UsedRange.Cells.Address
=
"$A$1"
And
_
IsEmpty
(
Ws.Range
(
"A1"
)) Then
Exit
Function
With
Ws
'Identifie le numéro de ligne
NumLigne =
.Cells.Find
(
"*"
, .Range
(
"A1"
), , , xlByRows, xlPrevious).Row
'Identfie le numéro de colonne
NumCol =
.Cells.Find
(
"*"
, .Range
(
"A1"
), , , xlByColumns, xlPrevious).Column
Set
DerniereCellule =
.Cells
(
NumLigne, NumCol)
End
With
End
Function
Dim
Plage1 As
Range
Set
Plage1 =
Range
(
"A1"
).CurrentRegion
MsgBox
Plage1.Parent.Name
&
"!"
&
Plage1.Address
Remarque :
Parent renvoie Object, donc vous perdez l'intellisense et vous passez en liaison tardive.
Privilégiez l'utilisation de Worksheet qui renvoie un objet Worksheet. Donc vous gardez l'intellisense et en cas de pilotage vous restez en liaison précoce :
Dim
Plage1 As
Range
Set
Plage1 =
Range
(
"A1"
).CurrentRegion
MsgBox
Plage1.Worksheet.Name
&
"!"
&
Plage1.Address
Voici un petit code très simple qui permet de mettre un dégradé dans le fond d'une cellule. La macro se charge de créer
le rectangle aux bonnes dimensions et d'afficher le texte de la cellule en dessous en respectant la mise en forme.
La procédure gère plusieurs cellules d'une sélection et respecte la couleur de base de la cellule dans le dégradé, gère aussi les
cellules fusionnées.
Sub
Degrade
(
)
Dim
strAddr As
String
, strAddrRC As
String
Dim
cell As
Range, c As
Range
For
Each
cell In
Selection.Cells
If
cell.MergeCells
Then
'cellule fusionnée
If
cell.Address
=
cell.MergeArea.Cells
(
1
).Address
Then
Set
c =
cell.MergeArea
Else
' cas où le cadre a déjà été tracé
GoTo
nextCell
End
If
Else
Set
c =
cell
End
If
strAddrRC =
c.Address
(
True
, True
, xlR1C1, False
)
strAddr =
c.Address
(
False
, False
, xlA1, False
)
With
c
ActiveSheet.Shapes.AddShape
(
msoShapeRectangle, .Left
, .Top
, .Width
, .Height
).Select
End
With
' dégradé
Selection.ShapeRange.Line.Visible
=
msoFalse
Selection.ShapeRange.Fill.Visible
=
msoTrue
Selection.ShapeRange.Fill.ForeColor.RGB
=
Range
(
strAddr).Cells
(
1
).Interior.Color
Selection.ShapeRange.Fill.OneColorGradient
msoGradientHorizontal, 1
, 0
.39
' texte
ExecuteExcel4Macro "FORMULA(""="
&
strAddrRC &
""")"
' alignement
On
Error
Resume
Next
With
Selection
If
IsNumeric
(
c.Value
) Then
.HorizontalAlignment
=
xlRight
Else
.HorizontalAlignment
=
c.HorizontalAlignment
End
If
.VerticalAlignment
=
c.VerticalAlignment
.ReadingOrder
=
c.ReadingOrder
.Orientation
=
c.Orientation
.AutoSize
=
False
With
.Font
.Name
=
c.Font.Name
.Size
=
c.Font.Size
.ColorIndex
=
c.Font.ColorIndex
.Underline
=
c.Font.Underline
.Italic
=
c.Font.Italic
.Bold
=
c.Font.Bold
End
With
End
With
On
Error
GoTo
0
nextCell
:
Next
cell
Set
c =
Nothing
Set
cell =
Nothing
End
Sub
Utilisez la combinaison des touches clavier Alt et Entrée.
Private
Function
EnleveAccents
(
ByVal
Chaîne As
String
) As
String
Dim
compteur As
Long
, CarLu As
String
, ValRet As
Integer
For
compteur =
1
To
Len
(
Chaîne)
CarLu =
Mid
(
Chaîne, compteur, 1
)
ValRet =
Asc
(
CarLu)
Select
Case
ValRet
Case
192
To
197
: ValRet =
65
Case
200
To
203
: ValRet =
69
Case
204
To
207
: ValRet =
73
Case
210
To
214
: ValRet =
79
Case
218
To
220
: ValRet =
85
Case
224
, 226
, 228
: ValRet =
97
Case
232
To
235
: ValRet =
101
Case
238
, 239
: ValRet =
105
Case
244
, 246
: ValRet =
111
Case
251
, 252
: ValRet =
117
End
Select
EnleveAccents =
EnleveAccents &
Chr
(
ValRet)
Next
End
Function
Cette fonction enlève les caractères accentués de la chaîne passée en paramètre.
N.B :
Normalement, on ne met qu'une instruction de code par ligne, le caractère de fin de ligne étant le retour chariot.
Cependant, VBA interprète le caractère ":" (deux points) comme étant un séparateur d'instruction lorsqu'il est placé dans une
ligne sans en être le dernier caractère. Cette notation quoique valide est généralement à éviter pour des raisons de lisibilité
sauf quand le code est suffisamment trivial pour ne pas prêter à confusion.
Dans l'exemple ci-dessus, la notation :
Case
192
To
197
: ValRet =
65
Équivaut à la notation
Case
192
To
197
ValRet =
65
Vous pouvez utiliser le raccourci clavier CTRL + Retour arrière.
L'application va positionner la cellule active dans l'angle supérieur gauche de la fenêtre.
Excel sait gérer des listes incrémentées dans vos feuilles de calcul. L'exemple classique est un mois saisi dans une cellule et le mois suivant qui est automatiquement ajouté lorsque vous utilisez les poignées de recopie.
De plus, des listes personnalisées supplémentaires peuvent être mémorisées dans l'application.
Pour visualiser les listes existantes :
Utilisez le bouton Office.
Options Excel.
Menu Standard.
Cliquez sur le bouton "Modifier les listes personnalisées".
La liste de gauche présente les listes personnalisées existantes.
Cliquez sur l'élément "Nouvelle liste" pour créer une série incrémentée.
Saisissez le premier terme de la série, et appuyez sur la touche Entrée pour passer au terme suivant.
A la fin, cliquez sur le bouton "Ajouter" pour valider la liste.
Ce même bouton est utilisé lorsque vous souhaitez modifier une liste personnalisée.
Une liste personnalisée peut également être créée à partir du contenu d'une plage de cellules :
Sélectionnez les cellules depuis la boîte de dialogue et confirmez en cliquant sur le bouton "Importer".
Remarque :
Les entrées de la liste personnalisée sont considérées comme des données texte.
Par exemple, si vous avez une liste de données numériques, la première cellule de la série doit être au format texte.
Pour créer des listes personnalisées par macro :
Application.AddCustomList
Array
(
"Blanc"
, "Vert"
, "Rouge"
, "Bleu"
, "Noir"
)
Application.AddCustomList
Range
(
"A1:A10"
)