Excel VBA-如何删除少于X%行的值的列

时间:2018-11-21 18:57:38

标签: excel vba excel-vba

我知道如何在Excel中编写公式,并且我仅在Excel中编写了几个基本宏来格式化单元格数据。我刚刚完成了将大量数据导出到Excel的操作,但是我只知道其中的一些数据是相关的,因此我想编写一个宏,该宏将遍历每列(1500+),对于每列,请检查是否在至少X%的行(100k +)具有一个值(而不是等于“ null” 的字符串。

老实说,我什至不知道从哪里开始。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

使用具有以下公式的帮助列:

=COUNTA(A2:D2)-COUNTIF(A2:D2,"null")

这将告诉您在任何给定行中有多少个单元格的内容不是"null"

然后您可以在该列上进行过滤

注意:我的示例假设AD列中的数据,您需要针对数据进行调整。

答案 1 :(得分:1)

该代码认为有效范围是从第1行到该列中最低的非空单元格。一般警告,目前尚未经过测试,因此请首先在具有已知结果的虚拟版本上进行尝试。您必须更改常数TargetPercent以匹配您想要的X%。由于它正在使用工作表函数,因此它也可能非常慢,但是我认为它仍然比手工操作要快。我相信这也会删除任何空白列

还值得注意的是,在for循环中,从右向左移动很重要,这样在删除列时不会意外弄乱索引。

Option Explicit

Sub test()
Const TargetPercent = 0.5
Dim nullcells As Long
Dim blankcells As Long
Dim i As Long
Dim lastrow As Long
Dim lastcol

lastcol = ActiveSheet.Cells.Find("*", searchorder:=xlByColumns, searchdirection:=xlPrevious).Column
For i = lastcol To 1 Step -1
    lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, i).End(xlUp).row
    nullcells = Application.CountIf(ActiveSheet.Columns(i), "null")
    blankcells = Application.CountBlank(ActiveSheet.Range(Cells(1, i), Cells(lastrow, i)))
    If (lastrow - nullcells - blankcells) / lastrow < TargetPercent Then
        Columns(i).Delete (xlShiftToLeft)
    End If
Next i
End Sub