You are on page 1of 61

Les procédures événementielles

I. Qu'est-ce qu'une procédure événementielle ?


II. Caractéristiques des procédures événementielles
1. Objets associés aux événements
2. Modules objet
3. Création d'un procédure événementielle
4. Paramètres des procédures événementielles
. Paramètres transmettant des informations à la procédure
. Paramètre d'annulation de l'événement (Cancel)
5. Désactivation des procédures événementielles (EnableEvents)
III. Evénements dynamiques
1. Affectation dynamique d'événements à des objets
2. Le mot-clé WithEvents
. Les variables WithEvents
. Affectation d'objets aux variables WithEvents
3. Les événements de graphiques incorporés
4. Les événements de niveau Application
5. Evénements d'objets extérieurs à Excel
IV. Evénements dynamiques et modules de classe
1. Exemple : événements de l'application et modules de classe
2. Evénements affectés à des collections d'objets
V. Quelques procédures événementielles courantes
1. Evénements de feuilles de calcul
. L'événement Change
. L'événement Calculate
. Worksheet_Activate et Worksheet_Deactivate
2. Evénements du classeur
. Workbook_Open et Workbook_BeforeClose
. Gérer les annulations de fermeture du classeur
3. Evénements de l'application

I. Qu'est-ce qu'une procédure événementielle ?


