提取在 Excel 的 VBA 中重复出现的数组的最大值
Extracting maximum values of an array with repeated ocurrences in Excel's VBA
我有一个 table,它有重复的索引,如图所示:
我想获取每个索引的时间 1 / 时间 2 的最大值 ("Apple","Banana",...)
我的代码如下:
dim i as integer, j as integer
For i=2 to 4
j=2
While Cells(i,6)=Cells(j,2)
if Cells(j,3) > Cells(i,7) then
Cells(i,7) = Cells(j,3)
end if
if Cells(j,4) > Cells(i,8) then
Cells(i,8) = Cells(j,4)
end if
Wend
Next i
所以我们的想法是遍历唯一名称,然后遍历名称的每次出现并检查它是否大于当前存储的时间。
我知道有一些语法错误,因为每当我 运行 代码都不会改变我的工作表时,我真的找不到关于如何替换 VBA 中的值的文档。
所以我想知道是否有更简单的方法来做到这一点,and/or寻求帮助以获得正确的语法。
这完全可以在没有 VBA 的情况下完成。使用您的示例数据,在单元格 J1 中,我使用此公式获取 B 列中唯一名称的数量:
=SUMPRODUCT((B2:B10<>"")/COUNTIF(B2:B10,B2:B10&""))
在单元格 F2 中向下复制到 F6 的是提取这些唯一名称的公式:
=IF(ROW(F1)>$J,"",INDEX($B:$B,MATCH(0,INDEX(COUNTIF(F:F1,$B:$B),),0)))
在单元格 G2 中向下复制到 H6 的是这个公式,用于提取每个唯一名称的最大时间值:
=IF($F2="","",MAX(INDEX(($B:$B=$F2)*C:C,)))
右侧(F、G 和 H 列)填充的 table 是结果:
或者,这可以通过枢轴轻松完成 table。 Select B、C 和 D 列中的原始数据,然后转到“插入”->“数据透视表”Table。我选择将它放在同一张工作表上,但如果愿意,您可以将它放在新的工作表上。然后它会询问你的 Pivot Table 字段,如图所示设置它们(注意你需要将值从 Count 更改为 Max):
然后您将有一个枢轴 table 显示相同的结果:
1.- 您声明了 "j=2" 但永远不要更改它,我认为您必须 "navegate" 从 2 到 10 的行,不是吗?
2.- 当您输入 "while" 语句时,您永远不会更改条件,所以...它将永远重复
我不确定你必须获得什么,所以请展示它的样本
++++++ 您必须从 table
中删除“-”值
dim i as integer, j as integer
For i=2 to 4
For j=2 to 10
if Cells(i,6)=Cells(j,2) then
if Cells(j,3) > Cells(i,7) then
Cells(i,7) = Cells(j,3)
end if
if Cells(j,4) > Cells(i,8) then
Cells(i,8) = Cells(j,4)
end if
end if
Next j
Next i
++++++ 您必须从 table
中删除“-”值
我有一个 table,它有重复的索引,如图所示:
我想获取每个索引的时间 1 / 时间 2 的最大值 ("Apple","Banana",...)
我的代码如下:
dim i as integer, j as integer
For i=2 to 4
j=2
While Cells(i,6)=Cells(j,2)
if Cells(j,3) > Cells(i,7) then
Cells(i,7) = Cells(j,3)
end if
if Cells(j,4) > Cells(i,8) then
Cells(i,8) = Cells(j,4)
end if
Wend
Next i
所以我们的想法是遍历唯一名称,然后遍历名称的每次出现并检查它是否大于当前存储的时间。
我知道有一些语法错误,因为每当我 运行 代码都不会改变我的工作表时,我真的找不到关于如何替换 VBA 中的值的文档。
所以我想知道是否有更简单的方法来做到这一点,and/or寻求帮助以获得正确的语法。
这完全可以在没有 VBA 的情况下完成。使用您的示例数据,在单元格 J1 中,我使用此公式获取 B 列中唯一名称的数量:
=SUMPRODUCT((B2:B10<>"")/COUNTIF(B2:B10,B2:B10&""))
在单元格 F2 中向下复制到 F6 的是提取这些唯一名称的公式:
=IF(ROW(F1)>$J,"",INDEX($B:$B,MATCH(0,INDEX(COUNTIF(F:F1,$B:$B),),0)))
在单元格 G2 中向下复制到 H6 的是这个公式,用于提取每个唯一名称的最大时间值:
=IF($F2="","",MAX(INDEX(($B:$B=$F2)*C:C,)))
右侧(F、G 和 H 列)填充的 table 是结果:
或者,这可以通过枢轴轻松完成 table。 Select B、C 和 D 列中的原始数据,然后转到“插入”->“数据透视表”Table。我选择将它放在同一张工作表上,但如果愿意,您可以将它放在新的工作表上。然后它会询问你的 Pivot Table 字段,如图所示设置它们(注意你需要将值从 Count 更改为 Max):
然后您将有一个枢轴 table 显示相同的结果:
1.- 您声明了 "j=2" 但永远不要更改它,我认为您必须 "navegate" 从 2 到 10 的行,不是吗?
2.- 当您输入 "while" 语句时,您永远不会更改条件,所以...它将永远重复
我不确定你必须获得什么,所以请展示它的样本
++++++ 您必须从 table
中删除“-”值dim i as integer, j as integer
For i=2 to 4
For j=2 to 10
if Cells(i,6)=Cells(j,2) then
if Cells(j,3) > Cells(i,7) then
Cells(i,7) = Cells(j,3)
end if
if Cells(j,4) > Cells(i,8) then
Cells(i,8) = Cells(j,4)
end if
end if
Next j
Next i
++++++ 您必须从 table
中删除“-”值