Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 退出';每个';当某些条件为真时循环_Vba_Excel - Fatal编程技术网

Vba 退出';每个';当某些条件为真时循环

Vba 退出';每个';当某些条件为真时循环,vba,excel,Vba,Excel,我需要检查表1第X列中的所有行,获取其值,然后查看值是否在表2第A列和B列中存储的数字组合之间。如果值在之间,则在表1第Y列中显示表2第C列中的值(这将是一个非常简单的SQL查询) 我对VBA非常生疏,所以当存在匹配时,我无法退出内部循环,并将值从Sheet2粘贴到Sheet1 Sub FindBetweenIP() Dim ws1 As Worksheet Set ws1 = Sheets(1) Dim ws2 As Worksheet Set ws2 =

我需要检查表1第X列中的所有行,获取其值,然后查看值是否在表2第A列和B列中存储的数字组合之间。如果值在之间,则在表1第Y列中显示表2第C列中的值(这将是一个非常简单的SQL查询)

我对VBA非常生疏,所以当存在匹配时,我无法退出内部循环,并将值从Sheet2粘贴到Sheet1

Sub FindBetweenIP()

    Dim ws1 As Worksheet
    Set ws1 = Sheets(1)

    Dim ws2 As Worksheet
    Set ws2 = Sheets(2)

    For Each cell In ws1.Range("X2:X" & ws1.Range("X" & Rows.Count).End(xlUp).Row)

        For Each cell2 In ws2.Range("A2:A" & ws1.Range("A" & Rows.Count).End(xlUp).Row)

            ip_range1 = cell2.Value2
            ip_range2 = cell2.Offset(0, 1).Value2
            isp = cell2.Offset(0, 2).Value2

            If (cell.Value >= ip_range1 And cell.Value <= ip_range2) Then
                cell.Offset(0, 1).Value2 = isp 'Seems to be not working
                ' ALSO, VALUE FOUND-- EXIT INNER LOOP
            End If

        Next

    Next    
End Sub
Sub-FindBetweenIP()
将ws1设置为工作表
设置ws1=图纸(1)
将ws2设置为工作表
设置ws2=图纸(2)
对于ws1.Range(“X2:X”和ws1.Range(“X”)和Rows.Count.End(xlUp.Row)中的每个单元格
对于ws2.Range(“A2:A”和ws1.Range(“A”)和Rows.Count.End(xlUp.Row)中的每个cell2
ip_range1=单元格2.Value2
ip_range2=cell2.偏移量(0,1).值2
isp=单元2。偏移量(0,2)。值2

如果VBA中的(cell.Value>=ip_range1和cell.Value,则应使用“goto”命令。例如:

Sub FindBetweenIP()

    Dim ws1 As Worksheet
    Set ws1 = Sheets(1)

    Dim ws2 As Worksheet
    Set ws2 = Sheets(2)

    For Each cell In ws1.Range("X2:X" & ws1.Range("X" & Rows.Count).End(xlUp).Row)

        For Each cell2 In ws2.Range("A2:A" & ws1.Range("A" & Rows.Count).End(xlUp).Row)

            ip_range1 = cell2.Value2
            ip_range2 = cell2.Offset(0, 1).Value2
            isp = cell2.Offset(0, 2).Value2

            If (cell.Value >= ip_range1 And cell.Value <= ip_range2) Then
                cell.Offset(0, 1).Value2 = isp
                GoTo ExitInnerLoop:
            End If
        Next
ExitInnerLoop:
    Next    
End Sub
Sub-FindBetweenIP()
将ws1设置为工作表
设置ws1=图纸(1)
将ws2设置为工作表
设置ws2=图纸(2)
对于ws1.Range(“X2:X”和ws1.Range(“X”)和Rows.Count.End(xlUp.Row)中的每个单元格
对于ws2.Range(“A2:A”和ws1.Range(“A”)和Rows.Count.End(xlUp.Row)中的每个cell2
ip_range1=单元格2.Value2
ip_range2=cell2.偏移量(0,1).值2
isp=单元2。偏移量(0,2)。值2

如果(cell.Value>=ip_range1和cell.Value您正在查找表达式“Exit”。在本例中,它看起来是这样的:

For i = 1 to 10

    [Do statements]
    [If Test]
        Exit For
    [End If]
 Next i

以这种方式退出循环基本上就像代码跳转到“下一个i”,i已经等于最大循环值。

除了等级“Eh”Bacon所说的退出
之外,第二个For循环范围似乎有点断开:

For Each cell2 In ws2.Range("A2:A" & ws1.Range("A" & Rows.Count).End(xlUp).Row)
您从ws2开始,但在内部您指的是ws1

将其更改为:

For Each cell2 In ws2.Range("A2:A" & ws2.Range("A" & ws2.Rows.Count).End(xlUp).Row)

出于对我的前辈的尊重,我发现在这种情况下,退出进近并不能正确地同步外环和内环。我已经制定了另一种方法,该方法工作正常并给出正确的结果。我将得到纠正,因为我在VBA方面的专业知识可能与我的前辈和这里更有经验的人的水平不符

  Sub FindBetweenIP()

     Dim ws1 As Worksheet
     Set ws1 = Sheets(1)

     Dim ws2 As Worksheet
     Set ws2 = Sheets(2)

     For Each cell In ws1.Range("X2:X" & ws1.Range("X" & Rows.Count).End(xlUp).Row)

         Foundone = False
         For Each cell2 In ws2.Range("A2:A" & ws2.Range("A" & Rows.Count).End(xlUp).Row)
           If cell2.Row = cell.Row And Foundone = False Then
               ip_range1 = cell2.Value2
                ip_range2 = cell2.Offset(0, 1).Value2
                isp = cell2.Offset(0, 2).Value2
                If (cell.Value >= ip_range1 And cell.Value <= ip_range2) Then
                 cell.Offset(0, 1).Value2 = isp
                 Foundone = True
               End If
           End If
     Next
     Next
 End Sub
Sub-FindBetweenIP()
将ws1设置为工作表
设置ws1=图纸(1)
将ws2设置为工作表
设置ws2=图纸(2)
对于ws1.Range(“X2:X”和ws1.Range(“X”)和Rows.Count.End(xlUp.Row)中的每个单元格
Foundone=False
对于ws2.Range(“A2:A”和ws2.Range(“A”)和Rows.Count.End(xlUp.Row)中的每个cell2
如果cell2.Row=cell.Row,Foundone=False,则
ip_range1=单元格2.Value2
ip_range2=cell2.偏移量(0,1).值2
isp=单元2。偏移量(0,2)。值2

如果(cell.Value>=ip_range1和cell.Value您要查找的行,我相信是
Exit for
,这将退出第二个循环并转到第一个循环中的下一个迭代。上面的代码是否不起作用?是否不起作用…?如果您想退出循环,可以使用
Exit for
,这将退出它所处的循环。我使用Exit for-它起作用了;虽然我不明白为什么找到的值没有保存回Sheet 1您的值是如何格式化的?我发现您的帖子非常有趣,因为它涵盖了经常发生的情况。我的VBA水平很低,因此请您告诉我最后四行如何~Exit for End If Next~或其他方式大约。如果您能用最终解决方案编辑您的帖子以供他人参考,我将不胜感激。经验法则是尽可能避免转到,因为使用它会导致代码变得比必要时更复杂。在某些情况下,它可能有用(尤其是在创建错误处理时),但只要可以避免,就应该避免。强烈建议不要使用
GoTo
(有一些例外)。OP应该只使用
Exit For