2010-04-02 22 views
9

Tengo un rango no contiguo en filas (dirección de ejemplo de myRange: $ 2: $ 2, $ 4: $ 205, $ 214: $ 214) y me gustaría acceder a una fila y columna específica dentro el rango. He intentado lo siguiente:vba Bucle en un rango no contiguo

'Obtener el valor de la segunda fila, primera columna dentro de la gama

myRange.rows(2).Cells(, 1).Value 

Sin embargo, esto me está dando el valor de la segunda fila en la hoja de trabajo, y no en el rango - lo que significa que me está dando dirección $ 3 $ 1 - y no $ 4 $ 1

¿Puede alguien explicar cómo puedo acceder a los valores dentro de mi rango? (Puede tener que ver con las diferentes áreas)

Gracias

Respuesta

2

Creo que lo que está deseando VBA que hacer es ver a su rango no contiguo como uno contiguo. No creo que el enfoque que estás tomando funcione. Tendrá que tratar esto como intervalos contiguos multipe. El siguiente código debería ayudarte a comenzar. Donde filaSelección es la fila en su rango que le interesa. Si ingresa 2, seleccionará la fila 4 en el libro de trabajo, ya que es la segunda fila en su rango.

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 
4

Éstos son mis entradas - no necesariamente mejor que la de Irwin

Function GetValue(rInput As Range, Row As Long, Column As Long) As Variant 

    Dim rArea As Range 
    Dim lCumRows As Long 
    Dim lActualRow As Long 

    For Each rArea In rInput.Areas 
     lCumRows = lCumRows + rArea.Rows.Count 
     If Row <= lCumRows Then 
      lActualRow = rArea.Rows(1).Row + (Row - (lCumRows - rArea.Rows.Count + 1)) 
      Exit For 
     End If 
    Next rArea 

    If lActualRow > 0 Then 
     GetValue = rInput.Parent.Cells(lActualRow, Column).Value 
    End If 

End Function 

Function GetValue2(rInput As Range, Row As Long, Column As Long) As Variant 

    Dim rRow As Range 
    Dim lRowCnt As Long 

    For Each rRow In rInput.Rows 
     lRowCnt = lRowCnt + 1 
     If lRowCnt = lrow Then 
      GetValue2 = rRow.Cells(1, Column).Value 
      Exit For 
     End If 
    Next rRow 

End Function 

Y ve a leer http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/ por alguna idea de por qué Excel se comporta de esa manera.

Y la prueba proc si está interesado

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

Gracias a todos por sus respuestas - Antes vio estas respuestas lo he descubierto a mí mismo y hasta el momento se está trabajando. No voy a decir que es el método más eficiente, pero parece que funciona:

Public Function NextRow(index As Integer, rows As Range) As Range 
    Dim i As Integer, r As Range 
    i = 1 
    Set NextRow = Nothing 
    For Each r In rows.rows 
     If i = index Then 
      Set NextRow = Range(r.Address) 
      Debug.Print "NextRow: " & NextRow.Address 
      Exit Function 
     End If 

     i = i + 1 
    Next r 

End Function 

Parece segunda respuesta similares - baically que estoy presentando a oscilar al índice quiero trabajar con ellos y de lo que devuelven un rango establecido por la dirección (¡importante!)

I que llamo así:

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

Jeffrey, debería considerar elegir su propia respuesta u otra respuesta a continuación como la respuesta correcta haciendo clic en la marca de verificación junto a la que más le convenga para responder a su pregunta. –

1

itera este código a través de un rango con nombre:

Dim c As Range 

x=0 

For Each c In Range("MyNamedRange") 

    'if x = pick a number and do something here 

    MsgBox c.Address & vbTab & c.Value 

x=x+1 

Next c 
Cuestiones relacionadas