2010-04-02 12 views
9

Ich habe einen nicht zusammenhängenden Bereich in Zeilen (Beispieladresse von myRange: $ 2: $ 2, $ 4: $ 205, $ 214: $ 214) und ich möchte auf eine bestimmte Zeile und Spalte zugreifen die Reichweite. Ich habe folgendes versucht:vba Schleife über einen nicht zusammenhängenden Bereich

‚den Wert der zweiten Reihe holen, 1. Säule im Bereich

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

Dies ist jedoch mir den Wert der zweiten Reihe in der Arbeitsblatt zu geben, und nicht in der Bereich - bedeutet, es gibt mir Adresse $ 3 $ 1 - und nicht $ 4 $ 1

Kann jemand bitte erklären, wie ich auf die Werte innerhalb meines Bereichs zugreifen kann? (Es kann mit verschiedenen Bereichen zu tun haben)

Danke

Antwort

2

Ich denke, was Sie wollen, VBA zu tun ist, Ihre nicht-zusammenhängenden Bereich als zusammenhängende, einen zu sehen. Ich glaube nicht, dass der Ansatz, den Sie verfolgen, funktionieren wird. Sie müssen dies wie mehrere zusammenhängende Bereiche behandeln. Der folgende Code sollte Ihnen den Einstieg erleichtern. Wobei rowSelection die Zeile in Ihrem Bereich ist, an der Sie interessiert sind. Wenn Sie 2 eingeben, wird Zeile 4 in der Arbeitsmappe ausgewählt, da es die zweite Zeile in Ihrem Bereich ist.

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

Hier sind meine Einträge - nicht unbedingt besser als

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 

der Irwin Und http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/ für einen Einblick gehen lesen, warum Excel auf diese Weise verhält.

Und der Test proc wenn Sie interessiert

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

Vielen Dank an alle für ihre Antworten - sah Bevor diese Antworten, die ich es dachte, mich aus und so weit es funktioniert. Ich sage pflegt es die efficent Methode ist aber scheint zu funktionieren:

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 

Es scheint ähnlich zweite Antwort - baically ich Index reichen bin vorrückenden Ich möchte mit arbeiten und als ich eine Reihe zurückkehren durch die Adresse festgelegt (! important)

als ich es so nennen:

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

Jeffrey, Sie sollten sich überlegen, Ihre eigene oder eine andere Antwort als richtige Antwort auszuwählen, indem Sie auf das Häkchen neben dem Häkchen klicken, das am besten zu Ihrer Frage passt. –

1

Dieser Code durchläuft einen benannten Bereich:

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 
Verwandte Themen