L'informatique à votre portée
L'informatique prêt-à-porter

Faites appel à moi pour vos formations
sur les dpts 81, 31, 82, 11 et 67 (Strasbourg)
Confiez moi vos développements Office

FacebookTwitterGoogle BookmarksLinkedin

Les évènements

Imprimer E-mail
4 mars 2014

Depuis la version 97, VBA gère les évènements suivants d'un classeur, vous pouvez ainsi effectuer une action lors de ces évènements :

ProcédureSe produit
Sub WorkSheet_Activate() lorsque la feuille est activée
Sub WorkSheet_Deactivate() lorsque la feuille est désactivée
Sub WorkSheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) lorsque l'utilisateur double-clique sur une feuille de calcul.
Target est la cellule la plus proche du pointeur de la souris lorsque le double-clic se produit.
Si vous attribuez la valeur True à Cancel, l'évènement est annulé.
Sub WorkSheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) lorsque l'utilisateur clique avec le bouton droit de la souris. Se comporte comme le précédent évènement.
Sub WorkSheet_Calculate() après le recalcul de la feuille de calcul
Sub WorkSheet_Change(ByVal Target As Range) lorsque les cellules de la feuille de calcul sont modifiées par l'utilisateur ou par un lien externe.
Target représente la plage modifiée, elle peut contenir plusieurs cellules.
Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) lorsque vous cliquez sur un lien hypertexte.
Target représente l'objet Hyperlink qui représente la destination du lien hypertexte.
Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) lorsque la sélection change dans une feuille de calcul.
Target représente la nouvelle plage sélectionnée.

