У меня есть диапазон, состоящий из нескольких несмежных участков, на строках (адрес в качестве примера myRange: 2$: 2$, 4$: 205$, 214$: 214$) и я хотел бы получить доступ к определенной строке и столбцу в диапазоне. Я попробовал следующее:
'Получите значение 2-й строки, 1-го столбца в диапазоне
myRange.rows(2).Cells(, 1).Value
Однако это дает мне значение 2-й строки в WorkSheet, а НЕ в диапазоне - значение, что это дает мне, обращаются к $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-unknown-object / , чтобы понять, почему Excel ведет себя таким образом.
И тестовая процедура, если вам интересно
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
Спасибо всем за ответы - Прежде чем увидеть эти ответы, я сам разобрался, и пока что это работает. Я не буду говорить, что это самый эффективный метод, но, похоже, он работает:
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
Я думаю, что вы хотите, чтобы VBA рассматривал ваш несмежный диапазон как непрерывный. Я не думаю, что выбранный вами подход сработает. Вам придется рассматривать это как несколько смежных диапазонов. Следующий код должен помочь вам начать работу. Где 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