2010-04-02 65 views
9

Tôi có dải ô không liền nhau trên hàng (ví dụ địa chỉ myRange: $ 2: $ 2, $ 4: $ 205, $ 214: $ 214) và tôi muốn truy cập một hàng và cột cụ thể trong phạm vi. Tôi đã thử những điều sau đây:vba Vòng lặp qua phạm vi không tiếp giáp

'Lấy giá trị của hàng thứ 2, cột 1 trong phạm vi

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

Tuy nhiên, điều này được đưa ra cho tôi những giá trị của hàng thứ 2 trong bảng, và KHÔNG phạm vi - nghĩa là nó cho tôi địa chỉ $ 3 $ 1 - và không phải $ 4 $ 1

Ai đó có thể giải thích cách tôi có thể truy cập các giá trị trong phạm vi của tôi không? (Nó có thể phải làm với các khu vực khác nhau)

cảm ơn

Trả lời

2

Tôi nghĩ rằng những gì bạn đang muốn VBA để làm là để xem phạm vi không tiếp giáp của bạn như là một tiếp giáp. Tôi không nghĩ rằng cách tiếp cận mà bạn đang dùng sẽ hoạt động. Bạn sẽ phải đối xử với điều này giống như nhiều phạm vi tiếp giáp. Mã sau đây sẽ giúp bạn bắt đầu. Trường hợp rowSelection là hàng trong phạm vi của bạn mà bạn quan tâm. Nếu bạn nhập 2, nó sẽ chọn hàng 4 trong sổ làm việc vì nó là hàng thứ hai trong phạm vi của bạn.

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

Dưới đây là mục của tôi - không nhất thiết phải tốt hơn so với Irwin của

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 

Và đi đọc http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/ đối với một số cái nhìn sâu sắc là tại sao Excel là hành xử theo cách đó.

Và proc kiểm tra nếu bạn quan tâm

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

Cảm ơn mọi người cho câu trả lời của họ - Trước khi nhìn thấy những câu trả lời tôi figured it out bản thân mình và cho đến nay nó đang làm việc. Tôi sẽ không nói rằng nó là phương pháp efficent nhất nhưng dường như làm việc:

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 

Dường như câu trả lời thứ 2 tương tự - baically Tôi đang tiến tới dao động đến chỉ số tôi muốn làm việc với và hơn tôi trả lại một phạm vi quy định của địa chỉ (! important)

tôi hơn gọi nó là như thế này:

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

Jeffrey, bạn nên cân nhắc chọn câu trả lời của riêng bạn hoặc câu trả lời khác bên dưới làm câu trả lời đúng bằng cách nhấp vào dấu kiểm bên cạnh dấu kiểm mà bạn cảm thấy câu trả lời hay nhất cho câu hỏi của mình. –

1

lặp mã này thông qua một loạt tên:

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 
Các vấn đề liên quan