Utilisation d’instructions Pour Chaque... Instructions Suivantes

Les instructionsPour Chaque... Suivant répètent un bloc d’instructions pour chaqueobjet d’une collection ou pour chaque élément d’une gamme. Visual Basic définit automatiquementune variable à chaque exécution de la boucle. Par exemple, la procédure suivante ajoute 10 à la valeur de chaque cellule de la plage A1 à A10.

Sub Add10ToAllCellsInRange()
    Dim rng As Range
    For Each rng In Range("A1:A10")
        rng.Value = rng.Value + 10
    Next
End Sub

Le code suivant effectue une boucle parcourant tous les éléments d’un tableau et attribue à chacun la valeur de la variable d’index I.

Dim TestArray(10) As Integer, I As Variant 
For Each I In TestArray 
 TestArray(I) = I 
Next I 

Itération sur une plage de cellules

Utilisez une boucle For Each...Next pour parcourir toutes les cellules d’une plage. La procédure suivante initialise une boucle dans la plage A1:D10 de Sheet1 et définit sur 0 (zéro) tout nombre dont la valeur absolue est inférieure à 0,01.

Sub RoundToZero() 
 For Each rng in Range("A1:D10") 
 If Abs(rng.Value) < 0.01 Then rng.Value = 0 
 Next 
End Sub

Sortie anticipée d’une boucle Pour Chaque... Suivant

L’instruction Pour Chaque... Suivant permet de sortir d’une boucle . Par exemple, lorsqu’une erreur se produit, utilisez l’instruction Sortir De dans le bloc d’instructions Vrai d’une instructionSi..Alors...Ou ou d’une instruction Sélectionner une Case contrôlant spécifiquement cette erreur. Si l’erreur ne se produit pas, l’instruction Si... Alors... Ou prend la valeur Faux et la boucle se poursuit normalement.

L’exemple suivant recherche la première cellule de la plage A1:B5 ne contenant pas un nombre. Dès qu’une cellule de ce type est trouvée, un message s’affiche et Exit For sort de la boucle.

Sub TestForNumbers() 
 For Each rng In Range("A1:B5") 
  If IsNumeric(rng.Value) = False Then 
   MsgBox "Cell " & rng.Address & " contains a non-numeric value." 
   Exit For 
  End If 
 Next rng 
End Sub

Utilisation de la boucle For Each...Next pour itérer sur une classe VBA

Pour chaque... Les boucles suivantes ne se contentent pas d’itérer sur les tableaux et les instances de l’objet Collection . Les boucles For Each...Next peuvent aussi itérer sur une classe VBA que vous avez écrite.

Voici un exemple qui vous montre comment vous pouvez procéder.

  1. Créez un module de classe dans Visual Basic Editor (VBE) et renommez-le CustomCollection.cc1

  2. Placez le code suivant dans le module nouvellement créé.

    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  3. Exportez ce module dans un fichier et stockez-le localement.cc2

  4. Une fois le module exporté, ouvrez le fichier exporté à l’aide d’un éditeur de texte (le logiciel Bloc-notes de Windows devrait suffire). Le contenu du fichier doit se présenter comme dans l’exemple suivant.

    VERSION 1.0 CLASS
    BEGIN
    MultiUse = -1  'True
    END
    Attribute VB_Name = "CustomCollection"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = False
    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  5. Dans l’éditeur de texte, supprimez le caractère ' de la première ligne sous le texte Property Get NewEnum() As IUnknown du fichier. Enregistrez le fichier modifié.

  6. De retour dans VBE, supprimez la classe que vous avez créée de votre projet VBA et choisissez de ne pas l’exporter quand vous y êtes invité.cc3

  7. Importez le fichier dans lequel vous avez supprimé le caractère ' dans VBE.cc4

  8. Exécutez le code suivant pour vérifier que vous pouvez maintenant itérer sur votre classe VBA personnalisée que vous avez écrite avec VBE et un éditeur de texte.

    Dim Element
    Dim MyCustomCollection As New CustomCollection
    For Each Element In MyCustomCollection
    MsgBox Element
    Next
    
Notes de bas de page Description
[cc1] Vous pouvez créer un module de classe en choisissant Module de classe dans le menu Insertion. Vous pouvez renommer un module de classe en modifiant ses propriétés dans la fenêtre Propriétés.
[cc2] Vous pouvez activer la boîte de dialogue Exporter le fichier en choisissant Exporter un fichier dans le menu Fichier.
[cc3] Vous pouvez supprimer un module de classe de VBE en choisissant Supprimer un élément dans le menu Fichier.
[cc4] Vous pouvez importer un fichier de module de classe externe en activant la boîte de dialogue Importer le fichier (choisissez Importer un fichier dans le menu Fichier).

Voir aussi

Assistance et commentaires

Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.