Boucle à travers chaque cellule dans une plage de cellules avec un objet Range
Disons que j'ai le code suivant:
Sub TestRangeLoop()
Dim rng As Range
Set rng = Range("A1:A6")
''//Insert code to loop through rng here
End Sub
Je veux être en mesure de parcourir une collection de Range
objets pour chaque cellule spécifiée dans rng
. Sur le plan conceptuel, je voudrais faire comme ceci:
For Each rngCell As Range in rng
''//Do something with rngCell
Next
Je sais que je pourrais résoudre ce par l'analyse de rng.Address
et la construction de Range
les objets manuellement, mais j'espère que il y a une façon plus directe, qui n'implique pas de traitement de chaîne.
Vous devez vous connecter pour publier un commentaire.
Cells
est juste unRange
objet. En fait, j'ai enlevé.Cells
derRng
dans leFor Each
ligne et il fonctionnait toujours. Qu'en estRange
la fait ressembler à une collection deRange
s? Merci beaucoup pour votre aide!Range
y a environ 4 ans quand j'ai commencé à faire de la programmation VBA :-).Vous pouvez utiliser
Range.Rows
,Range.Columns
ouRange.Cells
. Chacune de ces collections contiennentRange
objets.Voici comment vous pouvez modifier la Bite exemple de la façon de travailler avec
Rows
:Et
Columns
:Range
tels que ceux que vous avez mentionné et je n'arrive pas à comprendre comment les utiliser pour me donner les informations dont j'ai besoin.De faire une remarque sur la Bite de réponse, c'est correct, mais je ne recommanderais pas à l'aide d'une boucle For each. Pour Chacun crée un renvoi temporaire de la COM de la Cellule derrière les scènes que vous n'avez pas accès à l' (dont vous avez besoin pour l'éliminer).
Voir la suite pour plus de discussion:
Comment bien nettoyer Excel interopérabilité des objets?
Pour illustrer le problème, essayez les solutions Pour Chaque exemple, la fermeture de votre application, et de regarder le Gestionnaire des Tâches. Vous devriez voir qu'une instance d'Excel est toujours en cours (parce que tous les objets n'ont pas été éliminés de façon appropriée).
D'une façon plus propre de le gérer est de requête de la feuille de calcul à l'aide d'ADO:
http://technet.microsoft.com/en-us/library/ee692882.aspx
Je suis en ressuscitant les morts ici, mais parce que toute une gamme peut être défini comme "Un" Un", à l'aide d'une boucle for each se termine avec un potentiel de boucle infinie. La solution, pour autant que je sais, est d'utiliser le
Do Until
boucle..range(.cells(1, 1), .cells(.rows.count, 1).end(xlup))
) puis à l'aide de la méthode Intersect avec l'ensemble de la colonne et de la feuille de calcul .UsedRange propriété (par exemple,Intersect(.columns(1), .usedrange)
) ou, éventuellement, la Plage.CurrentRegion propriété (par exemple,.cells(1, 1).currentregion.columns(1)
) est très efficace.