VBA:找到某个范围内的最大值,将其他数据更改为零,然后重复此过程
我是vba的新手,所以想对我当前的项目提出一些建议 我有一系列数据,如下所示,但有更多的材料编号,如:10021031004VBA:找到某个范围内的最大值,将其他数据更改为零,然后重复此过程,vba,excel,Vba,Excel,我是vba的新手,所以想对我当前的项目提出一些建议 我有一系列数据,如下所示,但有更多的材料编号,如:10021031004 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
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函数)成功地做到了这一点,但是宏没有那么灵活,因为某些数据可能具有不同的范围。因此,我希望能够在这方面获得一些帮助。因此,首先要为每个列创建一个动态范围。对于要检查的每一列,您需要在VBA代码中添加一行,如下所示。我使用的是B列(流程)和C列(时间) 接下来,我们需要在变量中添加第一个值,以将其与其他值进行比较
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
就应该包含该范围内的最高值。我们可以重用相同的循环,只需更改条件。因为您只想保留第一个最大值,所以我将使用另一个变量varMAX
varMAX
用于表示“嘿,我已经找到了一个最大值”
'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
“将所有与MAX不匹配的值设置为0,并仅保留第一个MAX值。”
varMAX=0
对于i=2至LastRowC
如果范围(“C”&i).值
现在对所需的每一列重复此操作
PS:如果有人能告诉我如何为我的FOR循环添加合适的格式(获得正确的对齐方式),请在评论中告诉我!:) 您好@CustomX,谢谢您的帮助,我在下面的答案中有一些问题*评论无法容纳qs..*希望你能帮忙@Aqila,好的,如果最大值只重复第一个(我可以做)。我不知道你说的材料部分是什么意思?请你进一步解释一下好吗?如果数据范围扩大,prev仅为1001。。然后我添加了100210310041005。。最大值将取1001到1005的总范围内的最大值。。我最多需要1001,1002,1003。。等等。@Aqila,你应该编辑你的问题,因为你在任何地方都没有提到。物料栏的顺序是否始终正确?全部1001,然后全部1002,全部1003,等等?不,顺序不正确。材料编号可能为11111 2341215。。
'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