11
votes

VBA boucle sur une plage non contiguë

J'ai une plage non contiguë sur des lignes (exemple d'adresse de MyRange: 2 $: 2 $ 2, 4 $: 205 $, 215 $, 214 $: 214 $) et j'aimerais accéder à une ligne et à une colonne spécifiques dans la gamme. J'ai essayé ce qui suit:

'Obtenez la valeur de la 2e rangée, 1ère colonne dans la plage xxx

Cependant, cela me donne la valeur de la 2e rangée Dans la feuille de calcul, et non dans la gamme - ce qui signifie qu'il me donne une adresse 3 $ 1 $ - et pas de 4 $ 1 $

Peut-on expliquer comment je peux accéder aux valeurs dans ma gamme? (Cela peut avoir à voir avec différentes zones)

merci


0 commentaires

4 Réponses :


2
votes

Je pense que ce que vous voulez que VBA fasse, c'est voir votre gamme non contiguë comme une contiguë. Je ne pense pas que l'approche que vous prenez fonctionnera. Vous devrez traiter cela comme des gammes contiguës à plusieurs mûres. Le code suivant devrait vous aider à démarrer. Lorsque la row sélection est la ligne de votre plage que vous êtes intéressé. Si vous entrez 2, il sélectionnera la ligne 4 dans le classeur, car il s'agit de la deuxième ligne de votre gamme.

Sub Macro1()

    Dim rowCounter As Long
    Dim rowSelection As Long

    rowSelection = 2
    For Each Rng In Range("A2:A2,A4:A205,A214:A214").Areas
         If Rng.Rows.Count >= rowSelection Then
            Rng.Rows(rowSelection - rowCounter).Cells(1, 1).Select
            End
         Else
            rowCounter = rowCounter + Rng.Rows.Count
         End If
    Next Rng

End Sub


0 commentaires

4
votes

Voici mes entrées - pas nécessairement mieux que Irwin

Sub test()

    Dim myRange As Range

    Set myRange = Union(Rows(2), Range("4:205"), Rows(214))

    Debug.Print GetValue(myRange, 1, 2), GetValue(myRange, 1, 2)
    Debug.Print GetValue(myRange, 2, 2), GetValue(myRange, 2, 2)
    Debug.Print GetValue(myRange, 3, 2), GetValue(myRange, 3, 2)
    Debug.Print GetValue(myRange, 200, 2), GetValue(myRange, 200, 2)

End Sub


0 commentaires

0
votes

Merci à tout le monde pour leurs réponses - Avant de voir ces réponses, je me suis inscrit moi-même et je travaille jusqu'à présent. Je ne dirai pas que c'est la méthode la plus efficace, mais semble fonctionner:

NextRow(2, myRange).Cells(,1).value 


1 commentaires

Jeffrey, vous devriez envisager de choisir votre propre réponse ou une autre réponse ci-dessous comme réponse correcte en cliquant sur la coche en regard de celui que vous ressentez la meilleure réponse à votre question.



1
votes

Ce code iTère via une plage nommée: xxx


0 commentaires