Microsoft 365 Boucle sur plages nommées

Calvus

XLDnaute Barbatruc
Bonjour,

Je pense avoir déjà fait cela, mais je ne me souviens pas, et du coup je ne suis pas sûr...

J'ai 6 plages, Plage1, Plage2, etc.

J'aimerais boucler dessus, mais cela ne fonctionne pas.
L'idée est de remplacer le numéro de ma plage par i :

VB:
Set Plage1 = Range("C9:G9")
Set Plage2 = Range("C21:G21")
Set Plage3 = Range("C33:G33")
Set Plage4 = Range("C45:G45")
Set Plage5 = Range("C57:G57")
Set Plage6 = Range("C69:G69")

For i = 1 To 6
    Plage(i).Select
Next i

Comment faire ?

Merci d'avance.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Calvus,
3 façons possibles parmi d'autres :
VB:
Sub Essai1()
Plage = Array(Range("C9:G9"), Range("C21:G21"), Range("C33:G33"), Range("C45:G45"), Range("C57:G57"), Range("C69:G69"))
For i = 0 To 5
    Plage(i).Select
Next i
End Sub
Sub Essai2()
Plage = Array("C9:G9", "C21:G21", "C33:G33", "C45:G45", "C57:G57", "C69:G69")
For i = 0 To 5
    Range(Plage(i)).Select
Next i
End Sub
Sub Essai3()
Dim Plage(6)
Set Plage(1) = Range("C9:G9")
Set Plage(2) = Range("C21:G21")
Set Plage(3) = Range("C33:G33")
Set Plage(4) = Range("C45:G45")
Set Plage(5) = Range("C57:G57")
Set Plage(6) = Range("C69:G69")
For i = 1 To 6
    Plage(i).Select
Next i
End Sub
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Une autre voie
[adaptée à cet exemple précis]
Code:
Const rng As String = "C9"
Sub test()
mess = Range(rng).Resize(, 5).Address(0, 0) & vbCr
For i = 0 To 4
mess = mess & Range(rng).Offset((i + 1) * 12).Resize(, 5).Address(0, 0) & vbCr
Next
MsgBox mess
End Sub
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re, Re Staple,
il fallait que je déclare mes plages comme des tableaux et non comme des Range
Le problème c'est que "Plage(i)" est un élément de tableau donc le VBA ne pouvait pas comprendre.
Sinon, plus simple adapté à votre contexte :
VB:
Sub Essai4()
For i = 1 To 6
    N = 12 * i - 3
    Range("C" & N & ":G" & N).Select
Next i
End Sub
Maintenant, vous avez le choix. :)
 

patricktoulon

XLDnaute Barbatruc
re
bonjour
ouais si vous vous voulez ;)

sinon il y a plus simple
et par pitié préciser le parent ;)
VB:
Sub test()
 Dim MesPlages As Range
 With ActiveSheet
        Set MesPlages = Union(.[C9:G9], .[C21:G21], .[C33:G33], .[C45:G45], .[C57:G57], .[C69:G69])
        For Each area In MesPlages.Areas
            area.Select
        Next
    End With
End Sub

et si on doit incrémenter par leur index pour des futurs besoins dans le code
VB:
Sub test2()
 Dim MesPlages As Range
 With ActiveSheet
        Set MesPlages = Union(.[C9:G9], .[C21:G21], .[C33:G33], .[C45:G45], .[C57:G57], .[C69:G69])
        For i = 1 To MesPlages.Areas.Count
             MesPlages.Areas(i).Select
        Next
    End With
End Sub

voilà un tableau est superflu, la collection areas en est un finalement ;)
et ca fait un code plus propre
 

Staple1600

XLDnaute Barbatruc
Bonsoir @Calvus

@Calvus
Je ne mets du chinois que dans mon bol de soupe
(ou plutôt de la nouille chinoise, avec un bilan carbone désastreux ;))

Où tu as vu des des scories de l'empire du Milieu dans mon VBA ?

J'en profite pour m'inspirer du code de sylvanu pour modifier mon code.
VB:
Const rng As String = "C9"
Sub test_B()
Dim Zig_Zag&, mess$
Bazinga = Int(VBA.Log(3333)) + VBA.Sqr(16)
For Zig_Zag = 1 To 6
mess = mess & Range(rng).Offset(Bazinga * Zig_Zag - Bazinga).Resize(, 5).Address(0, 0) & vbCr
Next
MsgBox mess, vbInformation, "Pardon, mais c'est dimanche, alors je m'amuse!"
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
là je crois que l'on perd définitivement calvus
diabolo.gif
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 324
Membres
103 179
dernier inscrit
BERSEB50