vba循环在非连续范围内
问题描述:
我在行上有一个非连续的范围(例如myRange的地址:$ 2:$ 2,$ 4:$ 205,$ 214:$ 214),我想访问特定的行和列范围。范围内vba循环在非连续范围内
“获取第2行的值,第一列
myRange.rows(2).Cells(, 1).Value
然而,这是给我的第2行的值在工作表中,而不是:我曾尝试以下范围 - 这意味着它给我的地址$ 3 $ 1 - 而不是$ 4 $ 1
有人可以解释我如何访问我的范围内的值? (这可能与不同领域做)
谢谢
答
我想你想要什么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
答
这里是我的条目 - 不超过欧文的
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
答
谢谢大家对他们的答案 - 之前看到这些问题的答案我想通了自己和到目前为止,这是工作。我不会说这是最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
答
此代码遍历一个名为范围:
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
杰弗里,你应该考虑选择你自己或另一个答案作为正确的答案,点击你最好回答你的问题旁边的复选标记。 – 2010-04-05 03:23:37