2010-04-02 185 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