Une procédure événementielle est une procédure qui se déclenche automatiquement en
réponse à une action de l'utilisateur ou du logiciel, appelée "événement".
Cet événement peut être par exemple la sélection d'une cellule, la saisie d'une valeur, l'ouverture
d'un classeur, l'activation d'une feuille de calcul ou encore la sélection d'une commande de menu.
Les procédures événementielles permettent d'intercepter ces actions afin de contrôler les
manipulations de l'utilisateur, d'enrichir les commandes intégrées d'Excel en leur "greffant" ses
propres macros, ou encore de personnaliser de manière dynamique l'environnement de
l'application.
Cette page présente essentiellement les procédures événementielles spécifiques à Excel,
généralement peu documentées. Les procédures événementielles que l'on retrouve dans toutes
les applications Office (essentiellement celles des UserForms et de leurs contrôles) dépasseraient
le cadre de cet article.
II. Caractéristiques des procédures événementielles
1. Objets associés aux événements
Un événement est toujours associé à un objet ou à une collection d'objets spécifique. Dans le
précédent exemple, nous avons défini une procédure événementielle de niveau "feuille de calcul",
attachée à la première feuille du classeur. Si nous voulions que cette procédure se déclenche
quand l'utilisateur sélectionne de nouvelles cellules dans n'importe quelle feuille du classeur, il
faudrait créer une procédure événementielle de niveau "classeur", s'appliquant à l'ensemble de
ses feuilles.
La feuille de calcul représente ici l'objet associé à la procédure événementielle. Il peut s'agir soit
d'un objet existant, créé par l'utilisateur, soit d'un objet créé par programmation.
Sous Excel, il existe cinq types principaux d'objets associés.
• Feuille de calcul
• Feuille graphique
• Classeur
• Application (instance d'Excel)
• Boîte de dialogue (UserForm)
Les quatre premiers types d'objets sont spécifiques à Excel, alors que les UserForms peuvent
s'utiliser dans toutes les autres applications (Access, Word...) intégrant VBA.
A ces types d'objets, il faut ajouter ceux qui sont créés et définis par programmation par
l'intermédiaire de modules de classe.
2. Modules objet
A l'exception de l'objet Application, les autres objets mentionnés ci-dessus disposent de
leurs propres modules, dits "modules objet". Ces modules sont accessibles par l'explorateur de
projet de l'éditeur VBA. Ils sont créés automatiquement par Excel dans le cas des modules de
classeur, de feuille de calcul et de feuille graphique. Les modules de UserForms et les modules de
classe ne peuvent être créés qu'à partir de l'éditeur VBA, via le menu Insertion.
L'illustration suivante montre les différents types de modules qu'un classeur peut contenir :

Tous les modules présents dans ce classeur sont des modules objet (c'est à dire associés à des
objets particuliers, ou permettant de définir un nouvel objet dans le cas du module Class1), à
l'exception du module standard Module1, qui n'est associé à aucun objet.
Le module ThisWorkbook contient, par définition, les procédures événementielles
associées au classeur.
Selon l'objet concerné par l'événement auquel on veut associer une procédure, on utilisera le
module approprié :
Type de module Evénements associés à...
Module de feuille feuille de calcul particulière et objets placés sur cette feuille
Module graphique feuille graphique particulière et objets placés sur cette feuille
Classeur (ThisWorkbook) classeur, collection de toutes les feuilles et fenêtres du classeur
UserForm boîte de dialogue (UserForm) et contrôles inclus
Module de classe application, collection de toutes les feuilles, fenêtres et classeurs
Comme on le voit dans ce tableau, un module objet permet de gérer non seulement les
événements de l'objet associé au module lui-même (feuille, classeur ou UserForm), mais aussi les
objets qu'il contient, par exemple l'ensemble des feuilles contenues par un classeur, ou encore les
contrôles (boutons, cases à cocher...) placés dans une feuille de calcul.
3. Création d'une procédure événementielle
La liste des événements que l'on peut intercepter par des procédures VBA est prédéterminée. Les
feuilles de calcul disposent par exemple de 7 événements et les classeurs de 19 événements
prédéfinis. Il n'est pas possible de créer des procédures pour des événements qui ne sont pas
prédéterminés par l'application.
- Evénements de feuilles de calcul, de classeur ou de UserForm
Supposons que l'on veuille créer une procédure qui se déclenche automatiquement dès que
l'utilisateur modifie manuellement la valeur inscrite dans la cellule A1 de la feuille "Feuil1". La
procédure est la même que celle indiquée en introduction :
- Sous VBE, double-cliquer sur l'icône 'Feuil1' du classeur dans l'explorateur de projets, afin
d'ouvrir sa feuille de code.
- Comme tout module de code, celui-ci comporte deux listes déroulantes.

La liste de gauche permet de sélectionner la section du module que l'on veut atteindre : la
section Général est destinée aux déclarations de variables globales et aux fonctions ou
procédures non-événementielles. Les autres sections concernent les procédures événementielles
associées aux objets. Ici, comme la feuille ne contient pas de contrôles, un seul objet apparaît
dans cette liste, l'objet Worksheet représentant la feuille de calcul elle-même.
Après sélection de Worksheet dans cette liste déroulante, les événements concernant la feuille
de calcul apparaissent dans la fenêtre de droite.

Le cadre de la procédure événementielle par défaut de l'objet Worksheet, SelectionChange, est


automatiquement placé dans le module. Il suffit de sélectionner l'événement qui nous intéresse
dans la liste, iciChange, pour créer le cadre de la procédure événementielle que l'on veut
manipuler :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
End Sub
Le cadre de la procédure Worksheet_SelectionChange, s'il n'est pas prévu de l'utiliser, peut être
effacé.
Le nom de la procédure identifie à la fois la nature de l'événement ("Change") et l'objet concerné
par cet événement ("Worksheet", placé avant le trait de soulignement). On peut modifier les noms
des arguments, mais pas leur type ni leur ordre d'apparition.
La méthode est la même pour définir des procédures événementielles concernant le classeur
entier ou une boîte de dialogue. Pour le classeur, il faut activer le module
objet ThisWorkbook et sélectionner "Workbook" dans la liste déroulante des objets disponibles.
Pour une boîte de dialogue, activer le UserForm, afficher son module par F7 et sélectionner l'objet
"UserForm".
- Evénements liés à des contrôles
Pour définir des procédures événementielles liées à des contrôles, il faut passer par le module de
l'objet contenant le contrôle, c'est à dire de la feuille de calcul ou du UserForm.
Voici par exemple comment créer un bouton sur une feuille de calcul et définir une macro qui se
déclenchera quand l'utilisateur clique sur ce bouton :
- Créer le nouveau bouton par l'intermédiaire de la barre d'outils "Commandes" (de préférence à
"Formulaires", réservée pour les contrôles hérités d'Excel 5/95).
- Double-cliquer sur ce bouton. Automatiquement, le module objet de la feuille de calcul est
affiché, et le cadre de la procédure événementielle par défaut du contrôle (événement "Click") est
créé :
Private Sub CommandButton1_Click()
End Sub
Il ne reste plus qu'à insérer dans cette procédure le code VBA devant s'exécuter après un clic sur
le contrôle.
De la même manière que les procédures événementielles de la feuille de calcul, celles associées
aux contrôles permettent par leur intitulé d'identifier l'objet (CommandButton1) et l'événement
concerné (Click).
L'objet est manipulable directement par son nom. Excel attribue automatiquement un nom par
défaut à tous les objets créés, par exemple ici CommandButton1, mais il est parfaitement possible
de le modifier par la suite en changeant le contenu de sa propriété Name. Pour modifier les
propriétés d'un contrôle placé sur une feuille de calcul, il faut d'abord activer le mode "Création"

(icône de la barre d'outils "Commandes"), sélectionner ensuite le contrôle à la souris, et afficher

sa fenêtre de propriétés (icône ). Pour utiliser à nouveau le contrôle, il est nécessaire de


désactiver le mode "création".
La création du bouton de commande a généré un objet VBA "CommandButton1" de type
CommandButton, que la procédure événementielle peut elle-même manipuler dans son propre
code.
Voici par exemple comment faire basculer le texte de CommandButton1 de "Arrêter" à
"Reprendre" et inversement à chaque clic de l'utilisateur :
Private Sub CommandButton1_Click()
With CommandButton1
.Caption = IIf(.Caption = "Arrêter", "Reprendre", "Arrêter")
End With
End Sub
Le nouveau contrôle s'ajoute à la liste des objets disponibles du module objet.
Pour modifier cette procédure événementielle ou en définir d'autres, il suffit d'activer ce module,
de sélectionner l'objet par cette liste déroulante et la procédure choisie dans la liste déroulante de
droite. Le procédé est le même pour les contrôles de UserForms.
4. Paramètres des procédures événementielles
La plupart des procédures événementielles intègrent des paramètres. Ces paramètres peuvent
être de deux types :
- Paramètres transmettant des informations à la procédure
L'exemple typique est celui de l'argument Target intégré à la procédure Worksheet_Change des
feuilles de calcul. Cet argument récupère la référence de la cellule ou de la plage dont la
modification du contenu a déclenché l'événement. Il peut être utilisé par la procédure comme
toute autre variable de type Range :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
MsgBox "Plage modifiée : " & Target.Address
End Sub
- Paramètre d'annulation de l'événement (Cancel)
Ce paramètre est intégré à un certain nombre de procédures telles que les procédures de niveau
classeur (module ThisWorkbook) Workbook_BeforeClose ou Workbook_BeforePrint. Il permet à la
procédure d'annuler éventuellement l'action associée à l'événement. Il concerne donc
exclusivement les procédures dont l'exécution se déclenche avant l'action demandée par
l'utilisateur (procédures "Before...").
Quand la procédure est lancée, le paramètre Cancel est égal à False. Pour annuler le
déclenchement de l'action associée à l'événement, il faut mettre ce paramètre à True avant la fin
de la procédure.
L'exemple suivant utilise la procédure de niveau classeur (module ThisWorkbook)
Workbook_SheetBeforeRightClick pour afficher la liste de choix à la place du menu contextuel
lorsque l'utilisateur fait un clic droit sur une cellule.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _
ByVal Target As Excel.Range, Cancel As Boolean)
Application.CommandBars("Cell") _
.FindControl(msoControlButton, 1966).Execute
Cancel = True
End Sub
Si la valeur True n'était pas affectée à Cancel, le menu contextuel associé au clic droit sur une
cellule serait automatiquement affiché après la liste de choix.
5. Désactivation des procédures événementielles (EnableEvents)
Dans certaines situations, il est nécessaire d'empêcher VBA d'exécuter automatiquement les
procédures événementielles. Cette possibilité est offerte par la propriété EnableEvents de l'objet
Application. L'affectation de la valeur False à cette propriété désactive le déclenchement
automatique des procédures événementielles.
Cette propriété permet par exemple d'éviter un piège fréquent posé par la procédure
Sheet_Change ou Worksheet_Change, lorsque celle-ci modifie elle-même, par code, le contenu
d'une cellule. Par exemple, la procédure Worksheet_Change suivante inscrit automatiquement,
dès que l'on saisit une valeur dans une cellule du classeur, le type de cette valeur (String,
Double,...) dans la cellule adjacente de droite :
Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Target As Excel.Range)
If Target.Count > 1 Then Exit Sub
Target.Offset(0, 1) = TypeName(Target)
End Sub
Telle quelle, cette procédure ne marchera pas. Si l'on saisit "Zaza" dans la cellule A1 d'une feuille,
elle inscrira "String" dans la cellule B1, C1, etc. jusqu'au bout de la ligne (IV1) et s'arrêtera ensuite
sur un message d'erreur.
Comme les procédures événementielles sont déclenchées de manière automatique non
seulement par les actions effectuées par les utilisateurs, mais aussi par les actions déclenchées
par macro, l'instructionTarget.Offset(0,1) = TypeName(Target) provoque en effet un appel
récursif de la procédure Workbook_Sheet_Change, qui s'appelle elle-même jusqu'à ce qu'une
erreur soit rencontrée ou alors que la mémoire réservée à la pile d'appel soit épuisée.
Pour éviter cet appel récursif, il est nécessaire de désactiver temporairement le déclenchement
automatique des procédures événementielles avant l'instruction susceptible de provoquer un
appel récursif, et de le réactiver ensuite :
Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Target As Excel.Range)
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
Target.Offset(0, 1) = TypeName(Target.Value)
Application.EnableEvents = True
End Sub
Autre exemple typique, comment empêcher la procédure Workbook_Open d'un classeur ouvert
par macro de se déclencher automatiquement après son ouverture :
Application.EnableEvents = False
Workbooks.Open "C:\Temp\Zaza.xls"
Application.EnableEvents = True
La désactivation provisoire des procédures événementielles par EnableEvents, dans la mesure où
celles-ci peuvent être déclenchées automatiquement par des actions opérées par code, peut
également permettre d'optimiser la vitesse d'exécution des macros (voir Accélération du code
VBA)
III. Evénements dynamiques
1. Le mot-clé WithEvents
Dans tous les exemples précédents, nous sommes partis d'objets déjà existants, créés sous
Excel, auxquelles nous avons affecté des procédures événementielles saisies dans des modules
objet. Il s'agit de procédures définies au moment de la création. Tant qu'elles sont présentes
dans le module objet (et que les procédures événementielles ne sont pas désactivées par
l'intermédiaire de la propriété EnableEvents), elles s'exécuteront systématiquement dès que
l'événement associé se produit. Elles sont immédiatement opérationnelles dès l'ouverture du
classeur qui les contient.
Mais VBA donne également la possibilité d'affecter de manière dynamique, au moment de
l'exécution, des procédures événementielles, soit à des objets existants, soit également à des
objets créés par macro ou par l'utilisateur. Ces procédures peuvent être annulées et réactivées
individuellement de manière dynamique. Elles permettent aussi d'affecter plusieurs procédures au
même événement associé à un objet, de les enchaîner ou de les permuter. Contrairement aux
procédures "statiques" précédentes, elles ne sont pas automatiquement opérationnelles à
l'ouverture du classeur mais nécessitent un code minimal pour être activées.
Ces procédures sont également nécessaires pour intercepter les événements d'objets qui ne
disposent pas de leur propre module de code : il s'agit des graphiques incorporés à des feuilles
de calcul, de l'objetApplication et des objets extérieurs à Excel programmables par OLE
Automation.
2. Affectation d'événements à des objets
- Les variables WithEvents
Pour utiliser de manière dynamique un objet intégrant des événements, il est nécessaire de le
manipuler par l'intermédiaire d'une variable. Le mot-clé WithEvents permet de déclarer des
variables destinées à référencer des objets disposant d'événements.
Par exemple, la ligne suivante déclare une variable "Wksht" de type Worksheet destinée à
répondre à des événements :
Dim WithEvents Wksht As Worksheet
Le mot-clé WithEvents doit être placé entre l'instruction de déclaration (Dim, Public ou Private,
selon la portée que l'on veut attribuer à la variable) et le nom de la variable. Ce mot-clé implique
un certain nombre de restrictions :
- Les variables définies de cette manière ne peuvent être déclarées qu'au niveau module. Il n'est
pas possible de les déclarer comme variables locales à une procédure ou une fonction.
- Seuls les types d'objets pour lesquels des procédures événementielles sont prévues peuvent
être déclarées avec le mot-clé WithEvents. Il peut s'agir par exemple de variables de type
Worksheet, Workbook, UserForm, CommandButton (bouton de UserForm) ou Chart, mais pas de
type Range ou AutoFilter.
- Les variables déclarées WithEvents ne peuvent pas être des tableaux.
- Enfin, ces variables ne peuvent être déclarées qu'au sein de modules objets, que ce soit un
module de feuille de calcul, de feuille graphique, de UserForm, le module ThisWorkbook ou un
module de classe. Elles ne peuvent pas être déclarées dans des modules standard.
Les variables définies avec WithEvents disposent automatiquement des procédures
événementielles correspondant à leur type d'objet. Comme pour les objets existants, elles sont
intégrées à la liste déroulante de gauche du module objet, et leurs événements peuvent être
sélectionnés dans la liste déroulante de droite.
Voici l'exemple de trois variables de type Workbook, Worksheet et UserForm déclarées avec
WithEvents dans un module de feuille de calcul :

Il est possible de définir tout type de variable WithEvents dans n'importe quel module objet, et non
pas seulement dans les modules de classe.
- Affectation d'objets aux variables WithEvents
Les variables déclarées WithEvents sont à l'origine non initialisées, et ne référencent aucun objet
particulier. Pour que leurs procédures événementielles soient activées, il faut d'abord leur affecter
un objet. Cette affectation peut se faire n'importe où dans le code, ou alors dans la procédure
Workbook_Open si l'on veut que la procédure événementielle soit active dès l'ouverture du
classeur.
A partir du moment où la variable est initialisée et qu'elle référence un objet particulier, la ou les
procédures événementielles attachées à cette variable se "connectent" à l'objet concerné et
deviennent opérationnelles. Pour annuler cette connexion, il suffit de détruire la référence à l'objet
en affectant Nothing à la variable.
L'intérêt des variables WithEvents est relativement limité pour les objets dont on peut programmer
directement les procédures événementielles. En revanche, ces variables sont nécessaires pour
intercepter les événements des graphiques incorporés et de l'application Excel, qui ne disposent
d'aucun module objet.
3. Les événements de graphiques incorporés
Contrairement aux feuilles graphiques autonomes, les graphiques incorporés aux feuilles de calcul
ne disposent d'aucun module objet. En revanche, on peut leur associer les mêmes procédures
événementielles, à condition de passer par des variables WithEvents.
Dans l'exemple suivant, la variable "Graph" sert à intercepter l'événement Calculate d'un
graphique incorporé dans une feuille de calcul. A chaque changement d'une ou plusieurs valeurs
dans la plage de données, la procédure Graph_Calculate ajuste automatiquement les extrémités
de l'axe des ordonnées en fonction des valeurs minimale et maximale représentées sur le
graphique (avec une marge de 5% par rapport à l'intervalle entre ces deux valeurs).
Dim WithEvents Graph As Chart

Private Sub Graph_Calculate()

Dim Min As Double, Max As Double


Dim Valeurs(), I As Integer
Dim Marge As Double

Application.ScreenUpdating = False
' Recherche des ordonnées minimale et maximale
With Graph.SeriesCollection
ReDim Valeurs(1 To .Count)
For I = 1 To .Count
Valeurs(I) = .Item(I).Values
Next I
End With
Min = Application.Min(Valeurs)
Max = Application.Max(Valeurs)
ReDim Valeurs(0)
' Redimensionnement de l'axe des ordonnées
Marge = (Max - Min) * 0.05
Min = IIf(Min >= 0 And Min - Marge < 0, 0, Min - Marge)
Max = Max + Marge
With Graph.Axes(xlValue)
If .MinimumScale <> Min Then .MinimumScale = Min
If .MaximumScale <> Max Then .MaximumScale = Max
End With

End Sub
Ce code peut être placé dans n'importe quel objet du classeur, mais il est préférable de le mettre
dans le module de la feuille de calcul contenant le graphique. Pour que la procédure
Graph_Calculate soit opérationnelle, il faut encore connecter la variable Graph au graphique
concerné. Cette affectation peut se faire dans la procédure Workbook_Open du classeur pour que
la procédure soit activable dès son ouverture.
Par exemple, pour connecter la variable au premier graphique de Feuil1 :
Private Sub Workbook_Open()
Set Feuil1.Graph = Feuil1.ChartObjects(1).Chart
End Sub
Pour désactiver notre procédure événementielle, il suffit de "déconnecter" la variable Graph de
l'objet graphique :
Set Feuil1.Graph = Nothing
Si nous avons défini par ailleurs une autre variable "Graph2" de type Chart disposant de sa propre
procédure Graph2_Calculate, il est possible d'affecter l'objet graphique à cette deuxième variable :
Set Feuil1.Graph = Feuil1.ChartObjects(1).Chart
Set Feuil1.Graph2 = Feuil1.ChartObjects(1).Chart
De cette manière, le graphique disposera de deux procédures événementielles Calculate, celle de
la variable Graph et celle de la variable Graph2. Quand des données sources du graphique
changeront de valeur, ces deux procédures se déclencheront successivement. En affectant
Nothing à l'une des variables ou aux deux, on peut désactiver chacune de ces procédures
événementielles.
Cette méthode permettant d'enchaîner plusieurs procédures événementielles n'est pas spécifique
aux objets Chart, mais peut s'appliquer à tout objet pouvant être connecté à des variables
WithEvents.
4. Les événements de niveau Application
Tout comme les procédures événementielles de graphiques incorporés, celles de l'objet
Application ne peuvent être programmées qu'à l'aide de variables WithEvents, l'application Excel
ne disposant pas de son propre module objet.
Ces procédures permettent d'intercepter des événements de niveau Application, c'est à dire se
déclenchant indépendamment de toute feuille ou classeur ouvert. Elles ont toutes leurs
équivalents de niveau feuille de calcul et classeur. Pour intercepter des saisies de l'utilisateur
dans des cellules, on dispose ainsi de trois niveaux de procédures :
- Worksheet_Change (module objet d'une feuille) : intercepte les saisies faites dans une feuille de
calcul particulière.
- Workbook_SheetChange (module objet ThisWorkbook) : intercepte les saisies faites dans
n'importe quelle feuille du classeur.
- App_SheetChange (liée à la variable WithEvents "App", de type Application) : intercepte les
saisies faites dans n'importe quelle feuille de tout classeur ouvert.
Pour illustrer la différence entre ces trois niveaux, supposons que l'on veuille mettre en place une
procédure événementielle qui mette automatiquement en majuscule toute saisie de texte dans
une cellule. La procédure à utiliser et son module objet ne sont pas les mêmes selon la portée que
l'on veut attribuer à cette procédure (feuille de calcul particulière, classeur entier ou toute feuille de
calcul ouverte dans l'application).
- Feuille de calcul particulière
Dans le module objet de la feuille concernée :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Count > 1 Or VarType(Target) <> vbString _
Or Target.HasFormula Then Exit Sub
Application.EnableEvents = False
Target = UCase(Target)
Application.EnableEvents = True
End Sub
- Toute feuille du classeur
Dans le module ThisWorkbook du classeur :
Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Target As Excel.Range)
If Target.Count > 1 Or VarType(Target) <> vbString _
Or Target.HasFormula Then Exit Sub
Application.EnableEvents = False
Target = UCase(Target)
Application.EnableEvents = True
End Sub
- Toutes les feuilles de tous les classeurs ouverts
Dans le module ThisWorkbook ou tout autre module objet :
Dim WithEvents App As Application

Private Sub App_SheetChange(ByVal Sh As Object, _


ByVal Target As Excel.Range)
If Target.Count > 1 Or VarType(Target) <> vbString _
Or Target.HasFormula Then Exit Sub
Application.EnableEvents = False
Target = UCase(Target)
Application.EnableEvents = True
End Sub
Et dans le module ThisWorkbook, pour connecter la variable App à l'application :
Private Sub Workbook_Open()
Set App = Application
End Sub
Si le classeur est en fait une macro complémentaire XLA (plus utile et mieux appropriée qu'un
classeur XLS à la gestion des événements de niveau Application), il est préférable d'employer la
procédureWorkbook_AddinInstall plutôt que Workbook_Open pour affecter l'application à notre
variable :
Private Sub Workbook_AddinInstall()
Set App = Application
End Sub
Les procédures événementielles de niveau feuille, classeur et application sont additives, c'est à
dire qu'elles ne s'écrasent pas mutuellement. Ainsi, on peut tout à fait utiliser simultanément une
procédure du type Sheet_Change pour une feuille donnée, le classeur qui la contient et
l'ensemble de l'application. Lorsque la feuille de calcul sera activée, VBA exécutera
successivement la procédure de niveau feuille, puis celle de niveau classeur et enfin celle de
niveau Application.
Par l'intermédiaire des variables WithEvents, on peut même construire une multiplicité de
procédures événementielles du même type pour une même famille d'objets. Toutes les
procédures coexistent indépendamment les unes des autres et s'enchaînent à l'exécution. Une
macro complémentaire peut donc utiliser sa propre procédure WorkbookOpen de niveau
Application sans se préoccuper si d'autres macros extérieures exploitent le même événement.
Chacune de ces procédures s'exécutera tour à tour sans interférer avec les autres.
5. Evénements d'objets extérieurs à Excel
Les variables WithEvents permettent non seulement de gérer des procédures événementielles
d'objets spécifiques à Excel, mais également d'autres d'objets extérieurs à l'application. Il doit
s'agir d'objets ActiveX supportant l'utilisation du mot-clé WithEvents.
Par exemple, il est possible de définir des procédures événementielles d'une fenêtre Word dans
une macro Excel, simplement en créant une variable WithEvents de type Word.Application et en
lui affectant une instance déjà ouverte ou nouvelle de Word.
Le code ci-dessous ouvre une nouvelle fenêtre Word, l'active et "espionne" ensuite tous les
documents ouverts sous Word en recopiant leur nom dans une feuille de calcul masquée. Une fois
que Word est fermé (événement Quit de Word), cette feuille est rendue visible. L'ouverture des
documents sous Word est interceptée par la procédure événementielle DocumentOpen.
' *** Dans le module ThisWorkbook ***

Public WithEvents WRD As Word.Application

Private Sub WRD_DocumentOpen(ByVal Doc As Word.Document)


' Ajout du nom du document ouvert dans la feuille masquée
I = I + 1
Wksht.Cells(I, 1) = Doc.FullName
End Sub

Private Sub WRD_Quit()


' Destruction de la variable WRD et affichage du résultat
Set WRD = Nothing
Wksht.Visible = True
Wksht.Activate
End Sub

' *** Dans un module standard ***

Public Wksht As Worksheet


Public I As Integer

Sub ActiverWord()
With ThisWorkbook
' Connexion de la variable WRD du module ThisWorkbook
' avec une nouvelle instance de Word,
' Affichage et activation de la fenêtre Word
Set .WRD = New Word.Application
.WRD.Visible = True
.WRD.Activate
End With
Set Wksht = Worksheets.Add
Wksht.Visible = False
I = 0
End Sub
De la même manière, il est possible de piloter les événements de toute autre application
supportant la déclaration WithEvents à partir d'une macro Excel.
IV. Evénements dynamiques et modules de classe
La documentation existante sur les procédures événementielles dynamiques, en particulier celles
de l'application, présente très souvent celles-ci comme une caractéristique réservée aux modules
de classe. En réalité, du moment que tous les modules objet (par exemple un module de feuille de
calcul ou le module ThisWorkbook) acceptent la déclaration de variables WithEvents, tous
peuvent servir à créer des événements dynamiques, quel que soit le type d'objet rattaché à ces
événements.
Toutefois, les modules de classe présentent des avantages indéniables. Au lieu de définir des
procédures événementielles de l'application à l'intérieur du module ThisWorkbook, par exemple,
on peut regrouper ces procédures dans un module de classe que l'on nommerait "Application". De
cette manière, les procédures événementielles sont clairement réparties dans des modules objet
distincts selon les objets auxquels elles se rattachent (module ThisWorkbook pour le classeur,
modules de feuille pour les feuilles de calcul et modules de classe particuliers pour l'application ou
d'autres objets éventuels).
En plus d'un code mieux structuré, les modules de classe permettent surtout, indirectement,
d'attacher des procédures événementielles dynamiques à des tableaux ou collections d'objets,
ce qui n'est normalement pas possible compte tenu du fait que le mot-clé WithEvents ne peut pas
servir à définir des variables de type tableau.
1. Exemple : événements de l'application et modules de classe
Les modules de classe représentent également un espace de stockage bien adapté aux
procédures événementielles de niveau Application. Ils permettent de regrouper toutes ces
procédures dans un module unique distinct des procédures liées au classeur. De cette manière, la
gestion des événements de niveau classeur peut être réservée au module ThisWorkbook, les
événements de niveau Application étant réservés au module de classe. Le code est ainsi mieux
structuré et plus lisible.
La technique pour créer des procédures événementielle dans un module de classe est la même
que pour tout autre module objet, à quelques différences près :
- La variable "App" du module de classe doit être déclarée Public pour que l'on puisse lui affecter
l'objet Application à partir d'un autre module.
- Un module de classe servant en principe à définir une nouvelle classe d'objet, et non l'objet lui-
même, il est nécessaire de l'instancier en créant un objet fondé sur cette classe. Pour cela, il faut
déclarer dans un autre module une variable ayant cette classe comme type, et affecter à cette
variable un nouvel objet (une nouvelle instance de la classe). Il faudra donc prévoir, d'une part,
dans le module de classe, une variable "App" destinée à connecter les procédures
événementielles à l'objet Application :
Public WithEvents App As Application
Et dans un autre module :
. La déclaration de la variable destinée à instancier la classe :
Dim MonApplication As Nom_du_module_de_classe
. L'instanciation de la classe à l'intérieur de cette variable :
Set MonApplication = New Nom_du_module_de_classe
. Enfin, l'affectation de l'application Excel en cours à la "propriété" App de notre instance de
classe :
Set MonApplication.App = Application
Si l'on reprend l'exemple du paragraphe III.4 en utilisant un module de classe
nommé "Evts_Application" à la place de ThisWorkbook, le code à utiliser dans le module de
classe est similaire au précédent, à la différence près que la variable WithEvents est déclarée ici
Public:
Public WithEvents App As Application

Private Sub App_SheetChange(ByVal Sh As Object, _


ByVal Target As Excel.Range)
If Target.Count > 1 Or VarType(Target) <> vbString _
Or Target.HasFormula Then Exit Sub
Application.EnableEvents = False
Target = UCase(Target)
Application.EnableEvents = True
End Sub
Dans le module ThisWorkbook (par exemple), il faut alors instancier la classe à l'aide d'une
variable (ici "XL") et connecter sa propriété App (définie dans le module de classe par la variable
App) à l'application Excel en cours :
Dim XL As Evts_Application

Private Sub Workbook_Open()


Set XL = New Evts_Application
Set XL.App = Application
End Sub
On pourrait également instancier directement la variable XL en intégrant le mot-clé New à sa
déclaration :
Dim XL As New Evts_Application
Private Sub Workbook_Open()
Set XL.App = Application
End Sub
Avec ce procédé, il est possible de désactiver les procédures événementielles soit en "détruisant"
le contenu de la variable App (Set XL.App = Nothing) soit en détruisant celui de la variable XL (Set
XL = Nothing).
2. Evénements affectés à des collections d'objets
Le mot-clé WithEvents a comme principale limitation de ne pas supporter les variables de type
tableau. Si l'on saisit par exemple une déclaration comme "Dim WithEvents Graph(5) As Chart",
l'indice (5) est automatiquement supprimé à la validation de la ligne. L'instruction ReDim appliquée
à une variable WithEvents ne déclenche pas d'erreur de compilation ou d'exécution, mais en
revanche les procédures événementielles de cette variable ne seront pas déclenchées.
Cette limitation peut poser des problèmes si l'on veut affecter des événements à un grand nombre
d'objets, comme par exemple tous les graphiques incorporés dans le classeur. Pour affecter par
exemple la procédure Graph_Calculate définie en III.3 à chacun de ces graphiques, il faudrait
déclarer autant de variables Graph qu'il y a de graphiques dans le classeur, chacune avec sa
propre procédure Graph_Calculate et leur affecter ensuite chacun de ces objets Chart
séparément :
Dim WithEvents Graph1 As Chart
Dim WithEvents Graph2 As Chart
Dim WithEvents GraphN As Chart

Private Sub Graph_Calc(Graph As Chart)


' Traitement à effectuer sur Graph
End Sub

Private Sub Graph1_Calculate()


Graph_Calc Graph1
End Sub

Private Sub Graph2_Calculate()


Graph_Calc Graph2
End Sub

Private Sub GraphN_Calculate()


Graph_Calc GraphN
End Sub

Private Sub Workbook_Open()


Set Graph1 = Feuil1.ChartObjects(1).Chart
Set Graph2 = Feuil2.ChartObjects(1).Chart
' ...
Set Graph1 = FeuilN.ChartObjects(X).Chart
End Sub
Cette méthode n'est évidemment pas viable et ne peut pas s'adapter automatiquement à un
nombre variable de graphiques incorporés.
En passant par l'intermédiaire d'un module de classe, on peut simplifier cela en créant
indirectement un tableau ou une collection de variables WithEvents par l'intermédiaire d'un
tableau d'instances de la classe.
Le module de classe (appelé par exemple Classe_Graph) contiendra la déclaration d'une seule
variable WithEvents de type Chart et le code de sa ou de ses procédures événementielles :
Public WithEvents Graph As Chart

Private Sub Graph_Calculate()


' Traitement à effectuer sur le graphique...
End Sub
Ensuite, il suffira de déclarer par exemple dans ThisWorkbook une variable tableau de type
Classe_Graph, de créer dans ce tableau autant d'instances de Classe_Graph qu'il y a de
graphiques, puis d'affecter à la variable Graph de chacune de ces instances chaque graphique du
classeur à l'aide d'une boucle.
Ce qui pourrait donner par exemple le code suivant :
Dim Obj_Graph() As Classe_Graph

Private Sub Workbook_Open()

Dim Wksht As Worksheet


Dim I As Integer, J As Integer, K As Integer

' Parcours des feuilles de calcul du classeur


For Each Wksht In Me.Worksheets
J = Wksht.ChartObjects.Count
ReDim Preserve Obj_Graph(I + J)
' Parcours des graphiques de la feuille de calcul
For K = 1 To J
' Affectation d'une nouvelle instance de Classe_Graph
Set Obj_Graph(K + I) = New Classe_Graph
' Affectation du graphique à la variable Graph de l'instance
Set Obj_Graph(K + I).Graph = Wksht.ChartObjects(K).Chart
Next K
I = I + J
Next Wksht

End Sub
Ce genre de code est beaucoup plus simple à gérer si l'on utilise une variable de
type Collection à la place d'une variable tableau, comme le montre l' exemple suivant:
Dim Obj_Graph As Collection

Private Sub Workbook_Open()

Dim Wksht As Worksheet


Dim ChObj As ChartObject

Set Obj_Graph = New Collection


For Each Wksht In Me.Worksheets
For Each ChObj In Wksht.ChartObjects
' Ajout d'une nouvelle instance de Classe_Graph à la collection
Obj_Graph.Add New Classe_Graph
' Affectation du graphique à la variable Graph de l'instance
Set Obj_Graph(Obj_Graph.Count).Graph = ChObj.Chart
Next ChObj
Next Wksht

End Sub
Dans les deux cas (tableau ou collection), autant d'instances de Classe_Graph qu'il y a de
graphiques incorporés dans le classeur seront automatiquement créées, donc autant d'instances
de la variable Graph. Les événements attachés à cette variable (Graph_Activate,
Graph_Calculate...) seront déclenchés dès que l'utilisateur effectuera des manipulations sur
n'importe lequel des graphiques incorporés dans le classeur.
Avec cette méthode, il est possible d'élargir les procédures événementielles à d'autres objets en
redimensionnant le tableau (ou en ajoutant un élément à la collection), en affectant au nouvel
élément une nouvelle instance de la classe puis en affectant à la variable Graph de cette instance
une référence vers l'objet concerné. De même, pour annuler les procédures événementielles pour
un objet particulier, il suffit d'affecter Nothing à l'élément du tableau correspondant (ou à sa
variable Graph), ou encore de détruire l'élément de la collection par 'Obj_Graph.Remove
Num_Index'.
V. Quelques procédures événementielles courantes
Avec les feuilles de calcul, les UserForms et leurs contrôles respectifs, les feuilles graphiques, les
classeurs, l'objet Application, Excel dispose d'un nombre important de procédures
événementielles prédéfinies. Commenter toutes ces procédures dépasserait de très loin le cadre
de cette page.
Les procédures événementielles commentées ci-dessous sont des procédures fréquemment
employées et dont l'utilisation réclame quelques précautions particulières.
1. Evénements de feuilles de calcul
Ces événements peuvent être gérés au niveau d'une feuille de calcul particulière, du classeur ou
de l'application.
Procédure Evénement associé
Activate Activation de la feuille
BeforeDoubleClick Double-clic sur la feuille par l'utilisateur
BeforeRightClick Clic droit sur la feuille
Calculate Calcul d'une formule ou recalcul automatique de la feuille
Change Entrée de valeur(s) dans une plage
Deactivate Désactivation de la feuille
SelectionChange Changement de la plage sélectionnée
- L'événement Change
Cet événement se produit dès qu'une ou plusieurs valeurs sont modifiées ou saisies dans une
feuille de calcul. Dans les modules de feuilles, l'en-tête est :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
La variable Target transmet à la procédure la cellule ou la plage dont le contenu a été modifié. Il
est important de noter qu'il peut s'agir d'une cellule unique, d'une plage de plusieurs cellules,
ou encore d'uneunion de plages discontinues.
Si l'utilisateur change le contenu de la cellule A1, le paramètre Target contiendra la référence
d'une cellule unique. S'il modifie en bloc la plage A1:A10 par Ctrl-Entrée ou par recopie
incrémentée, ce paramètre référencera la plage A1:A10. S'il sélectionne la plage A1:A10 et la
plage B1:B10 avant d'en modifier la valeur par Ctrl-Entrée, le paramètre Target contiendra une
union de plages.
Pour éviter toute erreur à l'exécution, la procédure Worksheet_Change doit donc prendre en
compte le fait que Target peut contenir plusieurs cellules, et modifier celles-ci par l'intermédiaire
d'une boucle.
Voici par exemple comment compléter l'exemple mentionné plus haut (mise automatique en
majuscules) en tenant compte de cette possibilité et en optimisant le code :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)

Dim Cell As Range


Dim ModeCalcul As Long

' Target = cellule unique :


If Target.Count = 1 Then
If VarType(Target) = vbString And Not Target.HasFormula Then
Application.EnableEvents = False
Target = UCase$(Target)
Application.EnableEvents = True
End If
Exit Sub
End If
' Target = plage de cellules :
' Désactivation du recalcul automatique,
' des procédures événementielles (pour éviter les appels
' récursifs) et de la mise à jour écran
ModeCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.ScreenUpdating = False
' Désactivation de la touche Echap
On Error GoTo Fin
Application.EnableCancelKey = xlErrorHandler
' Mise en majuscule de chaque cellule de Target
For Each Cell In Target
If VarType(Cell) = vbString And Not Cell.HasFormula _
Then Cell = UCase$(Cell)
Next Cell

Fin:
' Rétablissement des paramètres de l'application
Application.Calculation = ModeCalcul
Application.EnableEvents = True

End Sub
Il est recommandé d'intégrer un gestionnaire d'erreur et de désactiver la touche Echap pour
pouvoir rétablir les paramètres de l'application en cas d'interruption prématurée de la procédure.
Si l'exécution était par exemple interrompue avant le rétablissement de la propriété EnableEvents
sur True, cette procédure événementielle ainsi que toutes les autres seraient ensuite désactivées.
Comme le paramètre Target peut contenir une référence à plusieurs cellules, il est également
nécessaire de passer par la fonction Intersect pour tester la modification d'une cellule particulière.
Par exemple, le code suivant empêche l'utilisateur d'effacer le contenu de la cellule A1 :
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
If Not IsEmpty(Range("A1")) Then Exit Sub
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End Sub
La première ligne sort de la procédure si la cellule concernée (A1) ne fait pas partie de la plage
modifiée. Si elle en fait partie et si son contenu a été effacé, l'action de l'utilisateur est annulée afin
de replacer dans la cellule son contenu précédent.
- L'événement Calculate
Cet événement se produit après tout recalcul de la feuille.
L'événement Calculate complète l'événement Change en ce sens qu'il permet de détecter des
changements de valeur par calcul dans des cellules contenant des formules.
Contrairement à Change, la procédure Calculate ne dispose pas de paramètre Target. Il n'est
donc pas possible de détecter quelles sont les cellules dont le contenu a été modifié à l'issue du
recalcul. pour cela il est nécessaire de passer par une ou plusieurs variables stockant le contenu
antérieur de la ou des cellules dont on veut intercepter le changement de valeur.
Dans le code suivant, un message est affiché à chaque fois que la cellule A1 de la feuille Feuil1
change de valeur, que ce soit par saisie manuelle (Worksheet_Change) ou calcul de formule
(Worksheet_Calculate). La variable ValPrec sert à vérifier si cette valeur a changé en stockant la
valeur précédente de la cellule et en la comparant à sa nouvelle valeur.
' Dans le module objet de Feuil1 :

Public ValPrec

Private Sub Worksheet_Calculate()


Vérif
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)


