Есть ли способ пройти более одного диапазона ячеек в течение одного цикла For Each? - PullRequest
0 голосов
/ 05 мая 2019

В настоящее время я пытаюсь создать цикл, который проходит через 2 диапазона данных. Первый диапазон b16-b35, следующий диапазон j16-j35. В настоящее время я могу получить только 1 из 2 циклов для перехода.

Я начал с цикла «Пока». Используя i в качестве переменной для 16-35. Когда я попробовал этот метод, я не смог получить msgbox для печати данных. Я перешел на каждый цикл. Это дало мне возможность пройти одну клетку, но не другую.

If [D8] = 2 Then

    Dim r As Range
    Dim j As Range
    Dim jcell As Range
    Dim cell As Range
    Set r = Range("B16:B35")
    Set j = Range("J16:J35")
    For Each cell In r
    For Each hcell In j
        If cell = "" Or cell = "N/A" Then GoTo ENDGAME

        MsgBox "pn is " & cell & " route is " & jcell

Next jcell

Next cell

ENDGAME:

End IF

Текущий метод заставляет цикл проходить через все J для каждого r. Я попытался скомбинировать циклы для каждого с оператором и, и это приводит к ошибкам кода.

Ответы [ 4 ]

0 голосов
/ 05 мая 2019

Не совсем уверен, что вы пытаетесь сделать, но следующее должно выполнять то, что вы хотели бы сделать.

Кстати, определение ячейки как диапазона и т. Д. Не является лучшей практикой.лучше дать ему имя, отличное от имени функции и т. д.

    with thisworkbook.sheets(1)
        if .range("B8").value = 2 then
            for i = 16 to 35
                if .range("B" & i).value = "" or .range("B" & i).value = "N/A" then
                    goto EndGame
                else
                    msgbox "pn is " & .range("B" & i).value & " route is " & .range("J" & i).value
                end if
            next i
        EndGame:
        end if
    end with

Если вы хотите сделать 2 цикла, сначала для B, чем для J, вы можете сделать это.Однако, если одна из ячеек в одном из циклов не содержит ничего или функция n / a -> остановится.Если вы хотите перейти к следующему (я);итерация.Вы должны поставить:

EndGame:

непосредственно перед:

next i

-

    dim First_Range_Done as boolean

    with thisworkbook.sheets(1)
        if .range("B8").value = 2 then

            for i = 16 to 35

                if First_Range_Done = false then
                    if .range("B" & i).value = "" or .range("B" & i).value = "N/A" then
                        goto EndGame
                    else
                        msgbox "pn is " & .range("B" & i).value & " route is " & .range("J" & i).value
                    end if
                end if

                if First_Range_Done = true
                    if .range("J" & i).value = "" or .range("J" & i).value = "N/A" then
                        goto EndGame
                    else
                        msgbox "pn is " & .range("B" & i).value & " route is " & .range("J" & i).value
                    end if

                    if i = 35 then exit sub
                end if

                if i = 35 then
                    First_Range_Done = true
                    i = 15
                end if

            next i

        EndGame:
        end if
    end with
0 голосов
/ 05 мая 2019

Используйте счетчик в качестве цикла For и используйте его, чтобы установить ссылку на каждый диапазон

Dim r As Range
Dim j As Range
Dim jcell As Range
Dim rcell As Range
Dim i as Long
Set r = Range("B16:B35")
Set j = Range("J16:J35")
For i = 1 to r.Rows.Count
    Set rcell = r.Cells(i, 1)
    Set jcell = j.Cells(i, 1)
    MsgBox "pn is " & rcell.Address & " route is " & jcell.Address
Next i
0 голосов
/ 05 мая 2019
Dim r1 As Range
Dim r2 As Range
Dim u As Range
Dim res As String
Set r1 = Range("A1:B1")
Set r2 = Range("C3:D3")
Set u = Union(r1,r2)
res = ""
For Each cell In u
   res = res + cell.Value2
Next cell
MsgBox res

Предполагая, что ячейки имеют следующие значения:

-------------------
| Address | Value | 
-------------------
| A1      | a1    |
| B1      | b1    |
| C3      | c3    |
| D3      | d3    |
-------------------

Вы получите a1b1c3d3, в результате чего отображается MsgBox.

С этим методом у вас есть дополнительный бонусВы можете комбинировать диапазоны разных размеров.

0 голосов
/ 05 мая 2019

Кажется, что на самом деле у вас есть один цикл (процесс), просто ваши данные чувствуют себя в двух разных местах. Давайте пройдемся по B16: B35, ссылаясь на соответствующие значения в столбце J по ходу дела:

Sub looper()

    Dim r As Range
    Dim cell As Range

    If [D8] = 2 Then

        Set r = Range("B16:B35")

        For Each cell In r

            If cell = "" Or cell = "N/A" Then GoTo ENDGAME

            MsgBox "pn is " & cell & " route is " & cell(1, 9)

        Next cell

ENDGAME:

    End If

End Sub

То есть cell - это объект диапазона, начиная с B16 ... вы можете ссылаться на другую ячейку по ее смещению от объекта диапазона ... ячейка (1, 9) означает, что взять cell, посмотрите на ту же строку (1), но на 9-й столбец (считать столбец B как «один», столбец C как два; столбец J - девять).

Обычно хорошей идеей является объявление переменных в верхней части подпрограммы, поэтому я переместил Dims. Не обязательно, чтобы этот код работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...