循环遍历Excel中的一系列单元格

时间:2013-10-29 21:02:45

标签: excel vba excel-vba

我有一张excel表,其中包含带有开始日期,开始时间和结束时间的电话。我想找到一种方法来遍历呼叫,看看在每次通话期间我们有多少电话中继线正在使用。可能有更好的方法来检查这个,但这是我正在考虑使用的逻辑。

在Cell C1中,我有本月第一次通话的开始时间。在D1中,我有该通话的结束时间。我知道在第一次通话开始时只有一个主干在使用。我需要遍历每个呼叫,看看当前检查呼叫之前的任何呼叫的结束时间是否大于当前正在检查的呼叫的开始时间。

因此,工作真正从第二行开始,并检查C2(呼叫2的呼叫开始时间)是否为< D1(通话结束时间1)。

下一个循环将检查C3&lt; D1然后检查C3是否< D2。如果任何检查为真,那么名为Trunks(起始值为1)的值将增加1.一旦行检查完成,Trunks将被写入与要检查的行对应的E列。

下一个循环将检查C4&lt; D1然后C4&lt; D2然后C4&lt; D3并将中继值写入E4

然后转到C5,依此类推,直到表格结束。工作表将从12,000行到15,000行。

这可以通过VBA中的子进行吗?任何人都可以帮我写这个子吗?以下是C1-C11和D1-D11的值。在下面的示例中,每行中的trunk值将为1,直到您到达第7行为止。因为第7行(6:10:05)中的调用开始时间小于第6行调用的结束时间( 6:10:59),这意味着两个呼叫同时发生,因此中继线将等于2。

C1 2:44:00 AM   D1 2:45:08 AM
C2 3:30:15 AM   D2 3:33:10 AM
C3 4:02:50 AM   D3 4:04:12 AM
C4 4:48:15 AM   D4 4:48:32 AM
C5 6:02:25 AM   D5 6:03:57 AM
C6 6:08:54 AM   D6 6:10:59 AM
C7 6:10:05 AM   D7 6:10:34 AM
C8 6:10:05 AM   D8 6:10:41 AM
C9 6:23:30 AM   D9 6:29:07 AM
C10 6:36:28 AM  D10 6:39:54 AM
C11 7:16:56 AM  D11 7:24:56 AM

提前致谢!

2 个答案:

答案 0 :(得分:2)

您不一定需要VBA。请尝试以下操作,调整数据范围。在这种情况下,您不能使用完整列引用,否则公式将需要很长时间才能运行。

=SUM(IF(C$1:C$11<=C1,IF(D$1:D$11>=C1,1,0),0))

当您输入此内容时,您必须按CTRL+SHIFT+ENTER而不是ENTER。你会知道它有效,因为Excel会用{}包围公式。

{=SUM(IF(C$1:C$11<=C1,IF(D$1:D$11>=C1,1,0),0))}

这是一个数组公式或CSE公式。它将您指定的范围中的每个单元格视为单个实例。 IFs正在模拟AND操作。这基本上是将开始时间<=当前行的开始时间和开始时间结束时间>=的行数相加。

此公式需要出现在每一行上。

这适用于上面的示例,但不是一个完整的解决方案。有错过的案例。

编辑:以下内容可能包括错过的案例。与上述规则相同。但是,这仍然是你自己学习的东西,因此解释非常清楚。

=SUM(IF(C$1:C$11<=C1,IF(D$1:D$11>=C1,1,0),IF(C1:C11>=C1,IF(C1:C11<=D1,1,0),0)))

答案 1 :(得分:0)

循环遍历一堆单元格,将其与另一列中的值进行比较的基本思想如下所示。我在其中一个程序中使用了类似的一个。现在您可以使用符合您要求的if / else逻辑。

For rowIndex = 2 To lr2

calcFormula1 = (Application.SumIf(Range("C2:C100"), Range(rowIndex, "D2:D99").Text, Range("E:E")))

Cells(rowIndex, "O").Value = calcFormula1

Next rowIndex