If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
Vérif
End Sub

Private Sub Vérif()


If VarType(Range("A1")) = VarType(ValPrec) Then _
If ValPrec = Range("A1") Then Exit Sub
MsgBox "Cellule A1 passe de " & CStr(ValPrec) & _
" vers " & CStr(Range("A1"))
ValPrec = Range("A1")
End Sub

' Dans le module de code ThisWorkbook :

Private Sub Workbook_Open()


Feuil1.ValPrec = Feuil1.Range("A1")
End Sub
- Worksheet_Activate et Worksheet_Deactivate
Ces procédures se déclenchent respectivement quand une feuille de calcul est activée ou
désactivée par l'utilisateur (ou par une macro). Elles permettent entre autres de personnaliser
l'affichage ou d'afficher une barre d'outils pour une feuille de calcul particulière lors de son
activation, et de rétablir l'affichage standard ensuite.
Par exemple, pour que la fenêtre du classeur se mette en mode "plein écran" lorsque l'utilisateur
active la feuille de calcul :
Private Sub Worksheet_Activate()
Application.DisplayFullScreen = True
End Sub

Private Sub Worksheet_Deactivate()


Application.DisplayFullScreen = False
End Sub
Au niveau du classeur, les procédures équivalentes sont WindowActivate et WindowDeactivate.
2. Evénements du classeur
Les événements associés au classeur sont d'une part relatifs à toutes les feuilles du classeur
(événements similaires à ceux des feuilles de calcul, comme par exemple Worksheet_Calculate,
comportant un paramètre Sh supplémentaire permettant d'identifier la feuille concernée), et
d'autre part des événements spécifiques à l'objet classeur dans son ensemble :
Procédure Evénement associé
AddinInstall Installation du classeur (macro XLA)
AddinUninstall Désinstallation du classeur (macro XLA)
BeforeClose Demande de fermeture du classeur
BeforePrint Demande d'impression
BeforeSave Demande d'enregistrement du classeur
Deactivate Désactivation du classeur
NewSheet Insertion d'une nouvelle feuille
Open Ouverture du classeur
WindowActivate Activation du classeur ou d'une de ses fenêtres
WindowDeactivate Désactivation du classeur ou d'une de ses fenêtres
WindowResize Redimensionnement de la fenêtre du classeur
- Workbook_Open et Workbook_BeforeClose
Ce sont les procédures les plus fréquemment utilisées. Elles se déclenchent respectivement
quand le classeur est ouvert (par l'utilisateur ou par macro) ou en instance de fermeture.
Typiquement, ces procédures peuvent être employées pour afficher une barre d'outils spécifique
au classeur au moment de son ouverture, et détruire cette barre à la fermeture.
Voici par exemple comment procéder avec une barre d'outils spécifique "MaBarreOutils". Celle-ci
doit être au préalable attachée au classeur (menu Affichage -> Barres d'outils -> Personnaliser,
bouton "Attacher").
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.CommandBars("MaBarreOutils").Delete
End Sub

Private Sub Workbook_Open()


Application.CommandBars("MaBarreOutils").Visible = True
End Sub
La barre d'outils étant attachée au classeur, on peut la détruire dans la procédure
Workbook_BeforeClose. Elle sera automatiquement recréée à la réouverture du classeur.
- Gérer les annulations de fermeture du classeur
Le code précédent présente un certain défaut. Si l'utilisateur a opéré des modifications dans le
classeur et veut le fermer, Excel va effectuer les actions suivantes :
- Déclenchement de la procédure Workbook_BeforeClose => Suppression de la barre d'outils
- Demande de confirmation : "Voulez-vous enregistrer les modifications ?"
Si l'utilisateur répond par "Annuler" à cette demande de confirmation, le classeur reste ouvert,
mais la barre d'outils a été supprimée.
Pour éviter ce problème, il est nécessaire que la procédure Workbook_BeforeClose prenne elle-
même en charge cette demande de confirmation, afin de laisser la barre d'outils affichée si
l'utilisateur annule la fermeture du classeur, ce qui peut donner lieu au code suivant :
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim Rep As Long

If Not Me.Saved Then


Rep = MsgBox("Voulez-vous enregistrer " & _
"les modifications apportées à '" & Me.Name & "'?", _
vbQuestion + vbYesNoCancel)
Select Case Rep
Case vbYes
Me.Save
Case vbCancel
Cancel = True
Exit Sub
Case vbNo
Me.Saved = True
End Select
End If
Application.CommandBars("MaBarreOutils").Delete

End Sub
Si l'utilisateur annule la fermeture en cliquant sur Annuler, le paramètre Cancel est mis sur True,
ce qui désactive la fermeture du classeur (voir annulation d'événement) et 'Exit Sub' sort de la
procédure. Le classeur est donc toujours ouvert, mais la barre d'outils n'a pas été supprimée.
Cette technique peut être utilisée dans toutes les situations où la procédure
Workbook_BeforeClose doit nettoyer l'environnement de la fenêtre Excel avant la fermeture du
classeur.
Les macros complémentaires XLA ne posent pas ce genre de problème, car elles ne demandent
pas de confirmation à la fermeture. En principe, les procédures AddinInstall et AddinUninstall sont
nettement mieux adaptées à ce type d'application que Workbook_Open et
Workbook_BeforeClose.
3. Evénements de l'application
Les événements de niveau Application reprennent tous ceux liés aux feuilles de calcul
(SheetActivate, SheetCalculate...) et aux classeurs (WorkbookOpen etc.). Le seul événement
nouveau est NewWorkbook, qui se déclenche à la création d'un nouveau classeur.
Pour finir, voici un exemple très simple de procédure Workbook_Open de niveau Application.
Cette procédure de macro XLA change le répertoire courant par celui du dernier classeur ouvert.
Par exemple, si on ouvre le classeur "C:\Temp\Test.xls" en le sélectionnant directement dans la
liste des derniers classeurs ouverts du menu Fichier, le répertoire courant (celui de la boîte de
dialogue "Ouvrir") devient "C:\Temp\". Ce n'est pas le comportement par défaut sous Excel 97.
Dim WithEvents XL As Application

Private Sub Workbook_AddinInstall()


Set XL = Application
End Sub

Private Sub XL_WorkbookOpen(ByVal Wb As Excel.Workbook)


ChDir Wb.Path
End Sub

Morefunc pour Excel


Concours Office 2007
Présentation
Photo d'écran
Démo au format Flash Player
Nouvelles fonctions
Support
Exemples de formules
Téléchargement

Concours Office 2007


Morefunc est inscrit au concours Logithèque - Office 2007 organisé par Microsoft France et
Anshare.org. Ce concours récompense des compléments ou documents en langue française conçus
pour Office 2007. Les votes sont clos depuis le 23 décembre. Le résultat de ce concours sera rendu
public le 7 janvier 2008.

Présentation
Morefunc est une macro complémentaire proposant 67 nouvelles fonctions de feuille de calcul pour Excel, conçue
et développée par Laurent Longre.
Ces fonctions sont compatibles avec Excel 95 à 2007. Elles ne sont pas portables sur d'autres plate-formes que
Windows, ni sur d'autres tableurs.
Ce complément est écrit en C++ et contenu dans un fichier XLL, c'est à dire une DLL capable de s'interfacer avec
Excel. La rapidité du code compilé permet d'obtenir une vitesse de calcul souvent comparable à celle des fonctions
intégrées d'Excel.
Morefunc est distribué en tant que Freeware. L'installation est entièrement automatisée.
Il est utilisable en deux langues, français ou anglais, et est accompagné d'une aide en ligne détaillée.

Photo d'écran
Démo
Cliquez ici pour visionner une petite démo de Morefunc (3,3 Mo, nécessite Macromedia Flash Player).

Installation et utilisation
Installation et déploiement
Incorporer Morefunc dans un classeur (Excel 2003 et antérieur)
Utilisation des fonctions

Nouvelles fonctions
Dernière modification (5.06) : ajout de la fonction REGION.
Pour l'historique et plus de détails, voir le Changelog.
Date et heure
DIFFDATE Renvoie la durée écoulée entre deux dates en nombre d'années, mois et jours

DIMPAQUES Renvoie la date du dimanche de Pâques pour une année donnée

NUM.SEMAINE Calcule le numéro de semaine d'une date (conforme à la norme ISO)

Information
EVAL Evalue une expression donnée sous forme de texte
INDIRECT.EXT Renvoie le contenu d'une cellule ou d'une plage contenue dans un classeur fermé

MRFVERSION Renvoie le numéro de version de Morefunc

NOMCLASSEUR Renvoie le nom du classeur courant

NOMFEUILLE Renvoie le nom d'une feuille dans le classeur en cours

NUMPAGE Renvoie le numéro de page d'une cellule

TEXTEFORMULE Renvoie la formule d'une cellule

XLM.LIRE.CELLULE Renvoie des informations sur la mise en forme, la position ou le contenu d'une cellule

XLM.LIRE.CLASSEUR Renvoie des informations sur le classeur courant

XLM.LIRE.DOCUMENT Renvoie des informations sur une feuille ou le classeur courant

XLM.LIRE.ENV Renvoie des informations sur l'environnement

Mathématiques
ALEAS Renvoie une série d'entiers à partir de 0 ou 1 arrangés aléatoirement sans répétition

ARRONDI.MAT Renvoie un tableau d'arrondis équilibrés

CHBASE Convertit une valeur d'une base numérique à une autre

DETERMAT.EXT Renvoie le déterminant d'une matrice de grande taille

HEX.AND Effectue un ET logique sur des nombres hexadécimaux

HEX.FORMAT Formate un nombre hexadécimal en fonction du nombre de bits indiqué

HEX.NEG Inverse le signe d'un nombre hexadécimal

HEX.NOT Inverse les bits d'un nombre hexadécimal (NON logique)

HEX.OR Effectue un OU logique sur des nombres hexadécimaux

HEX.SOMME Renvoie la somme de nombres hexadécimaux

INVERSEMAT.EXT Inverse une matrice de grande taille

MOYENNE.GEO.EXT Moyenne géométrique supportant des calculs de grande capacité

MOYPOND Renvoie une moyenne pondérée

NP.ESTPREMIER Teste si un nombre est premier (méthode probabiliste)

NP.SUIVANT Renvoie le plus petit nombre premier supérieur ou égal au nombre indiqué

PRODUITMAT.EXT Effectue un produit matriciel entre des tableaux de grande taille

Statistiques
ECARTYPE.GROUPE Evalue l'écart-type d'une population groupée en classes

ECARTYPEP.GROUPE Calcule l'écart-type d'une population groupée en classes

MMAX Renvoie les N plus grandes valeurs d'une table

MMIN Renvoie les N plus petites valeurs d'une table

NB.DIFF Renvoie le nombre de valeurs distinctes d'une plage

NB.SI.3D Dénombrement conditionnel sur une plage 3D


VAR.GROUPE Evalue la variance d'une population groupée en classes

VARP.GROUPE Calcule la varianced'une population groupée en classes

Texte
ANSI128 Enlève les accents d'une chaîne de caractères

MCONCAT Concatène l'ensemble des valeurs d'une plage ou d'un tableau

NB.MOTS Renvoie le nombre de mots contenus dans un texte

NBTEXTE Transcrit un nombre en toutes lettres (13 langues supportées)

REGEX.COMP Teste la présence d'une expression régulière dans un texte

REGEX.NBCAR Renvoie le nombre de caractères d'une expression régulière trouvée dans un texte

REGEX.NOMBRE Compte le nombre d'occurences d'une expression régulière dans un texte

REGEX.STXT Extrait une sous-chaîne de caractères en utilisant les expressions régulières

REGEX.SUBSTITUE Remplace des caractères dans un texte en utilisant une expression régulière

REGEX.TROUVE Renvoie la position d'une expression régulière dans un texte

STEXTE Renvoie un mot ou groupe de mots situé à une certaine position dans un texte

TEXTEINVERSE Inverse l'ordre des caractères d'un texte

Tri automatique
TRIH Trie les colonnes d'une plage ou un tableau (jusqu'à 14 clés de tri)

TRIH.IDX Renvoie les index d'un tri horizontal

TRIV Trie les lignes d'une plage ou un tableau (jusqu'à 14 clés de tri)

TRIV.IDX Renvoie les index d'un tri vertical

VALEURS.UNIQUES Renvoie les valeurs uniques d'un ensemble de données

Autres fonctions
DECALERFEUILLE Renvoie une plage décalée d'une ou plusieurs feuilles

DERCELL Renvoie la dernière cellule ou ligne non vide d'une plage

DVAR Sauvegarde une valeur dans une variable temporaire

LVAR Récupère la valeur d'une variable temporaire

RAPPEL Renvoie le dernier contenu de la cellule appelante

REGION Renvoie la région d'une cellule (similaire à la méthode CurrentRegion en VBA)

SUITE Génère une suite d'entiers croissants

TAB.FILTRE Renvoie uniquement les cellules visibles d'une plage

TAB.JOINDRE Assemble des éléments épars dans un tableau

TAB3D Assemble les valeurs d'une référence 3D dans un seul tableau

UNION.DECALER Effectue un décalage sur une union de plages disjointes

Support
Vous souhaitez poser des questions, faire des suggestions, signaler des problèmes ou des bugs ? Visitez le forum.
Exemples de formules
Un classeur contenant un certain nombre d'exemples est fourni avec Morefunc. Pour ouvrir ce classeur, cliquez sur
Exemples dans le menu Outils => Morefunc (Excel 97-2003) ou dans le menu Morefunc => Support de l'onglet
Formules (Excel 2007).

Installation et déploiement

Installation et désinstallation de Morefunc


Morefunc est lirvré sous la forme d'un programme d'installation, téléchargeable sur le site x-cell.
Pour installer Morefunc, lancez simplement le fichier Setup.exe et laissez-vous guider...
Pour le désinstaller, ouvrez le groupe de programmes Morefunc à partir du menu Démarrer et cliquez
sur Désinstaller.

Ouverture et fermeture à partir d'Excel


Les macros complémentaires peuvent être librement chargées ou déchargées sous Excel (Microsoft emploie un
peu improprement les termes d'installation et de désinstallation).
Pour fermer ou ouvrir Morefunc sous Excel :
Sous Excel 97, 2000, 2002 ou 2003 :
1. Ouvrez le menu Outils et cliquez sur Macros complémentaires,
2. Cochez ou décochez Morefunc et validez par OK.
Si le complément n'apparaît pas dans la liste, cliquez sur Parcourir pour le sélectionner.
Sous Excel 2007 :
1. Ouvrez le menu Office (en haut à gauche de la fenêtre) et cliquez sur Options Excel,
2. Cliquez sur la catégorie Compléments, puis sur le bouton Atteindre,
3. Cochez ou décochez la macro et validez par OK.
Une fois la macro "installée" dans le gestionnaire de macro complémentaire, elle est automatiquement chargée à
chaque lancement d'Excel.

Déployer Morefunc
Les classeurs utilisant Morefunc nécessitent la présence de ce complément pour bien fonctionner.
Pour diffuser Morefunc, vous pouvez évidemment utiliser le programme d'installation. Si vous voulez opter pour
une solution moins lourde, vous pouvez procéder ainsi :
1. Ouvrez l'Editeur VBA (Alt+F11) et double-cliquez sur le module ThisWorkbook du classeur utilisant
Morefunc,
2. Copiez cette procédure dans la fenêtre de code (ou complétez-la si elle est déjà présente) :
Private Sub Workbook_Open()
Workbooks.Open ThisWorkbook.Path & "\Morefunc.xll"
End Sub
Il suffit ensuite de joindre les fichiers Morefunc.xll et Morefunc.ini (à chercher dans le répertoire d'installation du
programme) au classeur concerné. Ces trois fichiers doivent se trouver dans le même répertoire pour que le
complément fonctionne.
Si vous ne souhaitez pas charger automatiquement Morefunc par macro, donnez la consigne au destinataire du
classeur d'ouvrir Morefunc.xll (par le menu Fichier) avant d'ouvrir le classeur.

Une nouvelle page !


Comment personnaliser facilement le ruban d'Excel 2007 ?

Faites un petit tour sur la page Trucs et Astuces !!!


Instructif et intéressant
A voir: Les Trucs et Astuces

Cliquez sur le bouton VBAXL pour voir un tas d'exemples de macros!!! VBAXL

Cette FAQ reprend les questions/réponses faites sur le forum MPFE.


Du moins celles dont le sujet revient régulièrement ou qui ont un contenu particulier ou pédagogique.
Je compte sur vous pour m'envoyer ou m'indiquer celle qui vous semblera digne d'intérêt!!!
Toutes vos remarques sont attendues.
Cette FAQ est ouverte à tous, si vous voulez faire paraître un texte ou un article concernant Excel,
envoyez moi un courriel.
Toutes les procédures, formules ou fonctions sont issues du forum, ou avec autorisation de l'auteur.

NETIQUETTE DU FORUM.
A l'intention des personnes qui viennent pour la première fois sur le forum Microsoft.Public.Fr.Excel
A lire: La Netiquette du Forum MPFE
Vous pourrez en savoir plus sur La Netiquette en consultant notamment ce document :
La Netiquette et Usenet.fr

En bref dans vos courriers:


 Pas de fichiers joints, (Voir le texte de Géo)
 Pas de majuscule,
 Pas de HTML,
 Pas de littérature,
 Pas de signature à rallonge(3 lignes sont un maximum).
 "Si possible, évitez les en-têtes de messages du type "Question à Duschmoll"
(sauf pour les HS éventuellement! ;-).
Les questions posées dans le forum s'adressent à l'ensemble du groupe,
et pas à une personne en particulier." (Simple recommandation de LL le Premier*)
Et approuvé par moi-même!
*LL le Premier: En effet Laurent Longre fût le premier intervenant
(le seul et unique pendant les premiers jours sur le forum.
(Date de création approximative du Forum: juillet 96)
Comme il ne se passait rien, il postait des petits trucs, des formules etc.
Au bout de 2 ou 3 jours, ça a commencé à démarrer tout doucement.
Ceci pour la petite histoire....

Index des Questions/Réponses. Mise à jour du samedi 11 Septembre 2010 à 13h19 [top]

GENERALITES
 Quel est le site archive du forum MPFE?
 Le forum sur "Le site du Support Microsoft France"
 Où trouver un lexique donnant la correspondance
des termes VBA et Fonctions anglais en français?
 Normalisation de l'écriture de code
 Quels sont les paramètres de lancement d'Excel?
 Glossaire des termes et abréviations utilisés sur le forum
 Peut-on joindre des pièces à une question ?
Peut-on répondre par une pièce jointe ?
 Les tableurs: origine
 Excel: Les logos

QUESTIONS RITUELLES
 Combien y a t-il de colonnes disponibles dans Excel?
Les limitations d'Excel 2000
 Conversion de nombre en lettre
 Où trouver un logiciel pour récupérer et /ou réparer un fichier Excel97 endommagé.
 Comment récupérer des données d'un fichier endommagé?
 Comment figer l'écran pendant l'execution d'une macro ?
 Comment supprimer l'apparition du message de confirmation lors de la suppression
d'une feuille ?
 Comment remplacer le point par une virgule ?
 Comment faire des calculs avec les heures négatives ?
 Comment supprimer une liaison vers un autre fichier, sachant que ce fichier a été
supprimé ....?
 Est-il possible de coloriser les onglets sous Excel comme on peut le faire sous
Quattro ?
 Comment faire pour incrémenter un numéro de facture à chaque ouverture d'un
modèle?
 Comment supprimer un module nommé Toto du classeur test.xls?
 Comment Activer Le Num(ou Caps) Lock À Chaque Lancement D' Excel?
 Comment récupérer le nom d'utilisateur d'un poste ?
 Comment utiliser les fonctions Excel dans une procédure Visual Basic?
 Comment supprimer le message "Voulez-vous activer les macros ... ?" au démarrage
d'Excel ?
 Comment changer le logo Excel ?
 Traduction des fonctions Français-Anglais
 Comment utiliser Msmap d'excel 97 avec xl 2003 ?
 Comment utiliser Microsoft Note-It d'Excel 5 avec Excel 2003 ?
 Comment vider le Presse-Papier?

CELLULES ET PLAGES
 Comment trouver la première cellule vide?
 Comment déplacer une sélection?
 Comment remplacer G178 par la valeur de ma variable Ligne dans:
For Each Cell In Range("G2:G178")?
 Je voudrais créer une macro me permettant d'aller à la dernière ligne + 1
d'une colonne X et d'y faire un total ?
 Peut-on paramètrer la police du commentaire avant la création de ce dernier? ?
 Comment enregistrer une plage en fichier html ?
 Comment enregistrer une plage en fichier texte ?
 Existe-il un moyen pour parcourir toutes les cellules de la zone d'impression ?
 Comment masquer toutes les lignes pour lesquelles une cellule particulière est vide ?
 Comment trouver l'adresse de la cellule qui contient la plus grande valeur ?
 Comment connaître la lettre de la colonne et le n° de la ligne ?
 Comment multiplier les éléments d'un tableau et renvoyer ce tableau ?
 Comment utiliser "ReDim" dans un tableau ?
 Comment supprimer certains caractères dans toutes les cellules ?
 Comment rechercher un mot dans toutes les feuilles ?
 Comment rechercher un mot et le remplacer par un autre?
 Comment faire pour insérer une ligne sur deux?
 Comment déplacer ou détruire les lignes contenant une occurence?
 Comment faire clignoter une cellule?
 Quelle est la différence entre UsedRange et CurrentRegion? Denis Martin
 Comment limiter la zone de scroll ?
 Un fond transparent pour une plage de cellule. Daniel.j

DATES
 Comment avoir les dates avant 1900?
 Comment avoir le numéro de la semaine?
 Je recherche à afficher automatiquement le 1er jour du mois d'une cellule...
 "LA" fonction VBA de conversion de date dans le calendrier républicain de Laurent
Longre.
 Comment vérifier si la date inscrite est bien un lundi?
et comment donner le lundi suivant et précédent?
 Comment insérer la date de modification du classeur automatiquement ?
 Comment convertir des données en dates ?
 Astuce facilitant le report de dates entre classeurs n'utilisant pas le même
calendrier ?
 Installer un chronomètre. Papou

FICHIER - FEUILLE
 Comment compter le nombre de feuilles dans un classeur ?
 Comment activer la feuille suivante d'un classeur ?
 Comment copier un classeur complet?
 Comment supprimer tous les fichiers d'un répertoire?
 Puis comment supprimer ce répertoire ?
 Comment protéger et déprotéger une feuille par mot de passe ?
 Comment protéger toutes les feuilles du classeur?
 Comment supprimer tous les noms d'une feuille ou d'un classeur ?
 Comment ignorer les espaces pour transformer les noms de feuilles en hyperliens ?
 Comment fermer tous mes classeurs Excel ouverts à l'exception de 3 ?
 Est-il possible de partager un classeur et de pouvoir aussi utiliser les macros de ce
classeur?
 Comment faire faire une rotation à 90° à un tableau Excel, en conservant les formules
?
 Comment connaître la taille en octet du classeur ?
 Sauvegarde automatique de Thomas Corvaisier
 Comment classer les onglets?
 Comment supprimer les feuilles 1, 2 et celle nommée zaza?
 Comment empêcher l'affichage de la boite de dialogue
"Voulez vous sauvegarder le document?" à la fermeture du fichier ?
 Comment sélectionner les feuilles de l'onglet "Début" à l'onglet "Fin" ?
 Comment se débarrasser d'un fichier?
 Comment supprimer tous les noms définis qui contiennent "Fact"? Daniel.J
 Comment avoir le nom du serveur ? Laurent DAURES
 Comment zipper des fichiers automatiquement? Sébastien KRECKE
 Comment récuperer des données d'un classeur fermé?
 Comment déplacer un fichier?
 Comment fermer un classeur Excel après 15 minutes d'inactivité?

GRAPHIQUES
 Comment juxtaposer histogramme et ligne horizontale? Serge Garneau
 Les droites de régression de Serge Garneau
 Un paquet d'échantillon de Serge Garneau
 Comment tracer une ellipse avec excel ? de Serge Garneau
 Triangle de Pascal à la sauce fractale de Serge Garneau
 Patente triangulaire avec coordonnées 3D quelconques. de Serge Garneau
 Un peu d'arpentage... de Serge Garneau
 Graphique à données variables... de Daniel.J
 Planche de Galton....pour épater !!! de Serge Garneau (Réussi... :O) Dj)
 Graphique et calcul intégral de Serge Garneau
 Créer des courbes le plus facilement du monde de Serge Garneau
 Compilations de notes avec affichage des maudites étiquettes de Serge Garneau
 Ce document permet de miser sur les résultats d'une élection de Serge Garneau
 introduction aux applications possibles d'Excel pour le calcul différentiel et intégral.
de Serge Garneau
 Comment inserer un logo dans tous les graphiques du classeur?
IMPRESSION
 Comment récupérer le nom de l'imprimante active?
 Comment imprimer le fond de page ?
 Comment imprimer des plages discontinues?

OUTIL
 Comment ajouter une fonction au petit menu de la barre d'état
(en bas à droite qui s'affiche sur un clique droit)?
 Comment créer une entrée "Ouvrir avec XL 97" dans le menu contextuel Windows?
 Bouton1 et CommandButton1: DIFFERENCE
 Minimiser toutes les fenêtres
 Comment désinstaller Excel ou un autre logiciel d'Office proprement?
 Une série de boutons "exemples" dans une barre d'outil
 Comment insérer un module et construire une macro dans ce module?
 Comment créer un bouton et y affecter une macro ?
 Comment créer un raccourci Internet par VBA?
 Comment créer un raccourci d'un fichier xls par VBA?
 Comment lister les polices?
 Comment supprimer la barre de tâche Windows?
 Comment exécuter une macro dont le nom est dans une cellule?
 Comment exécuter 2 actions sur un même bouton par alternance?
 Comment réorganiser les fenêtres de l'éditeur VB?
 Comment protéger un classeur à l'ouverture?
 Un menu paramètrable à partir d'une feuille de calcul ! John Walkenbach

USERFORM
 Comment empêcher la fermeture d'un userform avec la croix?
 Pourquoi mettre Load UserForm1 avant la commande UserForm1.Show?
 Comment installer une barre de progression lors de l'exécution d'une macro?
 Comment imprimer une Userform telle qu'elle apparaît à l'écran?
 Comment insérer un gif animé dans un Userform ?
 Comment récupérer la première ligne de texte d'une zone de texte ? MichDenis
 Comment faire pour activer un userform et avoir accès aux feuilles de calcul?
 Attaquer un objet par son nom - John Fuss

EXCEL ET LES AUTRES


 Est-il possible d'utiliser les fonctions Excel tel que loi.student.inversé(i,j) sur
ACCESS ?
 Excel et Word. Pour ouvrir un fichier, écrire. Exécuter une macro....Daniel.J
Et puis voir aussi Word<-->Excel chez http://ericrenaud.free.fr/
 Infos sur PHP et Excel
 Comment récupérer l'adresse IP de la machine?
 Fichiers Multiplan et Excel
 Comment copier des données excel dans word?
 Comment récupérer les attributs de MP3 ?
Et le MAC
 Conseils pour passer un programme VBA de PC vers MAC de Bernard Rey
 Faire cohabiter Excel et AppleScript de Bernard Rey

Test
 Teste si une touche a été tapée pendant l'éxecution d'une macro. Daniel (VBAXL)

TELECHARGEMENT.
 Sauvegarde automatique de Thomas Corvaisier
 Des trucs et astuces issus du forum - Une DOC de J@C
 Construction d'un arbre généalogique. Une macro de JF Campion
 Formules et fonctions par l'exemple. Un classeur de JJ. Hinet
 Plus de 3500 boutons proposés sous forme de macros complémentaires!
 Une simulation d'emprunt!
 Un classeur spécial dates de Frédéric Sigonneau.MAJ du 24/08/01
 Un tableau de couleurs nom et code,très pratique pour les macros. de J.Thiernesse
 Un exemple de barre de progression de John Walkenbach
 Un petit classeur exemple de conversion Francs/Euros
 Une macro complémentaire Francs/Euros de Pascal Robin.MAJ 26/12/01
 Macro de conversion Francs/Euros de Daniel FIEUX
 Des exemples simples de procédures événementielles
 Graphique 3D
 Fonctions EXCEL V.1.0 de Jean Pierre Costa
 Multiplication musulmane
 Le Bouromètre (Mesure du taux d'alcool dans le sang)
 Affichage dynamique des fichiers récents de Patrick Penet
 Graphique: Echantillonnage de Serge Garneau
 Statistiques: Fonctions de base de Serge Garneau
 Un ensemble de procédures et de fonctions complémentaires de Philippe Noss
 Des exemples des propriétés TextBox de Benoît Cornille
 Elucubration arithmétique et boîte de boutons de Serge Garneau
 FunCustomize: Permet de personnaliser les fonctions VBA dans l'assistant fonctions.
Laurent Longre

Haut du formulaire

Rechercher

Web dj.joss.free.fr

xcell05.free.fr
Bas du formulaire

GENERALITES
Quel est le site archive du forum MPFE?
Site archive du forum MPFE
Deja.com a rendu l'âme et vendu ses fichiers à google!
http://groups.google.com/advanced_group_search
Le forum sur "Le site du Support Microsoft France"
http://www.microsoft.com/france/excel/newsgroup/default.asp
Où trouver un lexique donnant la correspondance
des termes VBA et Fonctions anglais en français?
Pour Excel 97 : ..\Office\listevba.xls
Pour Excel 2000 : ..\Office\1036\vbalist.xls
Pour Excel 2002 (XP) : ..\Office10\1036\vbalist.xls
Normalisation de l'écriture de code

normcode.zip 2 ko Texte de Guy Moncomble (Ecrit sur le forum Word).


Quels sont les paramètres de lancement d'Excel ?
http://xcell05.free.fr/pages/prog/parametres.htm
Peut-on joindre des pièces à une question ? Peut-on répondre par une pièce jointe ?
Un texte de Geo!
Voici quelques règles de bonne conduite :

1- Les pièces jointes ne sont pas souhaitées par un grand nombre d'internautes car elles sont
rapidement volumineuses (surtout si c'est un classeur Excel) et reçues par des centaines de personnes
qui n'en ont rien à faire et ne l'ouvriront même pas en raison du risque de virus ou parce que la
question ne les intéresse pas. Les tarifs des opérateurs de télécoms tiennent forcément compte des
volumes (certains services "illimités" ont fermé pour avoir ignoré cette loi du marché) quoi qu'on en
dise.

2- Une question doit être expliquée, on ne peut se contenter d'envoyer un classeur en disant "corrigez-
moi ça", le lecteur peut se sentir agressé qu'on lui balance ce "devoir à faire" sans même s'être donné
la peine d'exposer le pb. Ceux qui ne chargent pas les pièces jointes n'ont d'ailleurs même pas la
question.

3- Un texte de macro recopié dans le message occupe peu de place, c'est la solution idéale. Si la
macro est entière et que son texte soit long (ou pour éviter que les lignes ne soient saucissonnées en
raison de la limitation des longueurs de lignes) l'exporter en .bas. Il occupe alors peu de volume et
sera alors toléré par les abonnés au forum. De plus il ne comporte pas de risque de virus tant qu'on ne
l'a pas exécuté.

4- On ne transmet un classeur qu'aux personnes qui l'ont sollicité (et accepté de prendre ce risque), il
est souhaitable dans ce cas d'utiliser les logiciels de compression; le format zip est quasi universel
maintenant.

Quand il s'agit d'une réponse, on la fait directement à la personne concernée et on met un message
sur le forum pour indiquer que la réponse a été donnée en bal. Si une autre personne est intéressée
elle sollicitera aussi la réponse.
Les tableurs: Origine
Au début était Visicalc de Dan Bricklin et Bob Frankston. En 1979 !!!
Ensuite Lotus 1.2.3
Et puis en 1988 Excel pour PC qui supplanta 1.2.3.
Les differentes versions d'excel
A l'origine, Microsoft a commercialisé un tableur appelé Multiplan en 1982.

Il n'y a pas eu de version 1.0 pour éviter la confusion avec la version d'Apple.
1987 - Excel 2.0 for Windows
1990 - Excel 3.0
1992 - Excel 4.0
1993 - Excel 5.0
1995 - Excel pour Windows 95 (version 7.0) – inclut aussi dans Microsoft Office 95
1997 - Excel 97 (version 8.0) - inclut aussi dans Microsoft Office 97
1999 - Excel 2000 (version 9.0) inclut aussi dans Office 2000
2001 - Excel 2002 (version 10) inclut aussi dans Office XP
2003 - Excel 2003 (version 11) inclut aussi dans Office 2003
2007 - Excel 2007 (version 12) inclut aussi dans Office 2007
[index]

QUESTIONS RITUELLES
Combien y a t-il de colonnes disponibles dans Excel?
256 colonnes et c'est tout !!!
Mais 65536 lignes.

Les limitations d'Excel 2000.


Et pour les autres versions et bien...consulter l'aide:
Taper "limites d'Excel" et consulter: Configuration requise pour Microsoft Excel.
Conversion de nombre en lettre
Au choix:
http://xcell05.free.fr/pages/telecharge/index.html (fonction NUMTEXTE) MoreFun
http://perso.wanadoo.fr/frederic.sigonneau/office/Nb2Words.zip
http://www.fundp.ac.be/~jmlamber/
http://www.cybercable.tm.fr/~pnoss/Chiffre_Lettre.bas
http://dj.joss.free.fr/nblettre_svm.htm
Où trouver un logiciel pour récupérer un fichier Excel97 endommagé.
Il faut utiliser un utilitaire de récupération de fichier comme celui de Microsoft
http://www.microsoft.com/IntlKB/France/articles/
ou
http://www.microsoft.com/france/support/data/Visioxl8.exe
ou cleaner.xla à télécharger sur:
http://www.microsoft.com/france/support/data/recover.exe
ou version démo de officerecovery à télécharger sur:
http://www.officerecovery.com/excel/

Comment récupérer des données d'un fichier endommagé?


Voilà quelques méthodes de récupération de données:
Enregistrez le fichier au format HTML
Utilisez des références externes pour créer des liens vers le fichier endommagé.
Si vous pouvez ouvrir le fichier, enregistrez-le au format SYLK (Symbolic Link).
Utilisez la macro de récupération de fichiers Microsoft Excel.(Office XP)
Ouvrez le document sous Microsoft Word.
Ouvrez le fichier dans la visionneuse Microsoft Excel.
Ouvrez le fichier avec Open Office. Vous pourrez ainsi recuperer aussi vos macros

Comment figer l'écran pendant l'execution d'une macro ?


Mettre en début de code l'instruction suivante :
Application.ScreenUpdating = False

Comment supprimer l'apparition du message de confirmation lors de la suppression d'une


feuille ?
Application.DisplayAlerts=False
Sheets(x).Delete
Comment remplacer le point par une virgule ?
=CNUM(SUBSTITUE(A1;".";","))

Comment faire des calculs avec les heures négatives ?


- Tu passes au calendrier depuis 1904
(Outils Options [Calcul] et cocher Calendrier depuis 1904).
C'est le plus simple mais attention : aux copier-coller entre classeurs, aux formules de calcul
sophistiquées
de travail sur les dates, à l'utilisation de VBA...

- Tu calcules avec un si et la fonction texte comme par exemple:


=si(B1(A1;"-";"")&TEXTE(ABS(B1-A1);"hh:mm:ss")
mais tu récupères du texte, sur lequel tu ne peux plus calculer ensuite.

- Tu passe en heures décimales en multipliant par 24 et en affichant au format standard,


mais tu n'as plus l'affichage hh:mm:ss, et bonjour la lisibilité :-(((

- Mais un tour sur la page "dates/heures" de Laurent reste indispensable!


http://xcell05.free.fr/pages/form/dateheure.htm

Comment supprimer une liaison vers un autre fichier, sachant que ce fichier a été
supprimé ....?
Téléchargez FinLink.zip qui ce trouve sur le site de Stephen Bullen à l'adresse:
http://www.oaltd.co.uk/MVP/Default.htm

Ou à la main :
Dans le classeur lié :Edition/Liaisons/Modifier la source
Donner le chemin du classeur (celui qui contient les formules avec liaison)
Cela supprimera la liaison avec l'autre classeur.
Est-il possible de coloriser les onglets sous Excel comme on peut le faire sous Quattro ?
NON...Impossible pour l'instant! ni avec 97 ni avec 2000
Excel 2010..vous dites ?! Ah Bon ?
C'est maintenant possible avec la version "XP" ou 2002 (v. 10)...

Comment faire pour incrémenter un numéro de facture à chaque ouverture d'un modèle?
Ci-dessous une solution qui suppose que ton modèle ("Fact.xlt" dans le code
ci-dessous) contienne une cellule nommée (Insertion\Nom\Définir) "numFact", cellule
où s'inscrira le numéro incrémenté.

A l'ouverture d'un classeur basé sur le modèle ("Fact1.xls"), la cellule "numFact"


est incrémentée et le classeur est réenregistré comme modèle "Fact.xlt", écrasant le
précédent et sauvegardant ainsi le nouveau numéro.

A la fermeture, si le classeur "Fact1.xls" n'a pas été enregistré, on considère que


le numéro de facture n'a pas servi. Le modèle est réouvert et la cellule "numFact"
est décrémentée pour proposer à la création du prochain classeur basé sur le modèle
un numéro de facture "cohérent" avec les précédentes factures enregistrées.

Private Sub Workbook_Open()


If ActiveWorkbook.Path = "" Then
[numFact] = [numFact] + 1
ActiveWorkbook.Saved = True
ActiveWorkbook.SaveCopyAs(Application.TemplatesPath & "Fact.xlt")
End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)


chemXlt = Application.TemplatesPath & "Fact.xlt"
If ActiveWorkbook.Path = "" Then
Set wbk = Workbooks.Open(chemXlt)
With wbk.ActiveSheet
.Range("NumFact") = .Range("NumFact") - 1
End With
wbk.Close True
End If
End Sub

Frédéric S.

Comment supprimer un module nommé Toto du classeur test.xls?


Sub Supprime_Module()
Workbooks.Open "C:\Temp\Test.xls"
On Error Resume Next
With ActiveWorkbook.VBProject.VBComponents
.Remove .Item("Toto")
End With
On Error GoTo 0
End Sub

Comment supprimer tout le code du classeur actif ?


Sub SupprToutCodeVBA()
'L Longre, mpfe
Dim VBC As Object
With ActiveWorkbook.VBProject
For Each VBC In .VBComponents
If VBC.Type = 100 Then
With VBC.CodeModule
.DeleteLines 1, .CountOfLines
.CodePane.Window.Close
End With
Else: .VBComponents.Remove VBC
End If
Next VBC
End With
MsgBox "Modules et macros du classeur actif supprimées.", _
vbInformation
End Sub

Comment activer le Num(ou Caps) lock à chaque lancement d' Excel?


Private Declare Function SetKeyboardState Lib "User32" _
(kbArray As Byte) As Long

Private Declare Function GetKeyboardState Lib "User32" _


(lpKeyState As Byte) As Long

Sub TestLock()
Dim KeyState(0 To 255) As Byte
GetKeyboardState KeyState(0)
KeyState(&H90) = 1 'Num Lock
'KeyState(&H14) = 1 'Caps Lock
SetKeyboardState KeyState(0)
End Sub

Comment récupérer le nom d'utilisateur d'un poste ?


Declare Function GetUserName Lib "ADVAPI32.DLL" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long

Function UserName()
Dim S As String
Dim N As Long
Dim Res As Long

S = String$(200, 0)
N = 199
Res = GetUserName(S, N)
UserName = Left(S, N - 1)
End Function

Comment utiliser les fonctions Excel dans une procédure Visual Basic ?
Il faut passer par l'objet WorksheetFunction.
Par exemple, l'utilisation de la fonction MIN:

Sub UseFunction()
Dim maPlage As Range
Set maPlage = Worksheets("Feuil1").Range("A1:C10")
réponse = Application.WorksheetFunction.Min(maPlage)
MsgBox réponse
End Sub

Tout ceci est très bien expliqué dans l'aide:


Utilisation des fonctions de feuille de calcul Microsoft Excel dans Visual Basic
Philippe P.

Comment supprimer le message "Voulez-vous activer les macros ... ?" au démarrage
d'Excel ?
Menu "outils"-"macro"-"sécurité"-"niveau de sécurité"-niveau bas

Avec Excel 2000 on peut conserver le niveau de sécurité haut


en utilisant Selfcert.exe pour certifier les macros.
Normalement, SelfCert s'installe avec office 2000. Il se trouve dans
le répertoire '...\Microsoft office\office\selfcert.exe'.
Une fois le certificat créé, signez le projet VBA par: Menu Outils/Signatures électroniques
cliquez sur 'Choisir...' et sélectionnez le certificat. Le message n'apparaîtra plus.

Comment changer le logo Excel ?


La procédure de Laurent:
http://xcell05.free.fr/pages/api/logo.htm

Traduction des fonctions Français-Anglais

Télécharger ces classeurs:VBALIST.XLS et TRADUCFCT.XLS fctbrfr.zip 78 ko

Comment utiliser Msmap d'excel 97 avec xl 2003 ? Fonctionne aussi avec Excel 2007

A- Récupérer et copier le répertoire Datamap d'excel 97 dans :


C:\Program Files\Fichiers communs\Microsoft Shared

B-Lancer MSMAP.exe (du répertoire datamap)


à la demande du dossier Données répondre:
C:\Program Files\Fichiers communs\Microsoft Shared\Datamap\Data

C-Pour l'utiliser dans excel:


Faire Insertion=>Objet=>Nouvel objet
Sélectionner Microsoft MAP dans la liste
RaMa
DATAMAP
Datamap.zip 2140 ko

Comment utiliser Microsoft Note-It d'Excel 5 avec Excel 2003 ?


( fonctionne aussi avec XL 2002, Xl 97 et Windows 98)
Sur la demande de JPS ... Daniel.j

Microsoft Note-It est un petit utilitaire fonctionnant avec Excel 5 et Windows 3.1
servant à ajouter des commentaires (des notes) dans une feuille de calcul.
L'ancêtre des commentaires et annotations en quelques sortes.
Le petit avantage réside dans le fait qu'une image est associée au commentaire
(ce qui peut agrémenter de manière sympathique votre feuille de calcul)
et qu'un double clique sur cette image affiche le commentaire, il est aussi possible d'affecter une
macro à cette image.
1) Téléchargez l'archive ci-dessous composée des 3 fichiers: note-it.exe, note-it.help et note-it.reg.

noteit.zip 37 ko

2) Créez un dossier Note-It dans :


C:\Program Files\Fichiers communs\Microsoft Shared\
et copiez ces 3 fichiers dans ce dossier.

3) Ouvrez le fichier de registre "note-it.reg" avec le bloc-note et vérifiez que la portion de ligne en
italique corresponde bien avec l'emplacement du fichier note-it.exe. :
HKEY_CLASSES_ROOT\Note-It\protocol\StdFileEditing\server = C:\Program Files\Fichiers
communs\Microsoft Shared\Note-It\NOTE-IT.EXE
Fermez et enregistrez.

4) Double-cliquez sur le fichier "note-it.reg" pour le fusionner avec votre base de registre.
Sauvegardez par prudence votre base de registre si vous le désirez.
Les manipulations décrites ci-dessus sont sans risque.

5) Lancez Excel et pour utiliser Note-It faites Insertion=>Objet=>Microsoft Note-It.

Comment vider le Presse-Papier?


Application.CutCopyMode=False

Ou bien

Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Sub VidePP()
OpenClipboard 0
EmptyClipboard
CloseClipboard
End Sub
[index]

CELLULES ET PLAGES

Comment trouver la première cellule vide?


Méthode 1:
ActiveCell.End(xlDown)(2).Select
ou ActiveCell.End(xlToRight)(1, 2).Select

Méthode 2:
[A65536].Select
Selection.End(xlUp)(2).Select

Méthode 3:
Range("A1").Select
While IsEmpty(ActiveCell) = False
ActiveCell.Offset(1, 0).Activate
Wend

Comment déplacer une sélection?


Selection.Offset(+/-nb de lignes,+/- nb de colonnes).Select
Comment remplacer G178 par la valeur de ma variable Ligne dans:
For Each Cell In Range("G2:G178")?
For Each Cell In Range("G2:G" &maLigne)

Exemple de variable pour une somme


I = 10
Range("A1").FormulaLocal = "=SOMME(A2:A" & I & ")"

Je voudrais créer une macro me permettant d'aller à la dernière ligne + 1


d'une colonne X et d'y faire un total ?
Par exemple, pour mettre la somme des cellules A2:Ax (Ax = dernière
cellule remplie de la colonne A):

With Range("A2", [A:A].Find("*", [A1], , , , xlPrevious))


.Item(.Count + 1).Formula = "=SUM(" & .Address(0, 0) & ")"
End With

Peut-on paramètrer la police du commentaire avant la création de ce dernier?


Sub AjoutCommentaire()
With ActiveCell.AddComment.Shape.OLEFormat.Object
.Text = ""
.Font.Name = "Times New Roman"
.Font.Size = 14
End With
SendKeys "%IM"
End Sub

'S'il s'agit de modifier la taille de la police a posteriori dans tous les


commentaires du classeur:

Sub ModifCommentaires()
Dim Wksht As Worksheet, C As Comment
For Each Wksht In Worksheets
For Each C In Wksht.Comments
C.Shape.OLEFormat.Object.Font.Size = 12
Next C
Next Wksht
End Sub

Des infos:
http://touareg.citeweb.net/aideinformatique/actioncellule.htm

Comment enregistrer une plage en fichier html?


http://dj.joss.free.fr/web.htm#fichhtml

Une nouvelle rubrique Excel et le HTML :


http://jacxl.free.fr/cours_xl/accueil.html

Comment enregistrer une plage en fichier texte?

Enregistrement d'une plage xl en txt

Existe-il un moyen pour parcourir toutes les cellules de la zone d'impression ?


For Each Cellule In Range(ActiveSheet.PageSetup.PrintArea)
Comment masquer toutes les lignes pour lesquelles une cellule particulière est vide ?
For Each ligne In ActiveSheet.UsedRange.Rows
If ligne.Cells(1, 12).Value = Empty Then
'si la cellule de la colonne L est vide, la ligne est masquée
ligne.EntireRow.Hidden = True
End If
Next

Et pour les colonnes:

For Each col In ActiveSheet.UsedRange.Columns


If col.Cells(2, 1).Value = Empty Then
'si la cellule de la ligne 2 est vide, la colonne est masquée
col.EntireColumn.Hidden = True
End If
Next

Comment trouver l'adresse de la cellule qui contient la plus grande valeur ?


Sub MaxAdr()
valrech = Application.WorksheetFunction.Max(Range("A1:B30"))
Set cellmax = Range("A1:B30").Find(valrech)
MsgBox cellmax.Address
End Sub

Comment connaître la lettre de la colonne et le n° de la ligne?


Pour le numéro de la colonne: colonne = ActiveCell.Column

Colonne = Left$(ActiveCell.Address(0, 0), (ActiveCell.Column < 27) + 2)


Ligne = ActiveCell.Row
Mais pourquoi ( <27) +2 ???
et la fonction Split
= Split(ActiveCell.Address, "$")(1)
Laurent peut nous expliquer ce que c'est ???

La réponse de Laurent, Catherine et Eric

Une petite contribution à la recherche de la lettre de colonne, histoire de varier les plaisirs !
sub cherchCOL()
MsgBox Mid(ActiveCell.Address, 2, InStr(2, ActiveCell.Address, "$") - 2)
end sub
AV

Comment multiplier les éléments d'un tableau et renvoyer ce tableau ?


Sélectionner votre tableau au préalable!

Sub Tabx2()
Dim myTab As Variant
Dim y As Integer
Dim x As Integer

myTab = Selection.Value
'Boucle pour chaque colonne
For y = LBound(myTab, 2) To UBound(myTab, 2)
'Boucle pour chaque ligne
For x = LBound(myTab, 1) To UBound(myTab, 1)
'Multiplie chaque élément de la sélection par 2
myTab(x, y) = myTab(x, y) * 2
Next x
Next y
'Renvoie le tableau dans la sélection
Selection.Value = myTab
End Sub

Comment utiliser "ReDim" dans un tableau ?


Voilà un exemple
Cette macro garde en mémoire les valeurs entrées et les affiche ensuite.
Appuyer sur la touche "Echap" pour arrêter les entrées

Sub InputTab()
Dim NbValeur As Integer
Dim Item As Variant
Dim myTab() As Integer
ReDim myTab(0) 'Initialisation du tableau
Do
NbValeur = Application.InputBox("Tapez un nombre", Type:=1)
myTab(UBound(myTab)) = NbValeur
ReDim Preserve myTab(UBound(myTab) + 1)
Loop Until NbValeur = False

'Annulation de l'initialisation
ReDim Preserve myTab(UBound(myTab) - 1)

'Affichage des valeurs entrées


For Each Item In myTab
If Item <> False Then MsgBox "Vous avez entré " & Item
'Inscrit les valeurs entrées dans la colonne B
compteur = compteur + 1
ActiveSheet.Range("B" & compteur).Value = Item
Next
End Sub
Comment supprimer certains caractères dans toutes les cellules ?

Une petite page sur cette procèdure.


Comment rechercher un mot dans toutes les feuilles ?

Une petite page sur cette procèdure.


Comment rechercher un mot et le remplacer par un autre? Denis Michon

Une petite page sur cette procèdure.


Comment faire pour insérer une ligne sur deux?
'Une petite macro paramétrable de Pierre Fauconnier

Sub InsererLignes()

Dim LigneDebut As Long, LigneFin As Long


Dim Ligne As Long
Dim Pas As Long

' DEBUT ZONE PARAMETRES


' Paramétrisation de la macro
LigneDebut = 1 ' A adapter
LigneFin = 20 ' A adapter
Pas = 2 ' A adapter
' FIN ZONE PARAMETRES

'On commence à insérer à lignedebut+1


Ligne = LigneDebut + 1
Do While Ligne <= LigneFin
Rows(Ligne & ":" & Ligne + Pas - 1).Insert shift:=xlDown
' on saute "Pas"+1 lignes pour se positionner sur la nouvelle
' ligne avant laquelle on insère
Ligne = Ligne + Pas + 1
' On adapte LigneFin à Lignefin+"Pas"
' puisqu'on a inséré "Pas" lignes
LigneFin = LigneFin + Pas
Loop
End Sub
Comment déplacer ou détruire les lignes contenant une occurence?

Une petite page de Pat sur cette procèdure.


Comment faire clignoter une cellule? Daniel.J
Sub Clignot()
Range("A1").Select

For compteur = 1 To 20
With Selection.Font
.Name = "Arial"
.Size = 14
.ColorIndex = 2
End With
Application.Wait Now + TimeValue("00:00:01")
'Pour augmenter la vitesse du clignotement
'Application.Wait Now + (TimeValue("00:00:01")) / 2

With Selection.Font
.Name = "Arial"
.Size = 14
.ColorIndex = 0
End With
Application.Wait Now + TimeValue("00:00:01")
Next
End Sub

'Ex de Valeur de ColorIndex:


'1= noir, 2= blanc, 3= rouge, 4= vert,5= bleu, 6= jaune
Et un très bon truc de Bill Manville
Combiner les styles et une macro Application.OnTime

'To create a blinking cell:

'If you define a new Style (Format / Style / Flash/ Add ) and apply
'that style to the cells you want to flash, paste the following code
'into a module sheet and run the procedure Flash from Auto-Open if
'desired you will get the text flashing alternately white and red.

Dim NextTime As Date

Sub Flash()
NextTime = Now + TimeValue("00:00:01")
With ActiveWorkbook.Styles("Flash").Font
If .ColorIndex = 2 Then .ColorIndex = 3 Else .ColorIndex = 2
End With
Application.OnTime NextTime, "Flash"
End Sub

Sub StopIt()
Application.OnTime NextTime, "Flash", schedule:=False
ActiveWorkbook.Styles("Flash").Font.ColorIndex = xlAutomatic
End Sub
Quelle est la différence entre UsedRange et CurrentRegion? Denis Martin
Voyons la différence entre UsedRange et CurrentRegion
en posant l'hypothèse que la feuille "Feuil1" contient 4 plages de cellules différentes, à savoir:

A1:D9
B12:D14
E18:G24
H14:J16

UsedRange
UsedRange permet de sélectionner une plage de cellules qui comporte des plages de cellules
discontinues.

Précision de AV:
Il serait peut-être bon d'ajouter que le "UsedRange" délimite la plage en
incluant les cellules vides si celles-ci ont été formatées d'une façon
quelconque (même si ont les remet au format standard ensuite...), ce qui, dans
certaines manips sur les plages, ne manque pas de réserver qques surprises ;-)
AV

Sub testUsedRange()
Worksheets("Feuil1").Activate
ActiveSheet.UsedRange.Select
'// Permet de sélectionner la plage de cellules A1:J24
'// qui inclut nos 4 plages de cellules discontinues contenues dans la feuille Feuil1..
End Sub

CurrentRegion
CurrentRegion permet de sélectionner la plage de cellules où se trouve le pointeur de cellule
si celui-ci est situé dans cette plage de cellules.
Si le pointeur de cellule est situé sur une cellule contigüe à la plage de cellules,
alors la plage de cellules et les cellules contigües aux rangées ou aux colonnes de cette plage
qui sont situées sur la même rangée ou colonne du pointeur de cellule sont sélectionnées.
Si le pointeur de cellule est situé à l'intersection d'une colonne et d'une rangée contigües à la plage de
cellules,
alors la plage de cellules, la colonne et la rangée situées sur la même rangée ou colonne du pointeur
de cellule sont sélectionnées.

EXEMPLES (en tenant compte des hypothèses ci-dessus) :

Position du pointeur de cellules Plage de cellules sélectionnée


B5 A1 : D9
G24 E18 : G24
D14 B12 : D14
E5 A1 : E9
B10 A1 : D10
E10 A1 : E10
G17 E14 : J24
H17 E14 : J24

sheets("Feuil1").Activate
eCell.CurrentRegion.Select '// Ici, ActiveCell fait référence au pointeur de cellules.

ment limiter la zone de scroll?


eSheet.ScrollArea = "A1:H20"

ur rétablir:
ActiveSheet.ScrollArea = ""
Une image transparente pour une plage de cellule. Daniel.j
Excel 2003 - L'astuce consiste à insérer une image vide et transparente
(un gif transparent créer avec Photoshop par exemple)
et de la remplir avec l'image qui servira de toile de fond à la plage de cellule.
Il est en plus tout a fait possible de modifier par la suite les cellules de la plage
en les sélectionnant avec les touches de direction du clavier.
Téléchargez le fichier, vous y trouverez la marche à suivre et un exemple.

fondtransparent.zip 32 ko

DATES

Comment avoir les dates avant 1900?


Oui, c'est possible, il suffit d'acquérir une macro complémentaire.
http://officeupdate.microsoft.com/info/3rdExcel8.htm
qui renvoie vers :
http://www.j-walk.com/ss/excel/files/xdate.htm

Comment avoir le numéro de la semaine?


=ENT((D-SOMME(MOD(DATE(ANNEE(D-MOD(D-2;7)+3);1;2);{1E+99;7})*{1;-1})+5)/7)
Elle marche pour toutes les dates "D", sauf le 1/1/1900 (=> #NOMBRE!).
de Laurent

Une explication détaillée sur le numéro de semaine par Laurent Longre.


Et une Fonction VBA calculant le N° de semaine d’une date quelconque.(en fin de page)
Exercice, en amicale réponse à LAURENT LONGRE dont j’ai apprécié la belle formule, traitant du même
sujet,
avec ses 15 pages d’explications très précises. Bravo à lui.Yves Chevalier

Je recherche à afficher automatiquement le 1er jour du mois d'une cellule...


Exemple pour A1 : =DATE(ANNEE(A1);MOIS(A1);1)
Et pour avoir le jour en toute lettre : Format= jjjj

Plus court
Pour trouver le 1er jour du mois:
=A1-JOUR(A1)+1
Un appel de fonction au lieu de trois avec =DATE(ANNEE(A1);MOIS(A1);1)
Daniel M.

"LA" fonction VBA de conversion de date dans le calendrier républicain de Laurent Longre.
http://xcell05.free.fr/pages/form/dateheure.htm

Comment vérifier si la date inscrite est bien un lundi?


et comment donner le lundi suivant et précédent?
Sub TestJour()
datedujour = Range("a1").Value
If Weekday(datedujour) = 2 Then
MsgBox "Le " & datedujour & " est bien un lundi"
Else
LundiNext = DateValue(datedujour) + 9 - Weekday(datedujour)
LundiPrev = DateValue(datedujour) + 9 - Weekday(datedujour) - 7
MsgBox "Le " & datedujour & " n'est pas un lundi" & Chr(10) & Chr(10) & _
"Le lundi suivant est le : " & LundiNext & Chr(10) & _
"Le lundi précédent est le: " & LundiPrev, vbOKOnly + vbCritical, "Test du Jour"
End If
End Sub

Précision de Daniel M.
Dans TestJour(), les algos pour trouver les Lundi suivant/précédent ne
fontionnent pas avec une date de départ le dimanche.
Il vaut mieux:

Sub TestJour2()
Dim DateDuJour As Date, LundiNext As Date, LundiPrev As Date
DateDuJour = CDate(Range("A1").Value)
If Weekday(DateDuJour) = 2 Then
MsgBox "Le " & DateDuJour & " est bien un lundi."
Else
LundiPrev = DateDuJour - Weekday(DateDuJour - 2)
LundiNext = DateDuJour + 7 - Weekday(DateDuJour - 2)
MsgBox "Le " & DateDuJour & " n'est pas un lundi." & vbNewLine &
vbNewLine & _
"Le lundi précédent est le: " & LundiPrev & vbNewLine & _
"Le lundi suivant est le: " & LundiNext, vbOKOnly, "Test du Jour"
End If
End Sub

Comment insérer la date de modification du classeur automatiquement ?

13 règles d’or pour gérer vos données sur Excel


Bonjour à tous,
L’utilisation d’Excel comme gestionnaire de données est une situation extrêmement fréquente… Rappelons tout
d’abord qu’à l’origine, Excel n’est pas fait pour stocker des données, mais pour faire des calculs ! Cependant,
les usages l’ont très rapidement transformé en outil de gestion de bases de données (une ou plusieurs
tables/listes/tableaux de données), et les récents développements d’Excel permettant le stockage de plusieurs
millions de lignes vont encore accélérer ce mouvement. Je pense personnellement qu’Excel est dans de
nombreuses situations un excellent outil de gestion de données, A CONDITION de respecter un certain nombre
de règles!
Je vous présente donc ici ma sélection des 13 règles d’or pour utiliser Excel comme table de données !
Récapitulatif des règles
Règle 1 – Une feuille = une table de données et surtout rien d’autre
Règle 2 – Dans la première ligne : uniquement et seulement les titres de colonnes
Règle 3 – Pas de cellules vides dans les titres de colonnes
Règle 4 – Pas de doublons dans les titres de colonnes
Règle 5 – Une clef primaire dans la première colonne
Règle 6 – Pas de lignes et colonnes vides
Règle 7 – Ne pas ajouter de totaux, sous-totaux et calculs intermédiaires
Règle 8 – Utiliser les filtres automatiques
Règle 9 – Éviter d’avoir plusieurs colonnes pour une même dimension
Règle 10 – Positionner les données numériques et les calculs dans la partie droite de la table
Règle 11 – Utiliser les tableaux d’Excel
Règle 12 – N’utiliser qu’une seule formule par colonne
Règle 13 – Utiliser l’outil de validation des données
Règle 1 – Une feuille = une table de données et surtout rien d’autre retour
Il est indispensable que chaque table occupe une feuille, et rien qu’une feuille. En effet, avoir deux tables sur la
même feuille de calcul est potentiellement très dangereux. Par exemple, vous courrez le risque de supprimer
par inadvertance des lignes appartenant aux deux tables.

Règle 2 – Dans la première ligne : uniquement et seulement les titres de colonnes retour
La première ligne de la feuille contient toujours et uniquement les titres et doit se trouver en ligne 1 :

Si vous voulez ajouter des boutons, des grands titres ou d’autres informations, augmentez la hauteur de la
première ligne et ajoutez un cadre blanc au dessus (outils de dessin) pour améliorer la lisibilité et la navigation
dans le fichier. On se trouve alors sur un autre plan que les données et ceci fonctionne correctement :
Encore une fois, l’idée est de n’avoir que les données sur la feuille au niveau des cellules, et rien d’autre.
Règle 3 – Pas de cellules vides dans les titres de colonnes. retour
En effet, vous perdez l’information concernant le contenu de la colonne et en plus, vous ne pourrez pas utiliser
correctement les tableaux croisés dynamiques.
Un corollaire de cette règle est de ne JAMAIS utiliser de cellules fusionnées, que ce soit pour les titres de
colonnes ou à l’intérieur de la table.

Règle 4 – Pas de doublons dans les titres de colonnes retour


Afin de garantir que chaque colonne désigne un élément spécifique, il faut se garder d’utiliser le même nom de
colonnes deux fois.

Règle 5 – Une clef primaire dans la première colonne retour


Lorsqu’on construit une table dans un gestionnaire de données de type Access, on ajoute toujours une clef
primaire à cette table. Cette clef n’existe pas dans Excel, donc il est indispensable de l’ajouter manuellement (ou
automatiquement avec VBA). On choisira une clef qui s’auto-incrémentera lors de l’ajout d’une nouvelle ligne.

Aucune cellule vide dans cette colonne ne doit exister, en d’autres termes, chaque ligne doit avoir une clef. Ceci
permettra d’effectuer un comptage du nombre de lignes (fonction nombre dans les tableaux croisés
dynamiques), ou encore de retrouver rapidement une fiche papier si la base a été saisie à partir de données
papier.

Dans le cas où vous utilisez des noms dynamiques, cela permet aussi de définir la hauteur d’une table de
données (plus d’information sur les noms dynamiques
ici :http://www.polykromy.com/html/poly_main_cours_decaler.html).
Règle 6 – Pas de lignes et colonnes vides retour
En laissant une ligne ou une colonne vide, vous risquez de ne travailler que sur une partie de la table
(reconnaissance automatique de la table par Excel).

Règle 7 – Ne pas ajouter de totaux, sous-totaux et calculs intermédiaires retour


En ajoutant ces calculs dans la feuille contenant les données, vous courrez le risque que ceux-ci soient
comptabilisés dans des tableaux croisés dynamiques ou dans d’autres calculs effectués sur des colonnes
entières.

Règle 8 – Utiliser les filtres automatiques retour


L’utilisation des filtres automatiques permet de travailler directement sur toute la table de données sans se poser
des questions. Ceci est particulièrement utile pour filtrer les données (évidemment), mais aussi pour créer des
tableaux croisés dynamiques ou encore pour trier les données par ordre alphabétique.
Rappel : aller dans l’onglet (ou le menu) données, puis choisir filtres automatiques
Règle 9 – Éviter d’avoir plusieurs colonnes pour une même dimension retour
Vous pouvez retrouver une explication détaillée et en vidéo ici : http://www.xlerateur.com/?p=496
Un exemple classique est la création de nouvelles colonnes pour chaque nouveau mois. Ceci indique en
général un problème dans la structure des données et surtout, cela va complexifier les calculs et les
comparaisons par mois. Dans de tels cas, il vaut mieux restructurer la table pour mettre la date dans une seule
colonne (sauf cas particulier).

Règle 10 – Positionner les données numériques et les calculs dans la partie droite de la tableretour
De manière générale, on met les données numériques et les calculs à droite de la table de données. Ceci
permet de localiser rapidement les calculs, mais aussi de respecter une certaine logique dans la lecture des
informations. Finalement, lors de la construction d’un tableau croisé dynamique, cela permet de plus facilement
créer des tableaux complexes.
De manière assez logique, on essaiera aussi de faire en sorte que l’enchainement des formules se fasse de
gauche à droite. Ceci permet d’améliorer la vitesse d’exécution ainsi que la lisibilité des formules (et donc
d’éviter des erreurs).
Règle 11 – Utiliser les tableaux d’Excel retour
Introduit et enrichit progressivement au fur et à mesure des versions d’Excel, l’utilisation des tableaux (autrefois
appelés Liste sous 2003) s’avère relativement efficace notamment pour saisir des données directement dans le
tableau. Voici comment les mettre en place :
- 2003 : Menu données, puis Liste
- 2007 : Sélectionnez votre plage de données, puis dans l’onglet Accueil, choisir Mettre sous forme de tableau

Règle 12 – N’utiliser qu’une seule formule par colonne retour


Si la base est bien structurée, il est recommandé de n’utiliser qu’une seule formule pour toute la colonne,
formule qui sera recopiée sur toute la colonne de la table. Cela permet entre autres, d’éviter des corruptions de
données.

Règle 13 – Utiliser l’outil de validation des données retour


La validation des données sous Excel est un outil très puissant qui permet de vérifier par exemple que des dates
ont bien été saisies, que les valeurs rentrées appartiennent à une liste, ou encore qu’une valeur se trouve entre
un maximum et un minimum. Faire un cours complet sur cette fonctionnalité prendrait une journée, tant elle est
puissante.
Voici un exemple permettant d’ ajouter une liste à une colonne. Tout d’abord définissez un nom, ici liste_villes
(sélectionnez la plage, puis dans la zone de nom située à gauche de la zone de formule, tapez liste_villes,
validez par entrée) qui fera référence à votre liste de valeurs.

Puis sélectionnez la colonne de la ville dans votre table de données et choisissez Données – Validation, puis
dans le menu déroulant, Liste. Finalement, ajouter = liste_villes dans la zone “Source”.

Il ne reste plus qu’à utiliser la zone de liste déroulante disponible lorsqu’on se trouve sur la cellule :

En respectant ces 13 règles vous pourrez construire des tables/listes/tableaux de données faciles à utiliser,
rigoureux et solides.
Si vous en voyez d’autres n’hésitez pas à laisser un commentaire ci-dessous…
L’étape suivante consistera à analyser vos données… Je viens de finir la v2 d’un outil très puissant pour cela
que vous invite à essayer : http://www.xltab.com/?q=node/2 (vidéo de présentation du produit)
A bientôt
Gaetan
PS : Il y a beaucoup de débats sur la sémantique autour des tables/listes/tableaux de données. Au final, on
parle globalement de plus ou moins de la même chose : une structure avec des titres de colonnes et des lignes
reprenant les données.

Vidéos

Extraire les cellules contenant un mot spécifique


Posted in Utilitaires, VBA, Vidéos on October 8th, 2010 by site admin – 1 Comment

Bonjour à tous,
Suite à la question de Danielle, voici une adaptation de la macro créée ici pour rapatrier les cellules contenant
un mot dans une seule feuille.
Pré-requis : ce post
Objectif : rapatrier toutes les cellules contenant une chaîne de texte
Fichier final : ici
Vous pouvez trouver ici une présentation vidéo des fonctionnalités de ce fichier, puis en dessous une
description détaillée du code utilisé. (note : Pour ne pas voir la barre de contrôle de la vidéo, positionnez votre
curseur en dehors de la vidéo)
Et voici la description détaillée du code :
N’hésitez pas à laisser vos commentaires si besoin.
A bientôt.
Gaëtan

L’outil espion
Posted in Formules et fonctions, Vidéos on March 9th, 2010 by site admin – Be the first to comment

Lorque vous construisez des feuilles de calculs un peu complexes, il est parfois très utile de pouvoir revenir sur
des formules ou encore de situer la provenance d’un chiffre spécifique.
Voici une courte démonstration de cet outil sous 2007:
Sous Excel 2003, vous pouvez l’afficher via le menu Affichage – Barres d’outils – Espions

Merci pour votre attention et à bientôt.


Gaetan

Formation poussée au VBA


Posted in D'autres sites, VBA, Vidéos on January 13th, 2010 by site admin – 7 Comments
Bonjour à tous,
Avec un collègue et ami, nous pensons très prochainement lancer un nouveau produit de formation vous
permettant d’accèder à du code VBA poussé, voire très poussé… Mais expliqué le plus simplement possible à
l’aide de vidéos de formation.
Vous pouvez avoir deux exemples de ce nouveau produit :
– Procédure événementielle déclenchée automatiquement par l’activation d’une feuille ou encore
– Actualiser les formules d’une table de données.
Ce produit s’adresse aux personnes ayant déjà étudié mon CD de formation sur VBA ou ayant déjà une bonne
connaissance du VBA.
Ce type de produit demandant beaucoup de travail, nous pensons à une formule d’abonnement mensuel ou à
l’achat d’un sujet au cas par cas. Qu’en pensez-vous ? Est ce qu’un tel cours vous semble accessible ? Utile ?
Avez-vous des idées de sujets que vous aimeriez voir traiter?
A bientôt.
Gaëtan Mourmant et Dominique Handelsman.

Vidéo sur Excel


Posted in D'autres sites, Formatage, Graphiques, Général, Vidéos on December 22nd, 2009 by site admin – 2 Comments

Bonjour à tous,

Il y a maintenant très longtemps (glups ), j’avais posté une astuce pour afficher des images que l’on modifie
en fonction du contenu d’une cellule :
http://www.polykromy.com/html/poly_main_cours_decaler.html
En faisant une recherche sur internet, je suis tombé sur une application de simulation de table de montage vidéo
qui utilise ce cours et le combine à la gestion du temps sur Excel pour simuler un petit film d’animation.

Bien sur, ca n’a rien à voir avec une table de montage professionnelle, mais je trouve l’idée intéressante d’un
point de vue pédagogique; aussi bien pour comprendre les bases de la création de vidéos/dessins animés, que
pour comprendre les fonctionnalités avancées d’excel.
Voici le lien du fichier :
http://excelsciences.site.voila.fr/Mentrard/filmexcel.xls
A bientôt
Gaëtan Mourmant

Gérer des images dans un userform en VBA


Posted in VBA, Vidéos on October 13th, 2009 by site admin – 2 Comments

Et une autre vidéo qui explique comment ajouter une image dans un userform et ensuite comment la modifier
par du code VBA.
Ca se passe ici :
http://www.polykromy.com/vba-2007/1_charge_image_fr.html
Pour les utilisateurs d’excel 2003, vous accédez au VBE par ALT+F11, ou encore Outils – Macros.
La sécurité des macros se gère au même endroit.
Bon amusement
Gaëtan Mourmant

Excel 2007 et le VBA


Posted in Excel 2007, VBA, Vidéos on October 13th, 2009 by site admin – 1 Comment

Tout d’abord pour ceux qui passent à Excel 2007 et veulent continuer à utiliser le VBA, voici 4 mn de vidéos qui
pourront vous faire gagner 1 heure de recherche et potentiellement beaucoup beaucoup plus (si vous
sauvegardez votre fichier sous le mauvais format, et perdez tout votre code VBA, par exemple).
Au programme :
– afficher le menu développeur
– modifier rapidement les paramètres de sécurité
– Ne jamais sauvegarder en format *.xlsx
La vidéo est ici (n’hésitez pas à agrandir votre navigateur, en général, la touche F11) :
http://www.polykromy.com/vba-2007/1_param_vba_2007_fr.html
Cordialement
Gaëtan