2010-04-02 6 views
9

Mam nieciągły zakres w wierszach (przykładowy adres myRange: 2 $: 2 $, 4: 205 $, 214: 214 $) i chciałbym uzyskać dostęp do określonego wiersza i kolumny w obrębie Zakres. Próbowałem następujące:vba Pętla nad nieciągłym zakresem

„Get wartość 2. rzędzie, 1st kolumny w zakresie

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

Jednak to daje mi wartość 2 wiersz w arkuszu, a nie w zakres - czyli daje mi adres 3 $ 1 $ - a nie 4 $ 1

Czy ktoś może wyjaśnić, w jaki sposób mogę uzyskać dostęp do wartości w moim zasięgu? (Może to mieć związek z różnych dziedzin)

Dziękuję

Odpowiedz

2

myślę, co się chce zrobić, to VBA, aby zobaczyć swój non-ciągły zakres jako ciągły jeden. Nie sądzę, że podejście, które podejmujesz, zadziała. Będziesz musiał traktować to jak wielordzeniowe ciągłe zakresy. Poniższy kod powinien zacząć. Gdzie rowSelection jest wierszem w twoim zakresie, który Cię interesuje. Jeśli wybierzesz 2, wybierzesz wiersz 4 w skoroszycie, ponieważ jest to drugi wiersz w twoim zasięgu.

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

Oto moje wpisy - niekoniecznie lepiej niż 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 

i iść czytać http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/ jakiegoś wglądu, dlaczego Excel zachowuje się w ten sposób.

I Proc testu jeśli jesteś zainteresowany

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

Dziękuję wszystkim za odpowiedzi - Zanim zobaczyłem te odpowiedzi wyobraziłem go sobie i tak daleko, że działa. Nie będę powiedzieć, że jest to metoda najbardziej skuteczny, ale wydaje się działać:

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 

Wydaje podobny 2-cia odpowiedź - baically bronię się wahać do indeksu chcę pracować i nie wrócę do zakresu określonego przez adres (! important)

niż ja nazywam to tak:

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

Jeffrey, powinieneś rozważyć wybór własnej lub innej odpowiedzi poniżej jako poprawnej odpowiedzi, klikając znacznik wyboru obok tego, który uważasz najlepiej za odpowiedź na twoje pytanie. –

1

ten kod iteracji nazwanego zakresu:

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