Sélectionner les différentes cellules d'une plage discontinue

david84

XLDnaute Barbatruc
Bonjour tout le monde:),
j'ai besoin de vérifier dans une plage de cellules discontinues si l'ensemble des cellules sont renseignées. Pour cela, j'utilise Union pour définir la plage de cellule.
Le problème est que je n'arrive pas ensuite à sélectionner chaque cellule de cette plage pour voir si elle est vide ou renseignée.
J'ai testé ce code pour voir là où cela coince :
Code:
Sub test3()
Dim plage As Range, i&, cel1 As Range, cel2 As Range, cel3 As Range
Set cel1 = Range("B9")
Set cel2 = Range("E9")
Set cel3 = Range("H8")
Set plage = Application.Union(cel1, cel2, cel3)
MsgBox plage.Address
    For i = 1 To plage.Cells.Count
        MsgBox plage(i).Address
    Next i
End Sub
Code:
MsgBox plage.Address
me ramène bien l'ensemble des cellules de cette plage (B9,E9,H8) mais par la suite, je n'arrive pas à isoler chacune des cellules :
Code:
MsgBox plage(i).Address
me ramène dans mon test B9 puis B10 puis B11.
Merci de m'indiquer où se situe mon erreur.
A+
 

Pierrot93

XLDnaute Barbatruc
Re : Sélectionner les différentes cellules d'une plage discontinue

Bonjour,

essaye ceci :
Code:
Dim plage As Range, i&, cel1 As Range, cel2 As Range, cel3 As Range
Dim c As Range
Set cel1 = Range("B9")
Set cel2 = Range("E9")
Set cel3 = Range("H8")
Set plage = Application.Union(cel1, cel2, cel3)
MsgBox plage.Address
For Each c In plage
    MsgBox c.Address
Next c
bon après midi
@+
 

Dranreb

XLDnaute Barbatruc
Re : Sélectionner les différentes cellules d'une plage discontinue

Bonjour.
Certaines opérations marchent peut être sur de telles objets Range comme pour les autres, mais moi, quand j'ai affaire à de telles plages je fais toujours:
VB:
Dim Plage As Range, Z As Range, C As Range
For Each Z In Plage.Areas
   For Each C In Z
      MsgBox C.Address
      Next C
   Next Z
ou bien:
VB:
Dim Plage As Range, Z As Range, C As Range, U As Long, N As Long
For U = 1 To Plage.Areas.Count
   For Each C In Plage.Areas(U)
      MsgBox C.Address
      Next C
   Next Z
End Sub
À+
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Sélectionner les différentes cellules d'une plage discontinue

Bonjour le fil :),
Si tu regardes mon post ICI, tu comprendras ton erreur :p
L'utilisation des indices dans une plage ne fonctionne pas comme on pourrait se l'imaginer, en réalité, l'utilisation de l'indice revient à un OffSet depuis la première cellule en haut à gauche de la plage, qui en plus n'est pas limité à cette même plage :rolleyes:...
D'où effectivement, même si la méthode est plus lente, il est préférable d'utiliser un For Next avec un Range ;).
Bonne suite :cool:
 

david84

XLDnaute Barbatruc
Re : Sélectionner les différentes cellules d'une plage discontinue

Re
Merci pour vos réponses:)
@Pierrot : ta solution fonctionne nickel (comme toujours). Je n'avais effectivement pas pensé à utiliser For each...Next car je ne comprenais pas pourquoi cela ne me ramenait pas le résultat escompté.
@Dranreb:): ta solution fonctionne également mais pourquoi utilises-tu 2 boucles alors qu'une seule peut suffire ? Y a t-il une nuance que je n'ai pas comprise ?
En tout cas, merci à toi.
@JNP:) : merci pour tes explications. Je pense avoir compris où se situe mon erreur que j'interprète de la façon suivante :
For... Next permet simplement de répéter une série d'instructions un nombre de fois déterminé à l'aide d'un compteur, donc là l'utilisation de l'indice fausse le résultat pour les raisons indiquées dans ton lien.
Par contre, For each...Next permet de généraliser un traitement à l'ensemble d'une collection, d'où le fait de pouvoir ne sélectionner que les membres de cette collection, même si les plages formant cette collection sont discontinues.
A+
 

Fo_rum

XLDnaute Accro
Re : Sélectionner les différentes cellules d'une plage discontinue

Bonsoir,

For... Next permet simplement de répéter une série d'instructions un nombre de fois déterminé à l'aide d'un compteur, donc là l'utilisation de l'indice fausse le résultat pour les raisons indiquées dans ton lien.
avec For i=... Next (pas des plus élégants j'en conviens) :
Code:
Sub test()
Dim plage As Range, i&
Set plage = Application.Union(Range("B9"), Range("E9"), Range("H8"))
    For i = 0 To plage.Cells.Count - 1
        MsgBox Range(Split(plage.Address, ",")(i))
    Next i
End Sub
 

david84

XLDnaute Barbatruc
Re : Sélectionner les différentes cellules d'une plage discontinue

Re
Pas mal ! J'avais pensé en dernier recours à utiliser Split mais je me disais qu'il y avait plus simple, et surtout je ne comprenais pas pourquoi je n'y arrivais pas avec un For i=...Next tout simple.
Merci à toi.
A+
 

Dranreb

XLDnaute Barbatruc
Re : Sélectionner les différentes cellules d'une plage discontinue

Bonjour.
ta solution fonctionne également mais pourquoi utilises-tu 2 boucles alors qu'une seule peut suffire ? Y a t-il une nuance que je n'ai pas comprise
Parce que je n'ai jamais cherché à savoir quelles sont les manoeuvres qui peuvent et celles qui ne peuvent pas être traitées en une seule boucle sur une plage multi-areas : j'aime autant, après tout, garder une trace dans le code, ne serait ce qu'à valeur documentaire, qui rappelle que le dispositif est conçu pour traiter des plages possiblement multi-areas, c'est à dire résultant d'une union ou de sélections multiples avec la touche Ctrl.
Cordialement.
 

Haut Bas