J'essayais de répondre this question lorsque je suis tombé sur un comportement VBA bizarre dans Excel. J'ai écrit un sous très simple de démontrer la question:Comportement d'adresses de cellules étranges pour des plages non contiguës: VBA
Sub debugAddresses(rng As Range)
Debug.Print "Whole range: " & rng.Address
Dim i As Long
For i = 1 To rng.Cells.Count
Debug.Print rng.Cells(i).Address
Next i
End Sub
boucle I sur chaque cellule dans un objet de plage et imprimer son adresse, le simple droit?
debugAddresses Range("B2:B3")
' Result as expected:
' >> Whole range: $B$2:$B$3
' >> $B$2
' >> $B$3
Cependant, pour les plages non contiguës je reçois un comportement étrange:
debugAddresses Range("A1,B2")
' Strange behaviour when getting addresses of individual cells:
' >> Whole range: $A$1,$B$2
' >> $A$1
' >> $A$2
Quelqu'un peut-il faire la lumière sur cette s'il vous plaît? Spécifiquement pourquoi les objets Cells
, qui peuvent être utilisés pour l'indexation d'une plage contiguë, semblent juste étendre le premier Area
sélectionné.
Edit: Il pourrait être intéressant de noter que l'utilisation d'une boucle For Each
à travers les objets de plage de cellules réelles donne le résultat attendu *
Sub debugAddresses2(rng As Range)
Debug.Print "Whole range: " & rng.Address
Dim c As Range
For Each c In rng
Debug.Print c.Address
Next c
End Sub
* Voir ma réponse à un commentaire sur une solution plus robuste , comme cela (apparemment) ne peut toujours donner le résultat attendu
Vous utilisez des plages non contiguës, donc 'rng.Cells (i) .Address' est probablement un raccourci pour' rng.Areas (1) .Cells (i) .Address'. –
Il est étrange, car si vous essayez d'entrer des données sur ces cellules. Cela fonctionne réellement: rng.Cells = "test" – danieltakeshi
@FlorentB. "est probablement sténographie" sur quoi? Vous avez des docs sur ça? Je ne pense pas non plus, parce qu'il n'y a pas assez de cellules dans '.Areas (1)' et que l'index serait hors de portée ... – Wolfie