我有一个数据集,其中每一行都包含以下列:年份,大学名称,本科学生人数和研究生人数。
对于每个大学名称,有4行数据(2013-2016年)。如果有4年中任何一年的本科学生人数或研究生人数缺失数据,我想删除该学院的所有4行。
我将如何做到这一点?
答案 0 :(得分:1)
这应该这样做。假设年份字段是数字而不是文本。
Sub DeleteColleges()
Set rg = ActiveSheet.Range("a2")
Do While Not rg = ""
If rg.Offset(0, 2) = "" Or rg.Offset(0, 3) = "" Then
yearRow = rg.Value - 2012 'see note 1
Set rg = rg.Offset(5 - yearRow, 0) 'see note 2
rg.Offset(-4, 0).Range("a1:a4").EntireRow.Delete
Else
Set rg = rg.Offset(1, 0)
End If
Loop
End Sub
注1:这会计算我们所处的年份行,从2013年的第1行到2016年的第4行
注意2:在我们删除行之前,范围(' rg')被移动到下一个学院,否则当我们删除行并且宏将失败时rg将变为null
注3:代码需要比这更强大。至少我会确保数据行的数量是四的倍数(其他任何东西都表示数据有问题),而A列只包含2013年至2016年的四个值。
也许值得更改代码以寻找非数字而不仅仅是空白单元
答案 1 :(得分:0)
正如评论中所提到的,这可能是通过公式而努力的
=IFERROR(IF(MOD(ROW(),4)=2,INDEX(A:A,MATCH(1,(SUBTOTAL(2,OFFSET($C$2,(ROW($A$1:$A$10)-1)*4,0,4,2))=8)*
(COUNTIF($I$1:$I1,INDEX($B:$B,N(IF({1},(ROW($A$1:$A$10)-1)*4+2))))=0),0)*4-2),
INDEX(A:A,MATCH($I1,$B:$B,0)+MOD(ROW()-2,4))),"")
公式的前两行与4条记录的第1行有关,第3条与第2-4条有关。
公式的第一行使用Offset和Subtotal来检查4 X 2学生编号块,看看计数是否为8.匹配选择第一个具有完整数据并且之前未列出的学院。< / p>
第二行使用Index构造来获取不同学院名称的列表,并检查它们是否已使用Countif列出。 ROW($ A $ 1:$ A $ 10)需要改变才能与10多所大学打交道。
公式的第三行使用当前行上方行中的名称查找匹配的大学记录,并从原始数据中的相应行和列中选取数据。
假设一切都从第2行开始。