Objets et événements Excel

Sur cette page

Définitions

Modèle Objet Excel

Principaux objets Excel

Principaux événements Excel

Autres objets intéressants

Autres objets, autres propriétés

Objet implicite (With)

Exemple 1: Changer la couleur d'arrière-plan des cellules modifiées.

Exemple 2: Une fonction qui affiche le contenu réel d'une cellule.

Exemple 3: Empêcher la modification des cellules dont l'arrière-plan est rouge.

Exemple 4: Empêcher la modification des cellules ne faisant pas partie d'une plage.

Exemple 5: Empêcher le déplacement du curseur Excel tant qu'une condition n'est pas respectée.

Exemple 6: Trouver toutes les cellules d'une feuille contenant le mot Liberté.

Exemple 7: Obtenir le nom et la taille du dossier contenant le classeur Excel actif.

Sommaire

Fichier exemples

Conseils de programmation

Liste d'instructions

Définitions

Objet: Un objet est une instance d'une classe (!).
En fait, un objet est une "entité" informatique qu'un programme informatique peut manipuler.
Dans le cadre du présent tutoriel, un objet est une entité externe à VBA que votre programme VBA peut (veut?) manipuler.
Le cas le plus évident est une cellule de classeur. Pour la manipuler, VBA utilise une instance de la classe Range.
Classe: Une classe est une catégorie (sorte) d'objets. Votre programme peut manipuler une cellule précise (ou un groupe de cellule), mais pas le concept de cellule.
Propriétés: Chaque objet possède des propriétés qui le décrivent. La liste des propriétés varie d'une classe à l'autre, mais tous les objets d'une même classe ont les mêmes propriétés. Ce qui les distingue, ce sont les valeurs des propriétés.
Par exemple, toutes les feuilles Excel ont la propriété Name, mais la valeur de la propriété Name est différente pour chaque feuille (du moins on le souhaite).
Méthode: Une méthode est une action que peut réaliser un objet. La liste des méthodes varie d'une classe à l'autre, mais tous les objets d'une même classe ont les mêmes méthodes.
Par exemple, la méthode Copy d'une cellule permet de copier le contenu de cette cellule dans le presse-papier (ou dans une autre cellule).
Évidemment, il arrive qu'une méthode change les propriétés d'un objet. Par exemple, la méthode PasteSpecial d'une cellule change une ou plusieurs propriétés de cette cellule.
Événement: Un événement permet d'associer une procédure VBA à un objet. Par exemple, l'événement Change d'une feuille se produit lorsqu'une cellule de cette feuille est modifiée et permet d'associer une procédure nommée Worksheet_Change à cette feuille Excel.
Collection: Ensemble d'objets d'une même classe qui peuvent être adressés avec le nom de la collection et un numéro d'item.
Par exemple, un classeur Excel est une collection Sheets d'objets WorkSheet et/ou Chart

Modèle Objet Excel

VBA peut manipuler le contenu d'un classeur Excel par les objets qu'il contient. Mais comment trouver le nom de l'objet (ou de la classe) qu'il faut utiliser?

Le plus simple est d'utiliser l'enregistreuse de macro-commande.

Par exemple, pour trouver comment changer la couleur de fonds d'une feuille Excel,

Le document pdf ci-dessous illustre le fonctionnement de l'enregistreuse:

Enregistrer une macro-commande

 

Une façon plus complexe est d'explorer le modèle objet Excel.
L'aide VBA Excel 2007 permet de l'explorer en accédant à la rubrique:
Référence du développeur Excel 2007
Microsoft vous offre ici la liste des principaux objets Excel en ordre alphabétique, ce qui est pratiquement inutilisable.

Le document suivant explique comment installer l'aide locale VBA:

Installer l'Aide VBA locale

 

Vous pouvez y parcourir la hiérarchie des objets Excel:

et trouver l'objet qui vous intéresse en cliquant d'abord sur Range, puis en trouvant la propriété ou l'objet Interior, et en devinant qu'il faut adresser l'objet Interior de la collection Cells de la feuille voulue.

Principaux objets Excel

Les cellules Excel sont des objets de la classe Range.

La meilleure façon d'accéder aux propriétés d'une plage de cellules Excel depuis VBA est de nommer cette plage en Excel, puis d'utiliser ce nom comme référence de Range.