Quelques exemples :

  • Cochez une cellule :
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
        If Target = "" Then
            Target = "X"
        Else
            Target = ""
        End If
        Cancel = True
    End Sub
  • Une farce, celle-ci déplace la sélection d'une ligne vers le bas et d'une colonne vers la droite :
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Static Farce As Boolean

        If Not Farce Then
            Farce = True
            Target.Offset(1, 1).Select
        Else
             Farce = False
        End If
    End Sub
    Pourquoi utiliser Farce, tout simplement parce que lorsque vous sélectionnez la nouvelle cellule avec Target.Offset(1, 1).Select, vous appelez de nouveau la procédure (Farce étant maintenant à True, vous n'exécutez pas de nouveau cette ligne), si cette variable n'existait pas la procédure travaillerait en boucle jusqu'à la provocation d'une erreur (vous vous retrouvez dans la cellule inférieure droite de la feuille).

  • Limiter l'évènement à une plage de cellule :
    Vous voulez, par exemple, exécutez une procédure lorsqu'une cellule de la plage A2:C10 est modifiée. Dans notre exemple, la procédure va simplement afficher le contenu et l'adresse de la cellule active.
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Union(Target, Range("A2:C10")).Address <> Range("A2:C10").Address Then Exit Sub
        MsgBox "La cellule " & ActiveCell.Address & " est égale à " & ActiveCell
    End Sub

    La méthode Union renvoie l'union d'une série de plages, ici si la cellule fait partie de la plage A2:C10 alors Union renverra la plage A2:C10 alors que si elle est en dehors, elle renvoie une combinaison de plage.

Quelques méthodes intéressantes

Imprimer E-mail
4 mars 2014
MéthodeAction
Activate Active la feuille (revient à cliquer sur l'onglet de la feuille).
Calculate Calcule la feuille
Copy(Before, After) Copie la feuille en un autre endroit du classeur. Before représente la feuille avant laquelle la feuille copiée sera placée, After représente la feuille après laquelle la feuille copiée sera placée. Vous ne devez renseigner que Before ou After.
Exemple : Worksheets(1).Copy ,Worksheets(3) qui copie la 1ère feuille avant la 3ème et  Worksheets(1).Copy Worksheets(3) qui copie la 1ère feuille après la 3ème.
Delete Supprime la feuille
Move(Before, After) Déplace la feuille en un autre endroit du classeur. Before et After se comporte comme pour la méthode Copy.
PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName) Imprime la feuille.
From : Numéro de la 1ère page,
To : Numéro de la dernière page,
Copies : Nombre de copie,
Preview : = True pour afficher un aperçu avant l'impression.
ActivePrinter : Le nom de l'imprimante à utiliser,
PrintToFile : = True pour imprimer dans un fichier,
Collate : = True pour assembler plusieurs copies
PrToFileName : spécifie le nom du fichier vers lequel vous souhaitez effectuer l'impression si PrintToFile : = True.
PrintPreview Affiche un aperçu de la feuille.
Protect(Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly) Protège une feuille.
Password : Chaîne de caractères spécifiant le mot de passe, respectez la casse (majuscule et/ou minuscule).
DrawingObjects = True
pour protéger les formes, False par défaut.
Contents = True
pour protéger le contenu, True par défaut.
Scenarios = True
pour protéger les scénarios, True par défaut.
UserInterfaceOnly =True
pour protéger l'interface utilisateur, mais pas les macros. Par défaut, la protection s'applique à la fois aux macros et à l'interface utilisateur.
Select Sélectionne la feuille.
Unprotect(Password) Supprime la protection d'une feuille, sans effet si la feuille n'est pas protégée.

Quelques propriétés intéressantes

Imprimer E-mail
4 mars 2014

Ne pas confondre Name et Names

ActiveSheet.Name permet de lire ou modifier le texte de l'onglet. Exemple :
ActiveSheet.Range("A1") = ActiveSheet.Name

ActiveSheet.Names permet de lire uniquement les noms propres à la feuille de calcul. Exemple : nommez Feuil1!Premiere, la cellule A1 et Feuil1!Seconde, la cellule B1, Feuil1 étant le nom de l'onglet. Puis tapez et exécutez cette procédure :
Sub essai()
   Dim Nom As Name
   Dim N As Byte

   N = 1
   For Each Nom In ActiveSheet.Names
      Cells(1, N) = Nom
      N = N + 1
   Next
End Sub
Cette procédure renverra les différents noms.

PageSetup

Renvoie un objet PageSetup qui représente une description de la mise en page. Il contient tous les attributs de mise en page (zone d'impression, marge gauche, marge inférieure, taille du papier, etc.) en tant que propriétés. Grâce aux propriétés de cet objet, vous pouvez entièrement paramétrer la mise en page dans le code. Exemple : 

Les collections

Imprimer E-mail
4 mars 2014

Dans Excel, vous avez 2 types de feuilles, les feuilles de calcul et les feuilles de graphique. Les 1ères représente la collection Worksheets et les 2es la collection Charts. Cette page est consacrée aux feuilles de calcul.

Pour travailler avec une feuille, vous pouvez utiliser les syntaxes suivantes :

  • Worksheets(n), où n est le numéro d'index de la feuille (de gauche à droite).
  • Worksheets("NomOnglet.xls"), où NomOnglet est le texte situé sur l'onglet de la feuille.
  • Le nom attribué à la feuille par l'intermédiaire de la propriété Name :
    • Dans la fenêtre VBA, affichez la fenêtre Propriétés (Affichage/Fenêtre propriétés)
    • Sélectionnez une feuille de calcul
    • Dans cette fenêtre Propriétés vous visualisez la propriété Name (à gauche) et le nom attribué à la feuille (à droite). Vous pouvez modifier ce nom, si possible en respectant cette règle : commencez le nom par flle, ce qui donne par exemple : flleIntro.
    • Vous pouvez dorénavent utiliser la feuille ainsi,
      flleIntro.Range("A1")="Essai d'utilisation d'une feuille"
    • Vous pouvez connaître ou attribuez un nom à la feuille avec la propriété CodeName.
  • ActiveSheet représente la feuille active (celle dont l'onglet est blanc et le nom est en gras.

Pour ajouter une ou plusieurs feuilles à un classeur, utilisez la méthode Add :
Worksheets.Add(Before, After, Count)Before représente la feuille qui doit suivre la nouvelle, After représente la feuille qui doit précéder la nouvelle et Count le nombre de feuilles à insérer. Si vous renseignez Before ne renseignez pas After et inversement. Si vous n'en renseignez aucun la nouvelle est ajoutée avant la feuille active.