
如下图所示,如何获取每一个Sample Name的Height最大的那条记录呢?
图 1本文分享VBA代码的解法。
【思路】循环两次源数据,首次得到不同Sample Name及其Height最大值存入字典中,第二次循环比较每条源记录和字典值,将满足的记录追加存入结果变量,最后将结果变量数据写入一张新的工作表里。
具体操作步骤如下:
Step1:右键单击工作表标签→【查看代码】。
图 2Step2:双击“工程”窗口的“Sheet1”,在右侧的空白窗格里输入VBA代码。
图 3完整代码如下:
'Author: 小千办公
Sub Fetch_Only_Max_Record()
'声明变量
Dim ArOri, ArRst
Dim i As Integer
Dim N As Integer
Dim Dic As Object
'创建字典对象
Set Dic = CreateObject("scripting.dictionary")
'将数据源区域赋值给ArOri变量
ArOri = Range("A1").CurrentRegion.Value
'循环生成各样本Height最大值存入字典
For i = 1 To UBound(ArOri)
If Not Dic.exists(ArOri(i, 1)) Then
Dic.Add ArOri(i, 1), ArOri(i, 3)
Else
If ArOri(i, 3) > Dic(ArOri(i, 1)) Then Dic(ArOri(i, 1)) = ArOri(i, 3)
End If
Next i
'定义存储预期结果数据的变量的维度大小
ReDim ArRst(1 To UBound(ArOri), 1 To UBound(ArOri, 2))
'循环源数据拾取满足条件的记录行追加到ArRst变量中
For i = 1 To UBound(ArOri)
If ArOri(i, 3) = Dic(ArOri(i, 1)) Then
N = N + 1
ArRst(N, 1) = ArOri(i, 1)
ArRst(N, 2) = ArOri(i, 2)
ArRst(N, 3) = ArOri(i, 3)
End If
Next i
'新建工作表,写入结果数据
Worksheets.Add
ActiveSheet.Range("A1").Resize(N, UBound(ArOri, 2)) = ArRst
'释放变量占据的内存
Erase ArRst
Erase ArOri
Set Dic = Nothing
End Sub
Step3:如图4,单击代码范围内任意位置,单击工具栏运行图标,结果如图5。
图 4
图 5【关键解析】两次循环得到的结果如图6、图7。
图 6
图 7本实例需求的其它解法如下:
操作与技巧解法:数据透视表解法:Power Query解法:函数公式+常规操作解法:如果你有妙招,欢迎留言!