Une technique beaucoup moins utile (mais hélas trop répandue) est d'utiliser l'adresse de la plage.

Une variante de cette technique est l'utilisation de la méthode Evaluate (voir plus loin).

Aussi peu utile.

Deux autres façons utilisent des numéros de ligne et de colonne, et sont beaucoup plus utiles.

Attention, l'objet Cells utilise l'adressage Ligne, Colonne, alors que Excel utilise Colonne, Ligne (E5).

Ces deux dernières techniques peuvent être utilisées avec l'objet Range pour désigner des plages.

L'utilisation d'un nom de plage au lieu d'une adresse permettra de déplacer la plage dans Excel sans devoir modifier la programmation VBA.
Il est donc FORTEMENT suggéré de manipuler les lignes d'une liste de données ainsi:

Cellule ou plage? Le modèle objet Excel ne fait pas la différence entre une plage et une cellule. Une cellule est simplement une plage ne contenant qu'une cellule.
Range("A1:B9") est un objet de la même classe que Range("A1") et possède donc les mêmes propriétés (dont les valeurs peuvent être différentes) et méthodes.

Un objet Range est aussi une collection de cellules, Comme une cellule est un Range (d'une cellule), c'est une collection ne comptant qu'un objet.
Un Range est donc une collection de collections.

Plages spéciales.  Certaines propriétés du modèle objet Excel contiennent des plages spécifiques:

Cells Plage qui contient toutes les cellules d'une feuille:
  • ActiveSheet.Cells
  • Sheets("Province").Cells

On peut adresser une cellule de cette plage:

Sheets("Province").Cells(3,5) désigne la cellule E3 de la feuille Province.

UsedRange Plage délimitée par la première (haut-gauche) et la dernière (bas-droite) des cellules occupées d'une feuille:
  • ActiveSheet.UsedRange
  • Sheets("Province").UsedRange
CurrentRegion Plage continue (limitée par des lignes et des colonnes vides) dont fait partie la cellule:
  • Range("Titre").CurrentRegion
Rows Collection des lignes d'une plage. Permet d'obtenir une ligne d'une plage:
  • Range("ListeProvinces").Rows(1)
  • Range("Titre").CurrentRegion.Rows(1)
Columns Collection des colonnes d'une plage. Permet d'obtenir une colonne d'une plage:
  • Range("ListeProvinces").Columns(1)
  • Range("Titre").CurrentRegion.Columns(1)
SpecialCells Plages spéciales d'une plage Excel:
  • SpecialCells(xlCellTypeBlanks)  Cellules vides
  • SpecialCells(xlCellTypeConstants). Cellules contenant des constantes
  • SpecialCells(xlCellTypeFormulas). Cellules contenant des formules
  • SpecialCells(xlCellTypeLastCell). Dernière cellule dans la plage utilisée
  • SpecialCells(xlCellTypeVisible).Toutes les cellules visibles
  • ...

Les objets Range ont un grand nombre de propriétés. Voici les plus intéressantes:

Column Numéro de la colonne de gauche de la plage
  • Range("B4:H6").Column vaut 2
Columns.Count Nombre de colonnes de la plage
  • Range("B4:H6").Columns.Count vaut 7
Row Numéro de la ligne du haut de la plage
Rows.Count Nombre de lignes de la plage
Count Nombre de cellules de la plage
CurrentRegion Plage continue (limitée par des lignes et des colonnes vides) dont fait partie la cellule.
End(xlDown) Cellule de la dernière ligne à la fin de la zone qui contient la plage. Correspond aux touches Fin+Bas.
End(xlToRight) Cellule de la dernière colonne à la fin de la zone qui contient la plage. Correspond aux touches Fin+Droite.
Text Valeur AFFICHÉE de la cellule, donc évaluée et formatée.
Value Valeur ÉVALUÉE de la cellule.
Worksheet Objet Worksheet qui est la feuille qui contient la plage

Les feuilles Excel sont des objets de la classe Worksheet.

Elles sont regroupées dans la collection Worksheets et dans la collection Sheets.

On peut manipuler une feuille de classeur par son nom:

La différence entre les deux collections est que la collection Sheets contient aussi les objets Chart du classeur.

Les classeurs Excel sont des objets de la classe Workbook.

Tous les classeurs ouverts sont regroupés dans la collection Workbooks.

La programme Excel lui-même, lorsque démarré, est un objet de la classe Application.

Le classeur actif est:
Application.
ActiveWorkbook ou plus simplement ActiveWorkbook.

Le classeur contenant le code VBA en cours d'exécution est:
Application.ThisWorkbook ou plus simplement ThisWorkbook.

La feuille active du classeur actif est:
Application.ActiveWorkbook.ActiveSheet ou plus simplement ActiveSheet.

La cellule active de la feuille active du classeur actif est:
Application.ActiveWorkbook.ActiveSheet.ActiveCell ou plus simplement ActiveCell.
La cellule active de la feuille nommée Province du classeur actif est:
Application.ActiveWorkbook.Worksheets("Province").ActiveCell ou plus simplement Worksheets("Province").ActiveCell.
etc.

L'objet Selection est l'objet passe-partout, qui contient ce qui est sélectionné dans le classeur Excel. Ce peut être une plage, un graphique, un tableau croisé ou n'importe quoi. L'utilisation de Selection en VBA est à éviter, puisqu'il risque fort de contenir une sélection inattendue lors de l'exécution du programme. Si vous utilisez l'objet Selection, n'oubliez pas de valider le type de l'objet qu'il contient.

La barre d'état de la fenêtre Excel est l'objet StatusBar.

Méthodes Excel

La plupart des opérations que l'utilisateur peut faire en Excel peuvent être programmées en VBA grâce aux méthodes des différents objets du modèle objet Excel.

Voici les plus intéressantes:

Evaluate Permet d'exécuter en VBA une formule Excel (ce qui est à droite du signe = dans une cellule). La méthode Evaluate peut être remplacée par les crochets:
[2+2] équivaut à Evaluate("2+2") et vaut 4. Attention, ce qui est incorrect dans une cellule est incorrect pour Evaluate.
  • [A1] équivaut à Range("A1").Value
  • [Sum("A2:H6")] exécute la formule Excel Somme("A2:H6")
Intersect Retourne une plage formée des cellules communes de deux plages.
  • Intersect(Range("A1:C4"),Range("B2:D5")) équivaut à Range("B2:C4")

Cette méthode permet de savoir si une cellule appartient à une plage:

  • (Intersect(Range("B6"),Range("Provinces") is Nothing)
    est faux si B6 fait partie de la plage Provinces.
Calculate Recalcule la feuille ou le classeur Excel
  • Calculate
  • ActiveWorksheet.Calculate
Save Enregistre le classeur
  • ActiveWorkbook.Save
Quit Ferme Excel.
Attention, si le classeur a été modifié mais non sauvegardé, la boîte de dialogue de sauvegarde d'Excel sera affichée.
Voir la méthode Save.
  • Application.Quit
Clear
ClearContents
ClearFormats
Effacent respectivement les cellules, les contenus ou les formats d'une plage.
  • Range("A1").Clear
  • Worksheet("Tableaux").Clear
Copy Copie le contenu d'une plage dans une autre ou dans le presse-papier
  • Range("A1").Copy Range("B1")
    copie le contenu de A1 dans B1
  • Range("A1").Copy
    copie le contenu de A1 dans le presse-papier>
PasteSpecial Colle le contenu d'une plage ou du presse-papier dans une plage. On peut spécifier le type de collage spécial: xlPasteAll (défaut), xlPasteAllExceptBorders,  xlPasteColumnWidths. xlPasteComments, xlPasteFormats, xlPasteFormulas, xlPasteFormulasAndNumberFormats, xlPasteValidation, xlPasteValues ou  xlPasteValuesAndNumberFormats.
  • Range("Total").Copy
    copie la plage Total dans le presse-papier
  • Range("A1").PasteSpecial (xlPasteValues)
    copie la VALEUR du presse-papier dans la cellule A1. li>
Find
et
FindNext
Ces deux méthodes permettent d'effectuer une recherche dans une plage de cellules. Voir Exemple 6.
Select Sélectionne une cellule ou une feuille Excel.
À éviter la plupart du temps en programmation VBA, car le déplacement du curseur Excel est rarement souhaitable pendant l'exécution d'un programme VBA.
Sort Tri de plage. Voir l'aide VBA Excel pour en connaître le fonctionnement. Il est aussi utile d'utiliser l'enregistreuse de macro-commandes sur un tri manuel des données pour en analyser les paramètres.
Volatile

Force l'exécution d'une Function à chaque fois que le classeur est recalculé.

  •  Application.Volatile

Normalement, Excel recalcule les formules des cellules lorsque leurs antécédants sont modifiés. Dans le cas des fonctions personnalisées VBA (Function) utilisées dans Excel, le recalcul ne se fait pas toujours. Application.Volatile utilisée dans une procédure Function assure que la Function sera réexécutéer à chaque recalcul du classeur Excel.

 

Principaux événements Excel

Objet Événement Paramètres Se produit lorsque Utilisé pour
Workbook Open   Le classeur Excel est ouvert
  • Afficher un écran d'accueil
  • Afficher ou masquer des éléments d'Excel ou du classeur
  • Initialiser des paramètres
  • ...
Workbook BeforeClose Cancel Lorsqu'une demande de fermeture
du classeur a été faite
  • Contrôler ou empêcher la sauvegarde du classeur
  • Gérer des copies de sécurité
  • Contrôler ou empêcher la fermeture du classeur
  • Rétablir l'affichage d'éléments Excel
  • ...
Workbook SheetChange Sh la feuille modifiée
Target
la plage modifiée
Lorsqu'une cellule ou plage du classeur est modifiée
  • Contrôler ou empêcher la modification d'une cellule (voir exemples).
    Utiliser lorsque la même procédure s'applique à toutes les plages du classeur
Worksheet Change Target la plage modifiée Lorsqu'une cellule ou plage de la feuille qui contient la procédure Sub est modifiée
  • Contrôler ou empêcher la modification d'une cellule (voir exemples).
    Utiliser lorsque la procédure ne s'applique qu'aux plages d'une seule feuille
Worksheet SelectionChange Target la nouvelle plage sélectionnée Lors de la sélection d'une autre plage dans un classeur
  • Contrôler ou empêcher le déplacement du curseur dans un classeur Excel (voir exemples).

Remarquez que dans les événements SheetChange, Change et SelectionChange, VBA n'a pas directement accès aux valeurs précédant le changement,
ni à un paramètre Cancel pour annuler le changement. Il faut utiliser une astuce pour empêcher le changement. Voir les exemples.

Notez finalement qu'on peut désactiver le traitement des événements, en utilisant la propriété EnableEvents.

Autres objets intéressants

Me

C'est un objet Excel ou VBA contenant le code en cours d'exécution. Si le code appartient à une feuille, c'est un objet Worksheet contenant cette feuille.
Me est le plus souvent utilisé pour désigner le formulaire VBA (Forms) contenant le code en cours d'exécution. On évite ainsi de nommer le formulaire
dans le code VBA , ce qui donne des programmes plus faciles à utiliser dans d'autres formulaires.

Utilisation la plus fréquente:

Err

C'est un objet VBA contenant la dernière erreur rencontrée. Ses propriétés permettent d'en connaître la nature:

VBA peut déclencher une erreur avec Err:

FileSystemObject

C'est l'objet contenant des instructions permettant à VBA d'accéder à l'arborescence de dossiers et de fichiers de l'ordinateur.

ATTENTION ce n'est pas un objet VBA ni un objet Excel, mais un objet de la librairie Microsoft Scripting Runtime.

Vous devez référencer cette librairie dans l'éditeur de code VBA avant de l'utiliser. Voir Exemples.

Objets intéressants:

Drives Collection d'objets Drive
Drive Objet contenant un lecteur
Folders Collection d'objets Folder
Folder Objet contenant un dossier
Files Collection d'objets File
File Objet contenant un fichier

Un objet FileSystemObject contient une collection Drives.
Chaque objet Drive de la collection Drives contient une collection Folders et une collection Files.
Chaque objet Folder d'une collection Folders contient une collection Folders et une collection Files.
Chaque objet File d'une collection Files contient un fichier (document Windows).

Cette structure permet de parcourir l'arborescence de documents en VBA comme avec l'explorateur Windows.

Autres objets, autres propriétés

Les environnements Excel, Office et Windows offrent une richesse incroyable d'objets et de propriétés qu'il est impossible de décrire ici
(ni ailleurs d'ailleurs), ne serait-ce que parce que cette liste change constamment.

Il vous faudra donc développer l'habilité de soupçonner l'existence de l'objet que vous souhaitez utiliser et d'en découvrir le nom et la documentation.
Bonne chance.

Objet implicite (With)

Il arrive fréquemment qu'une série d'instructions utilise le même objet. L'écriture (et la lecture) du code VBA devient alors fastidieuse, avec la répétition incessante de la même référence.

L'instruction With permet de réduire les répétitions.

With objet
   
[instructions]
End With
 

Où:

  • objet Nom d'un objet.
  • instructions Une ou plusieurs instructions VBA

À l'intérieur du bloc With ... End With, toute référence commençant par un . (point) appartient à objet.

ATTENTION: With N'est PAS une instruction de boucle ou de répétition ou de test. Si le code doit être répété, il doit être encadré d'une instruction de boucle (Do) ou de test (If).

Dans l'exemple 2 ci-dessous, le code:

    If Target.Interior.Color = Range("CouleurVerrou").Interior.Color Then
        Application.EnableEvents = False 'Empêcher une boucle d'événements
        Application.Undo                 'Annuler le changement
        Application.EnableEvents = True  'Très important de réactiver
    End If

pourrait être:   

    With Application
        If Target.Interior.Color = Range("CouleurVerrou").Interior.Color Then
            .EnableEvents = False 'Empêcher une boucle d'événements
            .Undo                 'Annuler le changement
            .EnableEvents = True  'Très important de réactiver
        End If
    End With

Trucs et astuces

Pour obtenir le numéro de la prochaine ligne disponible dans une liste (plage) nommée Liste.

Notez que la dernière instruction [MATCH(TRUE,ISBLANK(Liste),0)] est en fait une formule Excel qui est utilisable directement dans le classeur.
La version Excel française de la formule est:
{=EQUIV(VRAI;ESTVIDE(Liste);0)}
Les {} indiquent que c'est une fonction matricielle, qui doit donc être entrée dans un classeur Excel avec Ctrl-Maj-Enter.

Exemples

Exemple 1: Changer la couleur d'arrière-plan des cellules modifiées.

  • Créez la procédure événementielle
  1. Double-cliquez sur ThisWorkbook pour ouvrir le module VBA associé au classeur
  2. Choisissez Workbook dans la liste d'objets
  3. Choisissez SheetChange dans la liste d'événements

La procédure Sub Workbook_SheetChange est créée pour vous.

 

 

 

  • Insérez le code ci-contre
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Auteur: Michel Berthiaume
'Changer l'arrière-plan d'une cellule modifiée

    'Target est la plage modifiée (voir les paramètres de la procédure, ci-dessus)
    Target.Interior.Color = vbYellow 'Jaune

End Sub
  • Testez le programme en Excel: toute cellule modifiée devient jaune.
 

Il est possible de restreindre les modifications à une seule feuille:

Si les deux techniques fonctionnent, la seconde limite l'éparpillement du code dans plusieurs modules et produit donc un programme plus facile à comprendre et à modifier plus tard.

Exemple 2: Une fonction qui affiche le contenu réel d'une cellule.

  • Dans un module VBA Excel, insérer le code ci-joint:Ouvrez le module VBA associé au classeur Excel

 

Function fnValeurCellule(rCellule)
'Auteur: Michel Berthiaume
'Retourne le contenu (formule ou valeur) de la cellule en paramètre
    If TypeName(rCellule) <> "Range" Then
        fnValeurCellule = "Erreur de paramètre"
        Exit Function
    End If
    fnValeurCellule = rCellule.Formula
End Function

 

Dans une (ou plusieurs) cellules du classeur Excel, utilisez la fonction
=fnValeurCellule(A2)
en remplaçant A2 par une référence à une cellule Excel dont vous voulez afficher le contenu réel.

 

 

Exemple 3: Empêcher la modification des cellules dont l'arrière-plan est rouge.

  • Ouvrez le module VBA associé au classeur Excel

 

 

  • Insérez le code ci-contre
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Auteur: Michel Berthiaume
'Empêcher la modification de cellules dont l'arrière-plan
' est d'une couleur choisie par l'utilisateur
'Note: la feuille doit contenir une cellule nommée CouleurVerrou
' de la couleur choisie

'Target est la plage modifiée (voir les paramètres de la procédure, ci-dessus)
    If Target.Interior.Color = Range("CouleurVerrou").Interior.Color Then
        Application.EnableEvents = False 'Empêcher une boucle d'événements
        Application.Undo                 'Annuler le changement
        Application.EnableEvents = True  'Très important de réactiver
    End If
End Sub
 
  • Dans Excel, changez l'arrière-plan d'une plage de cellules.
  • Créez une plage nommée CouleurVerrou à partir d'une cellule de la plage ainsi colorée.
  • Testez le programme en Excel: toute changement à une cellule de la plage colorée est annulée par le programme
 

 

 

Remarquez ici l'utilisation de la propriété EnableEvents pour empêcher que l'instruction suivante (la méthode Undo) provoque l'événement Workbook_SheetChange et entraîne ainsi une succession sans fin d'exécution de la procédure Sub correspondante.
Workbook_SheetChange appelant Workbook_SheetChange appelant Workbook_SheetChange appelant Workbook_SheetChange ...

Exemple 4: Empêcher la modification des cellules ne faisant pas partie d'une plage.

  • Ouvrez le module VBA associé au classeur Excel

 

 

  • Insérez le code ci-contre
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Auteur: Michel Berthiaume
'Empêcher la modification de cellules en dehors
' d'une plage nommée ZoneDeSaisie
'Note: le classeur doit contenir une plage nommée ZoneDeSaisie

    'Target est la plage modifiée (voir les paramètres de la procédure, ci-dessus)
    If Intersect(Target, Range("ZoneDeSaisie")) Is Nothing Then
        Application.EnableEvents = False 'Empêcher une boucle d'événements
        Application.Undo                 'Annuler le changement
        Application.EnableEvents = True  'Très important de réactiver
    End If
End Sub
 
  • Dans Excel, créez une plage nommée ZoneDeSaisie.
  • Testez le programme en Excel: toute changement à une cellule ne faisant pas partie de la plage ZoneDeSaisie est annulée par le programme.
 

 

 

Exemple 5: Empêcher le déplacement du curseur Excel tant qu'une condition n'est pas respectée.

L'événement qui nous intéresse est SelectionChange, qui n'a pas de paramètre Cancel, donc qu'on ne peut pas annuler directement.
La méthode Undo ne fonctionne pas non plus, car elle n'annule pas le déplacement. De plus, elle risquerait d'annuler une modification, alors qu'on ne veut annuler que le déplacement.
Il faudra donc que le programme garde trace de la dernière cellule sélectionnée.

Dans le programme ci-dessous, dès que l'utilisateur sélectionne une cellule de la plage ZoneDeSaisie, il ne peut pas déplacer le curseur hors de la plage tant que la somme des cellules de la plage sera différente de 10.

Le programme utilise une plage Excel nommée DernièreCellule pour conserver l'adresse de la dernière cellule sélectionnée.

 

  • Insérez les fonctions ci-contre dans un module VBA:
Function fnDéplacementValide()
'Auteur: Michel Berthiaume
'Retourne Vrai si la somme des cellules de la plage ZoneDeSaisie est égale à 10

    fnDéplacementValide = ([sum(ZoneDeSaisie)] = 10)

End Function

Function fnPlageAdansPlageB(plageA, PlageB)
'Auteur: Michel Berthiaume
'Retourne Vrai si plageA est complètement dans PlageB ou l'inverse
    If plageA.Worksheet.Name <> PlageB.Worksheet.Name Then
        fnPlageAdansPlageB = False
    ElseIf Intersect(plageA, PlageB) Is Nothing Then
        fnPlageAdansPlageB = False
    Else
        fnPlageAdansPlageB = (Intersect(plageA, PlageB).Count = plageA.Count)
    End If

End Function

  • Dans la procédure Sub Workbook_Open() insérez:
[DernièreCellule] = ActiveSheet.Name & "!" & ActiveCell.Address
  • Dans la procédure Sub Workbook_SheetSelectionChange() insérez:
'La destination doit être à l'extérieur de la ZoneDeSaisie
If fnPlageAdansPlageB(Target, [ZoneDeSaisie]) Then
    [DernièreCellule] = ActiveSheet.Name & "!" & ActiveCell.Address
    Exit Sub
End If

If fnDéplacementValide() Then
    [DernièreCellule] = ActiveSheet.Name & "!" & ActiveCell.Address
    Exit Sub
End If

Application.EnableEvents = False 'Empêcher une boucle d'événements
Application.Goto Reference:=Range([DernièreCellule]) 'Annuler le déplacement
Application.EnableEvents = True

 

Exemple 6: Trouver toutes les cellules d'une feuille contenant le mot Liberté.

Technique 1, utilisant une boucle testant chaque cellule d'une plage. Notez bien que le résultat est une plage de cellules disjointes, chacune contenant le mot cherché.

Notez aussi qu'on a généralisé la solution, qui permet de chercher n'importe quelle chaîne de caractères dans n'importe quelle plage Excel.

  • Insérez les fonctions ci-contre dans un module VBA:
Function fnTrouveMotDansPlage(sMot, rPlage)
'Auteur: Michel Berthiaume
'Retourne une plage formée des cellules de rPlage contenant sMot

Dim rTrouvée As Range 'contiendra les cellules trouvées
Dim rCellule As Range 'contiendra chaque cellule testée, à tour de rôle

    For Each rCellule In rPlage    'Pour chaque cellule de rPlage
        'Si sMot est dans rCellule
        If InStr(UCase(rCellule.Value), UCase(sMot)) > 0 Then
            If rTrouvée Is Nothing Then  'Première cellule trouvée
                Set rTrouvée = rCellule
            Else                         'Cellules trouvées suivantes
                Set rTrouvée = Union(rTrouvée, rCellule)
            End If
        End If   
    Next
    Set fnTrouveMotDansPlage = rTrouvée
End Function

  • Le nombre de cellules contenant le mot Liberté trouvées dans la plage A1:C6 peut maintenant être obtenu avec l'expression VBA:
fnTrouveMotDansPlage("Liberté", Range("A1:C6")).Count
  • ou avec la formule Excel
=NBVAL(fnTrouveMotDansPlage("Liberté";A1:C6))
  • On peut mettre ces cellules en rouge avec l'instruction VBA:
fnTrouveMotDansPlage("Liberté", Range("A1:C6")).interior.color = vbRed

Remarques sur cette fonction

Technique 2, utilisant les méthodes Find et Findnext dans une boucle cherchant les cellules d'une plage. Notez bien que le résultat est le même que dans la technique 1.

  • Insérez les fonctions ci-contre dans un module VBA:
Function fnTrouveMotDansPlage(sMot, rPlage)
'Auteur: Michel Berthiaume
'Retourne une plage formée des cellules de rPlage contenant sMot


Dim rTrouvées As Range
Dim rCelluleTrouvée As Range
Dim rPremièreTrouvée As Range

    Set rCelluleTrouvée = rPlage.Find(sMot)
    If rCelluleTrouvée Is Nothing Then
        Exit Function 'Aucune occurrence
    End If

    'Find et FindNext trouveront toutes les occurrences,
    'puis recommenceront à la première
    'Il faut donc chercher jusqu'à ce qu'on trouve la première à nouveau.
    Set rPremièreTrouvée = rCelluleTrouvée
    Set rTrouvées = rCelluleTrouvée
    Set rCelluleTrouvée = rPlage.FindNext(rCelluleTrouvée)
 
    Do While Not rCelluleTrouvée = rPremièreTrouvée
        Set rTrouvées = Union(rTrouvées, rCelluleTrouvée)
        Set rCelluleTrouvée = rPlage.FindNext(rCelluleTrouvée)
    Loop
    Set fnTrouveMotDansPlage2 = rTrouvées
End Function

Exemple 7: Obtenir le nom et la taille du dossier contenant le classeur Excel actif.

 

  • Insérez les fonctions ci-contre dans un module VBA:
Function fnDossier(Optional param = 0)
'Auteur Michel Berthiaume
'Retourne le nom du dossier et/ou l'espace qu'il utilise

'La ligne suivante requiert une référence à Microsoft Scripting Runtime
Dim fso As New Scripting.FileSystemObject

    If param = 1 Then
        fnDossier = ActiveWorkbook.Path
        Exit Function
    ElseIf param = 2 Then
        fnDossier = (fso.GetFolder(ActiveWorkbook.Path).Size) / 1024
        Exit Function
    Else
        fnDossier = ActiveWorkbook.Path & ": " & _
            Round(fso.GetFolder(ActiveWorkbook.Path).Size / 1024, 2) & _
            " Ko"
    End If

End Function

Remarques sur cette fonction

 

Sommaire

Fichier exemples

Le fichier Excel Tutoriel Exemples Objets.xlsm contient les exemples présentés dans la présente section.

 

Suite: Conseils de programmation