vba在非连续范围内循环

我有一个非连续的行范围(例如myRange的地址:$ 2:$ 2,$ 4:$ 205,$ 214:$ 214),我想访问该范围内的特定行和列。 我已经尝试了以下内容:

'获取范围内第二行第一列的值

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

但是,这是给我的工作表中第二行的价值,而不是在范围内 – 这意味着它给我的地址$ 3 $ 1 – 而不是$ 4 $ 1

有人可以解释我如何可以访问我的范围内的值? (这可能与不同的领域有关)

谢谢

这是我的作品 – 不一定比欧文好

 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 

请阅读http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/了解Excel为何如此行事&#x3002;

如果你感兴趣的话,testingstream程

 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 

我认为你想要VBA做的是将你的不连续的范围视为一个连续的范围。 我不认为你正在采取的做法将工作。 你将不得不把这个像multipe连续的范围。 下面的代码应该让你开始。 其中rowSelection是您感兴趣的范围内的行。如果input2,则将select工作簿中的第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 

这段代码迭代了一个命名的范围:

 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 

谢谢大家的答案 – 在看到这些答案之前,我自己想清楚了,到目前为止它正在工作。 我不会说这是最有效的方法,但似乎工作:

  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 

看起来类似的第二个答案 – 重要的是,我正在推进范围索引,我想与我合作,并返回一个范围设置的地址(!重要)

我比这样称呼它:

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