Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA:找到某个范围内的最大值,将其他数据更改为零,然后重复此过程_Vba_Excel - Fatal编程技术网

VBA:找到某个范围内的最大值,将其他数据更改为零,然后重复此过程

VBA:找到某个范围内的最大值,将其他数据更改为零,然后重复此过程,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

我是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.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