VBA:在一个范围内找到MAX,将其他数据更改为零并重复处理

时间:2014-11-26 08:09:14

标签: excel vba excel-vba

我是vba的新手,所以想对我目前的项目提出一些建议。

我有一系列数据如下,但有更多的材料编号,例如:1002,1003,1004 ...

Material    Process     Time (mins)
 1001        a.1          0.00
 1001        a.2          0.00
 1001        a            0.50
 1001        b            0.70
 1001        c            1.00
 1001        d            2.50
 1001        e            1.00
 1001        f            0.30
 1001        g            0.50 
 1001        h            0.90
 1001        h.1          0.00
 1001        h.2          0.00

我需要的第一件事是让程序从范围A4:C11中找到最大时间并更改范围内的其他时间<最大为零。

然后我需要它重复其余数据的过程。 我已经通过录制宏(使用IF函数)成功地完成了它,但宏不是那么灵活,因为某些数据可能具有不同的范围。所以我希望能够得到一些帮助。

1 个答案:

答案 0 :(得分:0)

首先,您要为每列创建动态范围。您需要为要检查的每个列添加一个类似于您的VBA代码的行。我正在使用B列(流程)和C(时间)。

LastRowB = Cells(Rows.Count, "B").End(xlUp).Row
LastRowC = Cells(Rows.Count, "C").End(xlUp).Row
...

接下来,我们需要在变量中添加第一个值,以将其与其他值进行比较。

varC = Range("C2").Value

现在我们可以有效地检查变量到其他值,如果值更大,我们将它分配给变量。

'Look for the MAX value in this particular column
For i = 2 To LastRowC
   If Range("C" & i).Value > varC Then
       varC = Range("C" & i).Value
   End If
Next i

一旦它通过varC循环,它应该包含该范围内的最高值。我们可以重用相同的循环,只需改变条件。因为您只想保留第一个MAX值,所以我将使用另一个变量varMAXvarMAX用来说'嘿,我已经找到了一个MAX值'。

'Set all values that don't match MAX to 0 and only keep the first MAX value
varMAX = 0
For i = 2 To LastRowC
   If Range("C" & i).Value < varC Then
       Range("C" & i).Value = 0
   Else
       If Range("C" & i).Value = varC And varMAX < 1 Then
           varMAX = varMAX + 1
       Else
           Range("C" & i).Value = 0
       End If
   End If
Next i

现在为您想要的每一列重复此操作。

PS:如果有人能告诉我如何在我的FOR循环中添加正确的格式(获得正确的对齐方式),请在评论中告诉我! :)