Excel VBA: utiliser le numéro d'index dans une boucle For dans un nom de gamme

J'aimerais utiliser le numéro d'index dans une boucle For dans un nom de plage. Voir ci-dessous. Je reçois une erreur «Objet requirejs». Merci de votre aide.

Cordialement,

Dante

Dim i As Integer For i = 2 To 25 If Not Intersect(range_1, range_ & i) Is Nothing Then MsgBox ("Error! range_1 and range_" & i & " overlap!") End If Next i 

Je laisse la réponse précédente puisque, dans le cas de gammes nommées , c'est correct et a été amélioré par quelqu'un d'autre, afin que les users qui searchnt des problèmes avec des plages nommées pourraient le find utile.

D'autre part, ce que vous vouliez probablement dire, c'est que vous avez assigné la scope à une variable , comme (bien sûr, ce n'est qu'un exemple, je ne peux pas savoir comment vous avez effectué votre mission)

 Set range_1 = Range("A1") Set range_2 = Range("A2") '... Set range_25 = Range("A25) 

Malheureusement, vous ne pouvez pas bouger comme ça via le nom des variables. Mais ce que vous pouvez faire, c'est créer une collection de plages, afin que vous puissiez les accéder ces derniers time en utilisant un index pour l'itérer à travers eux:

 Dim ranges As Collection: Set ranges = New Collection ranges.Add range_1 ranges.Add range_2 '... ranges.Add range_25 

Plus en général, ajoutez la scope à la collection chaque fois que vous la définissez. Notez que même si cette gamme va changer à un stade ultérieur, la scope de votre list va également changer car la méthode Add crée une copy peu profonde de l'object (en d'autres termes, il indique toujours l'object d'origine).

Maintenant, la collection de gammes stocke vos objects de gamme et vous pourrez les accéder par index. Par exemple, dans votre cas particulier:

 For j = 2 To 25 If Not Intersect(ranges(1), ranges(j)) Is Nothing Then 

En tant que bonne pratique, n'oubliez pas que chaque fois que vous voudrez faire itérer à travers une série d'objects / variables «humanement indexables» comme dans votre cas, vous voudrez souvent les jeter dans une collection car le nom des variables ne peut pas être créé / changé du code lui-même.

Vous ne pouvez pas append de nombres aux noms de variables. La fonction Intersection prend des objects de plages, donc vous pouvez écrire:

 Dim i As Integer For i = 2 To 25 If Not Intersect(Range("range_1"), Range("range_" & i)) Is Nothing Then MsgBox ("Error! range_1 and range_" & i & " overlap!") End If Next i 

Bien sûr, je suppose que vous avez bien nommé vos gammes avec "range_1", "range_2" etc.

EDIT (par Doug): voici une version qui vous permet de vérifier la fiche correcte. Dans ce cas, il est défini sur ActiveSheet, mais vous pouvez l'ajuster. Notez que cela vérifie les gammes nommées définitivement définies dans la feuille de calcul, et non les plages définies comme variables dans votre code:

 Sub CheckIntersect() Dim ws As Worksheet Dim i As Long Set ws = ActiveSheet 'adjust if necessary For i = 2 To 25 If Not Intersect(ws.Range("range_1"), ws.Range("range_" & i)) Is Nothing Then MsgBox ("Error! range_1 and range_" & i & " overlap!") End If Next i End Sub