les procédures événementielles
TRANSCRIPT
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 WithEnd 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.AddressEnd 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 = TrueEnd 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 = TrueEnd 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 = FalseWorkbooks.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).ChartEnd 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).ChartSet 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 = TrueEnd 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 = TrueEnd Sub
Et dans le module ThisWorkbook, pour connecter la variable App à l'application :
Private Sub Workbook_Open() Set App = ApplicationEnd 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 = ApplicationEnd 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.FullNameEnd Sub
Private Sub WRD_Quit() ' Destruction de la variable WRD et affichage du résultat Set WRD = Nothing Wksht.Visible = True Wksht.ActivateEnd Sub
' *** Dans un module standard ***
Public Wksht As WorksheetPublic 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 = 0End 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 = TrueEnd 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 = ApplicationEnd Sub
On pourrait également instancier directement la variable XL en intégrant le mot-clé New à sa déclaration :
Dim XL As New Evts_ApplicationPrivate Sub Workbook_Open() Set XL.App = ApplicationEnd 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 ChartDim WithEvents Graph2 As ChartDim WithEvents GraphN As Chart
Private Sub Graph_Calc(Graph As Chart) ' Traitement à effectuer sur GraphEnd Sub
Private Sub Graph1_Calculate() Graph_Calc Graph1End Sub
Private Sub Graph2_Calculate() Graph_Calc Graph2End Sub
Private Sub GraphN_Calculate() Graph_Calc GraphNEnd Sub
Private Sub Workbook_Open() Set Graph1 = Feuil1.ChartObjects(1).Chart Set Graph2 = Feuil2.ChartObjects(1).Chart ' ... Set Graph1 = FeuilN.ChartObjects(X).ChartEnd 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 = TrueEnd 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érifEnd Sub
Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub VérifEnd 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 = TrueEnd Sub
Private Sub Worksheet_Deactivate() Application.DisplayFullScreen = FalseEnd 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").DeleteEnd Sub
Private Sub Workbook_Open() Application.CommandBars("MaBarreOutils").Visible = TrueEnd 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 = ApplicationEnd Sub
Private Sub XL_WorkbookOpen(ByVal Wb As Excel.Workbook) ChDir Wb.PathEnd 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éploiementIncorporer Morefunc dans un classeur (Excel 2003 et antérieur)Utilisation des fonctions
Nouvelles fonctions
Dernière modification (5.06) : ajout de la fonction R EGION .
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
R EGION 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éressantA 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.ExcelA 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.JEt 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
Web dj.joss.free.fr
xcell05.free.fr
GENERALITES
Quel est le site archive du forum MPFE?Site archive du forum MPFEDeja.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.xlsPour Excel 2000 : ..\Office\1036\vbalist.xlsPour 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
Rechercher
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: OrigineAu 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'excelA 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 Windows1990 - Excel 3.01992 - Excel 4.01993 - Excel 5.01995 - Excel pour Windows 95 (version 7.0) – inclut aussi dans Microsoft Office 951997 - Excel 97 (version 8.0) - inclut aussi dans Microsoft Office 971999 - Excel 2000 (version 9.0) inclut aussi dans Office 20002001 - Excel 2002 (version 10) inclut aussi dans Office XP2003 - Excel 2003 (version 11) inclut aussi dans Office 20032007 - 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 lettreAu choix:http://xcell05.free.fr/pages/telecharge/index.html (fonction NUMTEXTE) MoreFunhttp://perso.wanadoo.fr/frederic.sigonneau/office/Nb2Words.zip http://www.fundp.ac.be/~jmlamber/ http://www.cybercable.tm.fr/~pnoss/Chiffre_Lettre.bashttp://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 Microsofthttp://www.microsoft.com/IntlKB/France/articles/ ouhttp://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=FalseSheets(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éesde 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 sourceDonner 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 2000Excel 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 codeci-dessous) contienne une cellule nommée (Insertion\Nom\Définir) "numFact", celluleoù 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 lepré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 quele 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èleun numéro de facture "cohérent" avec les précédentes factures enregistrées.
Private Sub Workbook_Open()If ActiveWorkbook.Path = "" Then[numFact] = [numFact] + 1ActiveWorkbook.Saved = TrueActiveWorkbook.SaveCopyAs(Application.TemplatesPath & "Fact.xlt")End IfEnd Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)chemXlt = Application.TemplatesPath & "Fact.xlt"If ActiveWorkbook.Path = "" ThenSet wbk = Workbooks.Open(chemXlt)With wbk.ActiveSheet.Range("NumFact") = .Range("NumFact") - 1End Withwbk.Close TrueEnd IfEnd 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 NextWith ActiveWorkbook.VBProject.VBComponents.Remove .Item("Toto")End WithOn Error GoTo 0End Sub
Comment supprimer tout le code du classeur actif ?Sub SupprToutCodeVBA()'L Longre, mpfeDim VBC As ObjectWith ActiveWorkbook.VBProjectFor Each VBC In .VBComponentsIf VBC.Type = 100 ThenWith VBC.CodeModule
.DeleteLines 1, .CountOfLines
.CodePane.Window.CloseEnd WithElse: .VBComponents.Remove VBCEnd IfNext VBCEnd WithMsgBox "Modules et macros du classeur actif supprimées.", _vbInformationEnd 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 ByteGetKeyboardState KeyState(0)KeyState(&H90) = 1 'Num Lock'KeyState(&H14) = 1 'Caps LockSetKeyboardState 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 StringDim N As LongDim Res As Long
S = String$(200, 0)N = 199Res = 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 RangeSet maPlage = Worksheets("Feuil1").Range("A1:C10")réponse = Application.WorksheetFunction.Min(maPlage)MsgBox réponseEnd Sub
Tout ceci est très bien expliqué dans l'aide:Utilisation des fonctions de feuille de calcul Microsoft Excel dans Visual BasicPhilippe 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é hauten utilisant Selfcert.exe pour certifier les macros.Normalement, SelfCert s'installe avec office 2000. Il se trouve dansle répertoire '...\Microsoft office\office\selfcert.exe'.Une fois le certificat créé, signez le projet VBA par: Menu Outils/Signatures électroniquescliquez 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 objetSélectionner Microsoft MAP dans la listeRaMa
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.EXEFermez 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 LongPrivate Declare Function EmptyClipboard Lib "user32" () As LongPrivate Declare Function CloseClipboard Lib "user32" () As Long
Sub VidePP()OpenClipboard 0EmptyClipboardCloseClipboardEnd Sub
[index]
CELLULES ET PLAGES
Comment trouver la première cellule vide?Méthode 1:ActiveCell.End(xlDown)(2).Selectou ActiveCell.End(xlToRight)(1, 2).Select
Méthode 2:[A65536].SelectSelection.End(xlUp)(2).Select
Méthode 3:Range("A1").Select
While IsEmpty(ActiveCell) = FalseActiveCell.Offset(1, 0).ActivateWend
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 sommeI = 10Range("A1").FormulaLocal = "=SOMME(A2:A" & I & ")"
Je voudrais créer une macro me permettant d'aller à la dernière ligne + 1d'une colonne X et d'y faire un total ?Par exemple, pour mettre la somme des cellules A2:Ax (Ax = dernièrecellule 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 = 14End WithSendKeys "%IM"End Sub
'S'il s'agit de modifier la taille de la police a posteriori dans tous lescommentaires du classeur:
Sub ModifCommentaires()Dim Wksht As Worksheet, C As CommentFor Each Wksht In WorksheetsFor Each C In Wksht.CommentsC.Shape.OLEFormat.Object.Font.Size = 12Next CNext WkshtEnd 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.RowsIf ligne.Cells(1, 12).Value = Empty Then'si la cellule de la colonne L est vide, la ligne est masquéeligne.EntireRow.Hidden = TrueEnd IfNext
Et pour les colonnes:
For Each col In ActiveSheet.UsedRange.ColumnsIf col.Cells(2, 1).Value = Empty Then'si la cellule de la ligne 2 est vide, la colonne est masquéecol.EntireColumn.Hidden = TrueEnd IfNext
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.AddressEnd 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 subAV
Comment multiplier les éléments d'un tableau et renvoyer ce tableau ?Sélectionner votre tableau au préalable!
Sub Tabx2()Dim myTab As VariantDim y As IntegerDim x As Integer
myTab = Selection.Value'Boucle pour chaque colonneFor y = LBound(myTab, 2) To UBound(myTab, 2)'Boucle pour chaque ligneFor x = LBound(myTab, 1) To UBound(myTab, 1)'Multiplie chaque élément de la sélection par 2myTab(x, y) = myTab(x, y) * 2Next xNext y
'Renvoie le tableau dans la sélectionSelection.Value = myTabEnd Sub
Comment utiliser "ReDim" dans un tableau ?Voilà un exempleCette 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 IntegerDim Item As VariantDim myTab() As IntegerReDim myTab(0) 'Initialisation du tableauDoNbValeur = Application.InputBox("Tapez un nombre", Type:=1)myTab(UBound(myTab)) = NbValeurReDim Preserve myTab(UBound(myTab) + 1)Loop Until NbValeur = False
'Annulation de l'initialisationReDim Preserve myTab(UBound(myTab) - 1)
'Affichage des valeurs entréesFor Each Item In myTabIf Item <> False Then MsgBox "Vous avez entré " & Item'Inscrit les valeurs entrées dans la colonne Bcompteur = compteur + 1ActiveSheet.Range("B" & compteur).Value = ItemNextEnd 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 LongDim Ligne As LongDim Pas As Long
' DEBUT ZONE PARAMETRES' Paramétrisation de la macroLigneDebut = 1 ' A adapterLigneFin = 20 ' A adapterPas = 2 ' A adapter' FIN ZONE PARAMETRES
'On commence à insérer à lignedebut+1Ligne = LigneDebut + 1Do While Ligne <= LigneFinRows(Ligne & ":" & Ligne + Pas - 1).Insert shift:=xlDown' on saute "Pas"+1 lignes pour se positionner sur la nouvelle' ligne avant laquelle on insèreLigne = Ligne + Pas + 1' On adapte LigneFin à Lignefin+"Pas"' puisqu'on a inséré "Pas" lignesLigneFin = LigneFin + PasLoopEnd 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.JSub Clignot()Range("A1").Select
For compteur = 1 To 20With Selection.Font.Name = "Arial".Size = 14.ColorIndex = 2End WithApplication.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 = 0End WithApplication.Wait Now + TimeValue("00:00:01")NextEnd 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").FontIf .ColorIndex = 2 Then .ColorIndex = 3 Else .ColorIndex = 2End WithApplication.OnTime NextTime, "Flash"End Sub
Sub StopIt()Application.OnTime NextTime, "Flash", schedule:=FalseActiveWorkbook.Styles("Flash").Font.ColorIndex = xlAutomaticEnd 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:D9B12:D14E18:G24H14:J16
UsedRangeUsedRange 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 enincluant les cellules vides si celles-ci ont été formatées d'une façonquelconque (même si ont les remet au format standard ensuite...), ce qui, danscertaines manips sur les plages, ne manque pas de réserver qques surprises ;-)AV
Sub testUsedRange()Worksheets("Feuil1").ActivateActiveSheet.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 cellulesi 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éeB5 A1 : D9
G24 E18 : G24D14 B12 : D14E5 A1 : E9
B10 A1 : D10
E10 A1 : E10G17 E14 : J24H17 E14 : J24
Sub test()Worksheets("Feuil1").ActivateActiveCell.CurrentRegion.Select '// Ici, ActiveCell fait référence au pointeur de cellules.End Sub
Comment limiter la zone de scroll?ActiveSheet.ScrollArea = "A1:H20"
et pour 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 plageen 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.htmqui 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 courtPour trouver le 1er jour du mois:=A1-JOUR(A1)+1Un 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").ValueIf Weekday(datedujour) = 2 ThenMsgBox "Le " & datedujour & " est bien un lundi"ElseLundiNext = DateValue(datedujour) + 9 - Weekday(datedujour)LundiPrev = DateValue(datedujour) + 9 - Weekday(datedujour) - 7MsgBox "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 IfEnd Sub
Précision de Daniel M.Dans TestJour(), les algos pour trouver les Lundi suivant/précédent nefontionnent pas avec une date de départ le dimanche.Il vaut mieux:
Sub TestJour2()Dim DateDuJour As Date, LundiNext As Date, LundiPrev As DateDateDuJour = CDate(Range("A1").Value)If Weekday(DateDuJour) = 2 ThenMsgBox "Le " & DateDuJour & " est bien un lundi."ElseLundiPrev = 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 IfEnd Sub
Comment insérer la date de modification du classeur automatiquement ?Dans la feuille de code de l'onglet où tu désires l'information:
Private Sub Worksheet_Change(ByVal Target As Range)[A1] = "Date de la dernière modification : " & DateEnd Sub
Le code de ChrisV(ci-dessus) met à jour A1 à chaque changement de valeur de cellule dans lafeuille, mais je crois que tu veux cela uniquement au moment de la sauvegarde du classeur :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)[A1] = "Date de la dernière modification : " & DateEnd SubBenead
Ou bien encore:
Private Sub Workbook_BeforeClose(Cancel As Boolean)Range("A1").Select 'A1 étant la cellule où le texte s'inscrit.
ActiveCell.Value = "Dernière mise à jour le " & Format(Date,"dd/mm/yyyy")End SubJPS
Comment convertir des données en dates ? de Patrick Mac Kay Il s'agit de convertir des données en dates "normales" au départ de la colonne E qui contiendrait qq chose comme "aaaammjj" style 20010501.
Sub convertir_dates()Dim tableau As VariantLastrowE = Worksheets(1).Range("E65536").End(xlUp).Rowtableau = Range("E1:E" & LastrowE).Value
For I = 1 To LastrowEtableau(I, 1) = Left(tableau(I, 1), 4) & "/" & Mid(tableau(I, 1), 4, 2) _& "/" & Right(tableau(I, 1), 2)LastrowF = LastrowE
NextRange("E1:E" & LastrowF).Value = tableauRange("E1:E" & LastrowF).NumberFormat = "dd/mm/yyyy"End Sub
Astuce facilitant le report de dates entre classeurs n'utilisant pas le même calendrier ?
Une explication détaillée de Michel Gaboly.
Installer un chronomètre. Papou'Pour démarrer le compteur il faut lancer la macro'DemarreCalculTps 'Pour l 'arrêter il faut exécuter'ArretCalculTps'Code à placer dans un module
Dim ok As BooleanSub DemarreCalculTps()ok = TrueRange("A1").Value = TimeValue("00:00:00")Application.OnTime Now + TimeValue("00:00:01"), "mettre_a_jour"End Sub
Sub mettre_a_jour()If ok ThenRange("A1").Value = [A1] + TimeSerial(0, 0, 1)Range("A1").NumberFormat = "hh:mm:ss"Application.OnTime Now + TimeValue("00:00:01"), "mettre_a_jour"End IfEnd Sub
Sub ArretCalculTps()ok = FalseEnd Sub
[index]
FICHIER - FEUILLE
Comment compter le nombre de feuilles dans un classeur ?Worksheets.Count
Comment activer la feuille suivante d'un classeur?Sheets(ActiveSheet.Index + 1).Select
Comment copier un classeur complet ?ActiveWorbook.SaveCopyAs "c:\NouveauNom.xls"
Comment supprimer tous les fichiers d'un répertoire?Kill "C:\NomRépertoire\*.*"
Puis comment supprimer ce répertoire ?RmDir "C:\NomRépertoire"
Comment protéger et déprotéger une feuille par mot de passe ?Protéger : ActiveSheet.Protect ("MotDePasse")Déprotéger : ActiveSheet.Unprotect ("MotDePasse")
Comment supprimer tous les noms d'une feuille ou d'un classeur ?Dim n as NameFor each n in Namesn.DeleteNext n
Comment ignorer les espaces pour transformer les noms de feuilles en hyperliens ?Sub Liste_nom_des_feuilles_en_hyperlinks()Sheets.Add.Name = "Liste feuilles du classeur"Sheets("Liste feuilles du classeur").Move Before:=Sheets(1)Dim MesFeuil As WorksheetDim x As Integerx = 1For Each MesFeuil In WorksheetsCells(x, 1).SelectActiveCell = MesFeuil.NameActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _SubAddress:="'" & ActiveCell.Value & "'!A1" 'modif 1'SubAddress:=Chr(39) &ActiveCell.Value & Chr(39) & "!A1" 'modif 2'SubAddress:=ActiveCell.Value & "!A1" ne marche pasx = x + 1Next MesFeuil
x = 1End Sub
Comment fermer tous mes classeurs Excel ouverts à l'exception de 3 ?'Mettons que les classeurs à laisser ouverts se nomment "Toto1.xls",'"Toto2.xls" et "Toto3.xls".
Dim Wbk As Workbook, ArrArr = Array("Toto1.xls", "Toto2.xls", "Toto3.xls", ThisWorkbook.Name)For Each Wbk In WorkbooksIf IsError(Application.Match(Wbk.Name, Arr, 0)) Then Wbk.CloseNext Wbk
Est-il possible de partager un classeur et de pouvoir aussi utiliser les macros de ce classeur ?
La réponse de Laurent L.
Comment faire faire une rotation à 90° à un tableau Excel, en conservant les formules ?Ces macros, qui seront surtout utiles aux utilisateurs de Word,ont été mises au point par plusieurs personnes, dans lesquelles on trouve:
l'irremplacable Laurent (Longre, bien sûr), Isabelle, et surtout Benoît Marchand.
Comment connaître la taille en octet du classeur ?MsgBox FileLen(ThisWorkbook.FullName) & " octets"
Sauvegarde automatique de Thomas CorvaisierThomas Corvaisier a écrit une macro qui permet de programmer non pas lasauvegarde automatique du fichier (dangereux), mais de plusieurs versions dufichier sur lequel on travaille, l'intervalle étant programmable, et lesversions successives étant conservées, ce qui permet de revenir en arrière.Télécharger sauvage.zip un fichier sauvage.rtf vous explique la marche à suivre!
sauvage.zip 46 ko
Comment classer les onglets ?http://dj.joss.free.fr/feuil.htm
Comment supprimer les feuilles 1, 2 et celle nommée zaza?Sheets(Array(1, 2, "zaza")).Delete
Et les feuilles de 10 à 20?sheets(Evaluate("transpose(ROW(10:20))")).delete (par L.L.)
Comment empêcher l'affichage de la boite de dialogue"Voulez vous sauvegarder le document?" à la fermeture du fichier?
Application.DisplayAlerts = FalseActiveWorkbook.Closeou bienActiveWorkbook.Saved = Trueou encoreActiveWorkBook.Close SaveChanges:=False
Comment sélectionner les feuilles de l'onglet "Début" à l'onglet "Fin" ?En sachant qu'il peut y avoir 1, 2 ou 3 feuilles ou plus entre ces 2 onglets
Sub SelectionFeuilles()Dim Feuille As WorksheetSheets("Début").SelectFor Each Feuille In Sheets()If Feuille.Index >= Sheets("Début").Index And _Feuille.Index <= Sheets("Fin").Index Then _Feuille.Select Replace:=FalseNext FeuilleEnd Sub
Comment se débarrasser d'un fichier?3 méthodes utiles
Une page pour les 3 méthodes.
Comment supprimer tous les noms définis qui contiennent "Fact"? Daniel.JEn utilisant l'opérateur Like associé à l'instruction Option Compare en début de code !
Option Compare Text
Sub delNomFact()For Each namFact In ActiveWorkbook.NamesIf namFact.Name Like "*Fact*" ThennamFact.DeleteEnd IfNext namFactEnd Sub
"Option Compare Text" pour ne pas tenir compte de la casse: Fact est = à fact"Option Compare Binary" pour tenir compte de la casse: Fact n'est pas = à fact
Comment avoir le nom du serveur ? Laurent DAURESPour avoir le nom du serveur, mettre cette macro dans un classeur,enregistrer ce classeur sur le serveur dans le répertoire choisi.et enfin activer cette macro.
Sub serveur()Range("a1") = ThisWorkbook.PathEnd Sub
Le chemin s'inscrira dans la cellule A1.
Comment zipper des fichiers automatiquement? Sébastien KRECKE
Une page "Compression avec winzip".
Comment récuperer des données d'un classeur fermé?Récupération de données dans un classeur fermé(méthode "classique" par établissement d'une liaison temporaire)(c'est aussi la technique habituellement conseillée pour essayerde récupérer des données d'un classeur endommagé) Fréderic S.
Sub test()GetValuesFromAClosedWorkbook "D:", "TestADO.xls", "Feuil1", "A1:H25"End Sub
Sub GetValuesFromAClosedWorkbook(fPath As String, _fName As String, sName, cellRange As String)'Ron De Bruin, mpep'le paramètre 'cellRange' doit désigner'*une* plage de cellules *contigües*With ActiveSheet.Range(cellRange).Formula = "='" & fPath & "\[" & fName & "]" _& sName & "'!" & cellRange.Value = .ValueEnd WithEnd Sub
Comment déplacer un fichier?
Une page "Deplacement de fichier".
Comment fermer un classeur Excel après 15 minutes d'inactivité?
Une page "Comment fermer un classeur Excel après 15 minutes d'inactivité?".
[index]
GRAPHIQUES
Comment faire pour juxtaposer un histogramme avec une ligne horizontalequi représente un seuil à ne pas dépasser? de Serge Garneau
Télécharger ce classeur: histo_lg.zip 10 ko
Les droites de régression de Serge Garneau
Télécharger ce classeur: droite_regr.zip 14 ko
Un document pouvant intéresser les profs de stats de Serge Garneau
Télécharger ce classeur: echantillons.zip 27 ko
Comment tracer une ellipse ? (Graphique animé de Serge)
Télécharger ce classeur: ellipse.zip 27 ko
Une enigme et une animation astronomique de Serge
Télécharger ce classeur: enigme.zip 15 ko
Télécharger ce classeur: anim_astro.zip 50 ko
Triangle de Pascal à la sauce fractale de Serge Garneau
Télécharger ce classeur: Sierpinski.zip 26 ko
Patente triangulaire avec coordonnées 3D quelconques. de Serge Garneau
Télécharger ce classeur: 3dvers2d.zip 9 ko
Un peu d'arpentage... de Serge Garneau
Télécharger ce classeur: Arpentage.zip 21 ko
Graphique à données variables... de Daniel.J
Télécharger ce classeur: graphvar.zip 9 ko
Planche de Galton....pour épater !!! de Serge Garneau (Réussi... :O) Dj)
Télécharger ce classeur: PlancheDeGalton.zip 15 ko
Graphique et calcul intégral de Serge Garneau
Télécharger ce classeur: graphintegral.zip 34 ko
Créer des courbes le plus facilement du monde de Serge Garneau
Télécharger ce classeur: courbeauto.zip 44 ko
Compilations de notes avec affichage des maudites étiquettes de Serge Garneau
Télécharger ce classeur: Compilation_Notes.zip 11 ko
Ce document permet de miser sur les résultats d'une élection de Serge Garneau
Télécharger ce classeur: election.zip 13 ko
Délire pour les matheux et les profs de math. de Serge Garneau
Télécharger ce classeur: Distances_Droites_3D.zip 42 ko
Introduction aux applications possibles d'Excel pour le calcul différentiel et intégral de Serge Garneau
Télécharger ce classeur: cdi.zip 47 ko
Comment inserer un logo dans tous les graphiques du classeur ? Sub insertLogo()Dim logo, imgDim sh As Worksheet, gph As ChartObject
logo = Application.GetOpenFilename("Logo(*.gif;*.jpg;*.bmp),*.gif;*.jpg;*.bmp" _, , "Choix du logo", , False)
If logo = False Then Exit SubSet img = ActiveSheet.Pictures.Insert(logo)img.ShapeRange.ScaleWidth 0.1, msoFalse, msoScaleFromTopLeftimg.ShapeRange.ScaleHeight 0.1, msoFalse, msoScaleFromTopLeftimg.CopyFor Each sh In ActiveWorkbook.WorksheetsFor Each gph In sh.ChartObjectsgph.Chart.PasteNext gphNext shimg.DeleteEnd Sub
[index]
IMPRESSION
Comment récupérer le nom de l'imprimante active?Sub ActivePrinter()ActiveCell(2).SelectActiveCell = Application.ActivePrinterEnd Sub
Comment imprimer le fond de page ?Sub ImpFiligrane()'La Zone d'impression DOIT être préalablement définieDim ZoneImpr As RangeSet ZoneImpr = Range(ActiveSheet.PageSetup.PrintArea)ZoneImpr.CopyPicture xlScreen, xlBitmapActiveSheet.Paste Destination:=ZoneImprActiveWindow.SelectedSheets.PrintPreviewActiveSheet.Shapes(ActiveSheet.Shapes.Count).DeleteEnd SubDenny Campbell
Comment imprimer des plages discontinues?Sélectionner les plages avec la touche CTRL dans la boîte de saisieSub ImpressionZonesDiscontinues()Dim maplage As Range, mazone As RangeDim i As IntegerWith Application.DisplayAlerts = FalseSet maplage = .InputBox(prompt:="Selectionnez la plage à imprimer.", _Type:=8).ScreenUpdating = FalseWorksheets.AddEnd WithWith ActiveSheetFor Each mazone In maplage.Areasmazone.CopyCells(Range("A1").SpecialCells(xlLastCell).Row + X, 1).SelectX = 1.PasteNext.PrintPreview.DeleteEnd WithEnd Sub
[index]
OUTIL
Comment ajouter une fonction au petit menu de la barre d'état(en bas à droite qui s'affiche sur un clique droit)?http://dj.joss.free.fr/outil.htm#menubarreEtat
Comment créer une entrée "Ouvrir avec XL 97" dans le menu contextuel Windows?Sur un poste où XL97 et XL2000 sont installés, avec XL2000 associé par défaut.Marche pour Win 98 et Win Me (les autres à voir)
Dans RegeditHKEY_CLASSES_ROOT\Excel.Sheet.8\shellCréer une nouvelle clé \Ouvrir_avec Excel_97et lui donner comme valeur par défaut : Ouvrir avec Excel 97
Sous cette nouvelle clé, en créer et modifier deux : \Command (défaut)= " ...lecheminExcel97\Excel.exe" /e \ddeexec (défaut)= [Open("%1")]
Et sous cette clé ddeexec, en créer et modifier deux : \Application (défaut)= Excel \Topic (défaut)= System
Bouton1 et CommandButton1: DIFFERENCE
La réponse de Catherine
Minimiser toutes les fenêtresPermet de minimiser toutes les fenêtres, comme la combinaison de la touche windows & de M.Pratique pour les vieux claviers sans touche windows.
Private Declare Sub keybd_event Lib "user32" _(ByVal bVk As Byte, _ByVal bScan As Byte, _ByVal dwFlags As Long, _ByVal dwExtraInfo As Long)
Private Const VK_LWIN = &H5BPrivate Const KEYEVENTF_KEYUP = &H2
Sub MinimizeWindows()VK_ACTION = &H4DCall keybd_event(VK_LWIN, 0, 0, 0)
Call keybd_event(VK_ACTION, 0, 0, 0)Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)End Sub
Comment désinstaller Excel ou un autre logiciel d'Office proprement?Ces programmes sont très utiles pour faire une réinstallation vraiment"propre" d'Office, en cas par exemple de plantages systématiques d'Excelà cause d'un fichier système corrompu. Et si on n'a plus besoind'Office, c'est idéal pour récupérer de l'espace disque. J'ai dûutiliser récemment les deux Eraser d'Office 2000, après désinstallation,et ils ont supprimé environ 45 Mo de fichiers résiduels sur le disquedur. No comment...Laurent
Un utilitaire de nettoyage des résidus laissés par Office 97 sur ledisque dur et dans la base de registres, téléchargeable sur:
http://support.microsoft.com/support/kb/articles/q176/8/23.asp
Un utilitaire équivalent existe pour Office 2000 :
Pour le CD 1 (Eraser2k.exe)http://support.microsoft.com/support/kb/articles/Q239/9/38.asp
Pour le CD 2 (Erasecd2.exe)http://support.microsoft.com/support/kb/articles/q247/6/74.asp
Une série de boutons "exemples" dans une barre d'outilhttp://dj.joss.free.fr/outil.htm#seriebts
Comment insérer un module et construire une macro dans ce module?et comment tester l'existence d'une macro?
Une page complète sur le sujet.
Comment créer un bouton et y affecter une macro?Sub CréerBouton()'Défini l'emplacement et la taille du boutonActiveSheet.Buttons.Add(60, 0, 60, 12.75).SelectSelection.OnAction = "AffecterMaMacro"Selection.Characters.Text = "Mon bouton"With Selection.Characters(Start:=1, Length:=6).Font.Name = "Arial".FontStyle = "Normal".Size = 10.Strikethrough = False.Superscript = False.Subscript = False.OutlineFont = False.Shadow = False.Underline = xlNone.ColorIndex = xlAutomaticEnd WithRange("A1").SelectEnd Sub
Comment créer un raccourci Internet par VBA?Raccourci sur le bureau :
Sub raccourcis_bureau() chemin = "c:\windows\all users\bureau\" Open chemin & "boursorama.url" For Output As #1 Print #1, "[InternetShortcut]" Print #1, Chr$(10) & "URL=http://boursorama.fr" Print #1, Chr$(10) & "IconIndex = 14" Print #1, Chr$(10) & "IconFile=C:\WINDOWS\Moricons.dll" Close #1 End Sub
Il suffit de remplacer le chemin d'accès au bureau par celui de la barre Office pour créer un raccourci
sur la barre Office:
Sub raccourcis_Office() chemin = "C:\Program Files\Microsoft Office\Office\gestionnaire office\office\" Open chemin & "boursorama.url" For Output As #1 Print #1, "[InternetShortcut]"Print #1, Chr$(10) & "URL=http://boursorama.fr" Print #1, Chr$(10) & "IconIndex = 5" Print #1, Chr$(10) & "IconFile=C:\WINDOWS\Moricons.dll" Close #1 End Sub
http://jacxl.free.fr/cours_xl/cadres.htmlRubrique: UTILECréer un raccourci Internet par VBA
Comment créer un raccourci d'un fichier xls sur le bureau par VBA?
Declare Function SHGetSpecialFolderLocation Lib "Shell32" _(ByVal hwnd As Long, ByVal nFolder As Long, ppidl As Long) As Long
Declare Function SHGetPathFromIDList Lib "Shell32" _(ByVal Pidl As Long, ByVal pszPath As String) As Long
Declare Function SetWindowPos Lib "User32" _(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _ByVal cy As Long, ByVal uFlags As Long) As Long
Declare Function SetForegroundWindow Lib "User32" _(ByVal hwnd As Long) As Long
Declare Function GetForegroundWindow Lib "User32" () As Long
'================================Laurent
Function RaccourciBureau(Fichier As String) As Boolean
Dim hwnd As LongDim Pidl As LongDim Bureau As String
If Dir(Fichier) = "" Then Exit Function
SHGetSpecialFolderLocation 0, 0, PidlBureau = Space(260)SHGetPathFromIDList Pidl, BureauBureau = Left(Bureau, InStr(1, Bureau, vbNullChar) - 1)
hwnd = GetForegroundWindowSetWindowPos hwnd, -1, 0, 0, 0, 0, 3Shell "RunDLL32 AppWiz.Cpl,NewLinkHere " & Bureau & "\"SendKeys """" & Fichier & """~~", TrueSetForegroundWindow hwnd
RaccourciBureau = True
End Function
Sub CreeRaccourci()'modifier le chemin et le nom de fichierMsgBox IIf(RaccourciBureau("C:\ajeter\test.xls"), _"Raccourci créé", "Fichier inexistant")
End Sub
Comment lister les polices?
4 macros au choix !
Comment supprimer la barre de tâche Windows?
Tester avec Office 2000/Win98 et Office XP/WinXP
Option ExplicitDim handleW1 As Long
Private Declare Function FindWindowA Lib "user32" _(ByVal lpClassName As String, _ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" _(ByVal handleW1 As Long, _ByVal handleW1InsertWhere As Long, ByVal w As Long, _ByVal x As Long, ByVal y As Long, ByVal z As Long, _ByVal wFlags As Long) As Long
Const TOGGLE_HIDEWINDOW = &H80Const TOGGLE_UNHIDEWINDOW = &H40
Function HideTaskbar()handleW1 = FindWindowA("Shell_traywnd", "")Call SetWindowPos(handleW1, 0, 0, 0, 0, 0, TOGGLE_HIDEWINDOW)End Function
Function UnhideTaskbar()Call SetWindowPos(handleW1, 0, 0, 0, 0, 0, TOGGLE_UNHIDEWINDOW)End Function
Pour supprimer la barre des tâches :Taper la commande Print HideTaskbar() dans la Fenêtre Exécution puis appuyez sur ENTRÉE.
Pour restaurer la barre des tâches:Tapez la commande Print UnhideTaskbar() dans la Fenêtre Exécution puis appuyez sur ENTRÉE.
Comment exécuter une macro dont le nom est dans une cellule?
Sub Test()Reponse = MsgBox("Fonction test")End Sub
Sub CallSub()Dim Appel As StringAppel = ActiveCell.Value 'Nous pouvons y ajouter des paramètres....Application.Run (ActiveCell.Value)End Sub
Ajouter une touche de raccourci (par exemple Ctrl+S) appelant la macro CallSub.Puis, aprés avoir saisi dans une cellule la valeur Test, qui est le nom dela procédure à appeler, presser CTRL+S, et vous pouvez voir le Message"Function test" apparaître.Eric Wanono
Comment exécuter 2 actions sur un même bouton par alternance? Daniel.j
btbascule.zip 8 ko
Comment réorganiser les fenêtres de l'éditeur VB?Ils nous arrivent parfois de bousculer l'organisation des fenêtres de l'Editeur Visual Basic ! Voilà une méthode simple pour retrouver l'organisation par défautIl faut supprimer (ou renommer) la valeur "Dock" de cette clé de la base de registreElle sera recréée automatiquement au prochain démarrage d'Excel et les fenêtres de VBE reprendront leur état d'origine.Pour Windows 98HKEY_USERS\.Default\Software\Microsoft\VBA\Office
Pour Windows XPHKEY_USERS\S-1-5-21-1957994488-492894223-839522115-1003\Software\Microsoft\VBA\6.0\Common
Comment protéger un classeur à l'ouverture? Avec XL 2000Fichier => Enregistrer sous => Cliquer sur Outils et Options générales / Options d'enregistrementet mot de passe
Avec XL 97Fichier => Enregistrer sous => Options et mot de passe
Un menu entièrement paramètrable à partir d'une feuille de calcul ! John Walkenbach
menumakr.zip 16 ko
[index]
USERFORM
Comment empêcher la fermeture d'un userform avec la croix?Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)If CloseMode = 0 Then Cancel = TrueEnd Sub
Ou encore, de LLPrivate Declare Function GetWindowLongA Lib "User32" _(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLongA Lib "User32" _(ByVal hWnd As Long, ByVal nIndex As Long, _ByVal dwNewLong As Long) As Long
Private Declare Function FindWindowA Lib "User32" _(ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Sub UserForm_Initialize()Dim hWnd As LonghWnd = FindWindowA("Thunder" & IIf(Application.Version Like "8*", _
"X", "D") & "Frame", Me.Caption)SetWindowLongA hWnd, -16, GetWindowLongA(hWnd, -16) And &HFFF7FFFFEnd Sub
Pourquoi mettre Load UserForm1 avant la commande UserForm1.Show?
La réponse de Laurent L.
Comment installer une barre de progression lors de l'exécution d'une macro?
La réponse de Thomas C. Télécharger le classeur "progress.zip" Rubrique téléchargement.
Comment imprimer une Userform telle qu'elle apparaît à l'écran?Placez un bouton dans l'userform et dans le code mettez:Private Sub CommandButton1_Click()UserForm1.PrintFormEnd Sub
Comment insérer un gif animé dans un Userform ?Ajouter à la boite à outils le contrôle "Navigateur Web Microsoft".Placer ce contrôle sur un UserForm.Dans l'événement Initialize du UserForm, placer le code suivant :
Private Sub UserForm_Initialize()WebBrowser1.Navigate _"about:<html><body scroll='no'>" & _"<img src='D:\images\envelope.gif'></img></body></html>"End Sub
Le petit bout de code HTML evite l'affichage par défaut d'une barre de défilement à droite du contrôle.Ce code vient de cette adresse: http://support.microsoft.com/default.aspx?scid=http://msdn.microsoft.com/vbasic/technical/00pasttips.asp#4-10-00
Comment récupérer la première ligne de texte d'une zone de texte ? MichDenisPlacez une zone de texte dans la feuille 1 et tapez au moins 2 lignes de texte:Sub recup()Dim T As String, A As Integer, B As StringT = Worksheets("Feuil2").Shapes("Zone de texte 1").TextFrame.Characters.TextA = InStr(1, T, Chr(10), vbTextCompare)B = Left(T, A - 1)MsgBox BEnd Sub
Comment faire pour activer un userform et avoir accès aux feuilles de calcul?Dans les propriétes de l'userform:Comportement=>ShowModal mettre la propriété à "False"
Attaquer un objet par son nom - John FussAyant trouvé pas mal de posts traitant de ce problème sur le net (sans le solutionner), je me permet de publier une petite fonction qui permet d'attaquer un objet par une variable, qui le nomme par son contenant.
Exemple : mise à jour de 30 boutons :
Public Function CtrlByName(frm As UserForm, ctrl As String) As ObjectOn Error Resume NextSet CtrlByName = frm.Controls(ctrl)End Function
Public sub MAJ_Boutons(texte as string)dim i as integerfor i = 1 to 30CtrlByName(UserForm1, "bt_action" & i).caption = "Bouton n°" & i
nextEnd sub
[index]
EXCEL ET LES AUTRES
Est-il possible d'utiliser les fonctions Excel tel que loi.student.inversé(i,j) sur ACCESS ?Oui, en utilisant à partir d'Access la bibliothèque d'objets d'Excel.Dans ton projet VBA, il faut que tu ajoutes une référence à cette bibliothèque par:Outils -> Références -> "Microsoft Excel 9.0 (ou 8.0) Object Library".
Exemple de code :
With New Excel.Application' affiche le résultat de LOI.STUDENT.INVERSE(0,5;19)MsgBox .WorksheetFunction.TInv(0.5, 19).QuitEnd With
Si les fonctions d'Excel doivent être périodiquement rappelées par tamacro, il vaut mieux laisser l'instance d'Excel ouverte en permanence,et ne la refermer que quand ta macro n'en a plus besoin:
'Avec ========
Dim XL As Excel.Application
Sub OuvreXL()Set XL = New Excel.ApplicationEnd Sub
Sub QuitteXL()XL.QuitSet XL = NothingEnd Sub
Sub Exemple()If XL Is Nothing Then OuvreXLMsgBox XL.WorksheetFunction.TInv(0.5, 19)If MsgBox("Continuer à utiliser les fonctions XL ?", vbYesNo) = _vbNo Then QuitteXLEnd Sub
Avantage : comme Excel est déjà ouvert, la fonction est appelée plus vite. Inconvénient: l'instance d'Excel ouverte consomme des ressources en mémoire vive.Laurent L.
Infos sur PHP et Excelhttp://dj.joss.free.fr/php.htm
Fichiers Multiplan et ExcelPour pouvoir relire des anciens fichiers Multiplan il faut avoir Excel 95 qui, seul possède le convertisseur adéquat.(A installer, depuis le menu Composants du CD d'installation.)
Comment copier des données excel dans word? LydyaDans la première, tu précises toi-même la plage à copier (ici A1:G10)
Sub CopieExcelWord()Dim PlageACopier As RangeDim AppWord As ObjectSet PlageACopier = Sheets("NomFeuille").Range("A1:G10")Set AppWord = CreateObject("Word.Application")PlageACopier.CopyWith AppWord.Visible = True.documents.Open FileName:="C:\Temp\DocAOuvrir.doc".Selection.PasteEnd WithActiveWorkbook.SaveApplication.QuitEnd Sub
Dans la deuxième
Copie la plage de A1 jusqu'à la dernière colonne & dernière lignecontenant des données de la feuille NomFeuille et la colle dansle document Word "C:\DocAOuvrir.doc"
Sub CopiePlageDonneesExcelDansWord()Dim PlageACopier As RangeDim NbLignes As LongDim NbCols As IntegerDim AppWord As ObjectApplication.ScreenUpdating = FalseSheets("NomFeuille").ActivateIf WorksheetFunction.CountA(Cells) > 0 ThenNbLignes = Cells.Find("*", [A1], , , xlByRows, xlPrevious).RowNbCols = Cells.Find("*", [A1], , , xlByColumns, xlPrevious).ColumnElseMsgBox "La feuille ne contient pas de données"Exit SubEnd IfSet PlageACopier = Range(Cells(1, 1), Cells(NbLignes, NbCols))PlageACopier.CopySet AppWord = CreateObject("Word.Application")With AppWord.Visible = True.documents.Open FileName:="C:\DocAOuvrir.doc".Selection.Paste End WithActiveWorkbook.SaveApplication.ScreenUpdating = TrueApplication.QuitEnd Sub
Comment récupérer les attributs de MP3 ?(Avec XP)Publié par Michel Pierron.
Option Explicit
Sub MP3_Listing()Dim sPath As String: sPath = GetShellFolderIf sPath = "" Then Exit SubIf Dir(sPath, vbDirectory) = "" Then Exit SubDim Headers(35), x%, y&, i&, p$, n$, oFile As ObjectDim objShell As Object, oFolder As ObjectSet objShell = CreateObject("Shell.Application")Set oFolder = objShell.Namespace(CStr(sPath))Application.ScreenUpdating = FalseWorkbooks.AddFor i = 0 To 34Headers(i) = oFolder.GetDetailsOf(oFolder.Items, i)
Select Case iCase 0 To 1, 10, 12, 14 To 18, 20 To 22x = x + 1Cells(1, x) = Headers(i)End SelectNexty = 1For Each oFile In oFolder.Itemsp = oFile.Path: n = oFile.NameIf Right$(n, 4) = ".mp3" Thenx = 0: y = y + 1For i = 0 To 34Select Case iCase 0 To 1, 10, 12, 14 To 18, 20 To 22x = x + 1Cells(y, x) = oFolder.GetDetailsOf(oFile, i)With ActiveSheet.Hyperlinks.Add .Range("A" & y), Hlink(p), , n, nEnd WithEnd SelectNextEnd IfNextRange("A2").SelectActiveWindow.FreezePanes = TrueRows("1:1").Font.Bold = True
13 règles d’or pour gérer vos données sur ExcelBonjour à 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écifiquePosted 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 espionPosted 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 VBAPosted 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 ExcelPosted 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 VBAPosted 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 VBAPosted 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