2015-11-07 85 views
0

我需要一些相对简单的宏的帮助。我需要检查列i中的值是否大于列N中的值,如果是,那么检查它是否低于列O中的值,打印出列k中相应列P的数量。我写了一个我认为会起作用的宏,但是当它运行时,什么也没有发生。有任何想法吗?我需要编写一个具有多个条件的嵌套if语句

Sub CountP() 
Dim cell As Range 
Dim ws As Worksheet 
Dim i As Integer 
Dim j As Integer 


Set ws = Sheets("Bulk Add") 

For Each cell In ws.Range("I2:I2377") 
For i = 2 To 49 
If cell.Value > ws.Range("N" & i) Then 
    For j = 2 To 49 
    If cell.Value < ws.Range("O" & i) Then 
     ws.Range("J" & j) = ws.Range("P" & i) 
    End If 
     Next j 
    End If 
     Next i 
Next cell 

End Sub 

Screenshot of the values and columns;

+0

为什么这些嵌套循环?你不想比较同一行上的值吗? –

回答

1

据我明白问题说明的代码不需要循环n * n次。这足以找到在查找表(N1:O49)所述一对含有所研究的值:

Sub CountP() 
    Dim cell As Range 
    Dim ws As Worksheet 
    Dim i As Integer 
    Dim x 

    Set ws = Sheets(1) 
    With ws 
     For Each cell In .Range("I2:I2377") 
      x = cell.Value 
      For i = 2 To 49 
       If x > .Range("N" & i) And x <= .Range("O" & i) Then 
        .Range("J" & cell.Row) = .Range("P" & i) 
        Exit For 
       End If 
      Next i 
     Next cell 
    End With 
End Sub 

结果:到其中的值落在打印右旁的值的范围内的数目,在列J.
仔细观察间隔是如何测试的:数值需要大于下限和上限。这在您的示例数据中不一致。

+0

谢谢@ user1016274这段代码工作得很好!感谢你的帮助。以前的尝试并没有在运行时抛出错误,但它们也没有对实际结果进行任何更改,所以我不确定发生了什么。 – NLourme

+0

如果您发现代码很有用,并且感谢它与时间线性运行,而不是二次方程式,请将我的帖子标记为“答案”。 – user1016274

2

记住设置单元格的值时使用的Value属性。我假设你的意思是将J列作为将列P中的值粘贴到的目标列(这就是代码中的内容)。 这应该工作和比较,对于每一行X,在列中的单元的我X到在列N和O的所有对的值的值。如果第I X值是至少一对之间的列中的N个值和O它拷贝ĴX的值为P X

Sub CountP() 
Dim ws As Worksheet 
Dim i As Integer, j As Integer  

Set ws = Sheets("Bulk Add") 
For i=2 To 2377 
    For j=2 To 2377 

    If ws.Range("I" & i) > ws.Range("N" & j).Value _ 
    And ws.Range("I" & i).Value < ws.Range("O" & j).Value Then 
     ws.Range("J" & i).Value = ws.Range("P" & i).Value 

     ' Once you've found one pair of N and O that satisfies the condition, 
     'you move on to the next row, by forcing the j loop to end. 

     Exit For 
    End If 
    Next j 
Next i 

End Sub 
+0

嗨@alfymbohm,我认为你正在做的事情,但是当我运行宏没有任何反应。我认为这是因为如果I2不在N2和O2之间,那么如果I3在N3和O3之间等等,那么它会继续前进。这就是为什么我使用两个整数i和j来保持列I中的值不变,同时检查列N和O中的每个值。 – NLourme

+0

因此,如果我理解正确,对于每一行你想检查列I中的值是否在列N和O中的至少一对值之间?那是I2你想看看是否N2 alfymbohm

+0

嗨,是的,就是这样。对此感到抱歉。 – NLourme