2010-04-02 197 views
9

我在行上有一個非連續的範圍(例如myRange的地址:$ 2:$ 2,$ 4:$ 205,$ 214:$ 214),我想訪問特定的行和列範圍。範圍內vba循環在非連續範圍內

「獲取第2行的值,第一列

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

然而,這是給我的第2行的值在工作表中,而不是:我曾嘗試以下範圍 - 這意味着它給我的地址$ 3 $ 1 - 而不是$ 4 $ 1

有人可以解釋我如何訪問我的範圍內的值? (這可能與不同領域做)

謝謝

回答

2

我想你想要什麼VBA做的就是看你不連續的範圍內爲連續的一個。我不認爲你正在採取的做法會奏效。你將不得不把這個看作multipe連續的範圍。下面的代碼應該讓你開始。 rowSelection是您感興趣的範圍中的行。如果輸入2,它將選擇工作簿中的第4行,因爲它是範圍中的第二行。

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

這裏是我的條目 - 不超過歐文的

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 

一定要好,去一些見解,爲什麼Excel中的行爲這種方式讀http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/

而且測試PROC如果你有興趣

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

謝謝大家對他們的答案 - 之前看到這些問題的答案我想通了自己和到目前爲止,這是工作。我不會說這是最efficent方法,但似乎工作:

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 

看來類似的第二個答案 - baically我推進到範圍索引我想,比我返回一個範圍內的地址設置工作(重要!)

我不是這樣稱呼它:

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

傑弗裏,你應該考慮選擇你自己或另一個答案作爲正確的答案,點擊你最好回答你的問題旁邊的複選標記。 – 2010-04-05 03:23:37

1

此代碼遍歷一個名爲範圍:

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