Цикл vba по диапазону, состоящему из нескольких несмежных участков,

У меня есть диапазон, состоящий из нескольких несмежных участков, на строках (адрес в качестве примера myRange: 2$: 2$, 4$: 205$, 214$: 214$) и я хотел бы получить доступ к определенной строке и столбцу в диапазоне. Я попробовал следующее:

'Получите значение 2-й строки, 1-го столбца в диапазоне

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

Однако это дает мне значение 2-й строки в WorkSheet, а НЕ в диапазоне - значение, что это дает мне, обращаются к $3$ 1 - и не $4$ 1

Кто-то может объяснить, как я могу получить доступ к значениям в в моем диапазоне? (Это может иметь отношение к различным областям),

Спасибо

10
задан Jeffrey 2 April 2010 в 17:34
поделиться

3 ответа

Вот мои записи - не обязательно лучше, чем у Ирвина

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
4
ответ дан 4 December 2019 в 02:50
поделиться

Спасибо всем за ответы - Прежде чем увидеть эти ответы, я сам разобрался, и пока что это работает. Я не буду говорить, что это самый эффективный метод, но, похоже, он работает:

 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 
0
ответ дан 4 December 2019 в 02:50
поделиться

Я думаю, что вы хотите, чтобы 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
2
ответ дан 4 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: