2015-11-05 36 views
1

我需要遍历Sheet1中X列的所有行,获取它的值,然后查看是否存储在Sheet 2列A和B上的BETWEEN数字组合。值介于两者之间,然后在Sheet 1 Column Y中显示Sheet 2 Column C中的值(这将是一个非常简单的SQL查询)。当某些条件为真时,退出'For Each'循环

我在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 
+0

您正在寻找的线路,我认为是'退出',这将退出第二个循环并转到第一个循环的下一个循环。 –

+0

上面的代码不起作用吗?它不会......吗?如果你想退出循环,你可以使用'Exit For',它将退出它所在的循环。 – BruceWayne

+0

我用Exit For - 它工作;虽然我不明白为什么找到的值不会保存回Sheet1 – Andrew

回答

2

除了它似乎什么档次“嗯”培根说,有关Exit For你有第二个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) 
-1

在VBA中,您应该只使用'goto'命令。 EG:

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 
+0

经验法则是尽可能避免跳转,因为使用它可能会导致代码变得比必要更复杂。在某些情况下,它可能是有用的(特别是,例如,在创建错误处理中),但是只要可以避免,它可能应该是。 –

+0

强烈建议不要使用'GoTo'(有一些例外)。 OP应该使用'Exit For'。 – BruceWayne

2

您正在寻找表达“退出”。在这种情况下,它看起来像这样:

For i = 1 to 10 

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

退出这样一个循环基本的工作原理就好像代码是跳进来“下一步我”,与我已经等于最大循环值。

0

充分尊重我的前辈,我发现,出境的做法是不正确的同步外环和内环这个案例。我已经制定出另一种正确工作并给出正确结果的方法。我的立场是要纠正,因为可能我的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