首页 > 解决方案 > 有没有办法在同一个 For Each 循环中逐步遍历多个单元格范围?

问题描述

我目前正在尝试创建一个遍历 2 个数据范围的循环。第一个范围是 b16-b35 下一个范围是 j16-j35。目前我只能通过 2 个循环中的 1 个来逐步完成。

我从 For While 循环开始。使用 i 作为 16-35 的变量。当我尝试这种方法时,我无法让 msgbox 打印数据。我搬到了 For each 循环。这使我能够通过一个单元格而不是另一个单元格。

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

当前方法使循环遍历每个 r 的所有 J。我尝试将 for each 循环与 and 语句结合起来,它会破坏代码。

标签: excelvba

解决方案


不完全确定您要执行的操作,但以下内容应该可以执行您想要执行的操作..

顺便说一句,将单元格定义为范围等不是最佳实践。最好给它一个名称而不是函数等名称。

    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 -> 函数将停止。如果你想去下一个 (i) ; 迭代。你应该把:

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

推荐阅读