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.
Sub SetArrayValue()
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
End Sub
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.
Créez un module de classe dans Visual Basic Editor (VBE) et renommez-le CustomCollection.cc1
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
Exportez ce module dans un fichier et stockez-le localement.cc2
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
Dans l’éditeur de texte, supprimez le caractère
'
de la première ligne sous le texteProperty Get NewEnum() As IUnknown
du fichier. Enregistrez le fichier modifié.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
Importez le fichier dans lequel vous avez supprimé le caractère
'
dans VBE.cc4Exé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.