Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
excel vba自动筛选范围,并删除D列中0的所有行_Excel_Filtering_Delete Row_Vba - Fatal编程技术网

excel vba自动筛选范围,并删除D列中0的所有行

excel vba自动筛选范围,并删除D列中0的所有行,excel,filtering,delete-row,vba,Excel,Filtering,Delete Row,Vba,我有一长串数据(产品标签),另一张有原始数据和计算。我有一个宏可以导入A2-AP2中的数据。它扫描D列并删除D列中任何值为零(0)的行。我已经让它工作了,但是,是否有办法将代码更改为仅删除a到AP中的行?我有3个其他代码需要这个,但我不能因为其他数据/辅助列而删除整行 Worksheets("Labels").Activate ActiveSheet.AutoFilterMode = False ActiveSheet.Range(drop2).AutoFilter Field:=4, C

我有一长串数据(产品标签),另一张有原始数据和计算。我有一个宏可以导入A2-AP2中的数据。它扫描D列并删除D列中任何值为零(0)的行。我已经让它工作了,但是,是否有办法将代码更改为仅删除a到AP中的行?我有3个其他代码需要这个,但我不能因为其他数据/辅助列而删除整行

Worksheets("Labels").Activate
 ActiveSheet.AutoFilterMode = False

 ActiveSheet.Range(drop2).AutoFilter Field:=4, Criteria1:="=-", _
        Operator:=xlOr, Criteria2:="=+"

    Dim oRow As Range, rng As Range
    Dim myRows As Range
    With Sheets("Labels")
        Set myRows = Intersect(.Range("D:D").EntireRow, .UsedRange)
        If myRows Is Nothing Then Exit Sub
    End With

    For Each oRow In myRows.Columns(1).Cells
        If oRow.EntireRow.Hidden Then
            If rng Is Nothing Then
                Set rng = oRow
            Else
                Set rng = Union(rng, oRow)
            End If
        End If
    Next

    If Not rng Is Nothing Then rng.EntireRow.Delete

 ActiveSheet.AutoFilterMode = False
 Application.ScreenUpdating = True

如果没有看到excel数据,我猜不出您在代码中做了什么。但是,根据您的解释,您将查看D列,如果找到0,则将删除整行。但是,您不希望删除整行,因为这将删除helper列。我只是想重复你说的话。如果这是您想要的,请使用带有Shift:=xlUp的range Delete函数调用

Range("A2:AP2").Delete Shift:=xlUp
这不会删除整行,但只会删除A2:AP2中的数据,并将下面的所有单元格上移。有点像是删除整行并保留辅助列不变

更新1:

我将试着用一个小例子来解释它。下面的屏幕截图显示了我正在使用的示例数据

黄色标记的单元格具有零值,除辅助列数据外,所有行都需要清除。下面是此excel数据的示例代码

Dim i As Integer
Dim myRows As Range

Set myRows = Intersect(Sheet1.Range("A:E").EntireRow, Sheet1.UsedRange)
If myRows Is Nothing Then Exit Sub

For i = 1 To myRows.Rows.Count
    If Sheet1.Cells(i, 4) = 0 Then
        Sheet1.Range("A" & CStr(i) & ":E" & CStr(i)).Delete (xlUp)
    End If
Next
如果执行上述代码,下面是结果的屏幕截图。请注意,值为0的列D的整行已被删除,而辅助列不受影响


它并不总是第2行,因为它将从第2行扫描到X行(通常小于5000)。我是否应该将当前行的外观检查设置为变量ex Range(“A2:AP2”)。删除Shift:=xlUp将是dim rd,作为字符串dr=activecell.row Range(“a”&rdel&“:AP”&rdel)。删除Shift:=xlUpYes。这是我试图举的一个例子。当然,您必须动态地使用它。“如果不是rng什么都不是,那么rng.EntireRow.Delete”-这在您的代码中,您可能需要调用rng.Delete Shift:xlUp。类似于此。
Dim rdel As String如果不是rng,则为Range(“A”&rdel&“:AP”&rdel)。Delete shift:=xlUp
删除了我的所有数据,幸好我在尝试此操作之前保存了一个版本。我猜我的代码错了。很好,你有它的副本。始终在单独的副本中测试代码,并将原始文件保存在安全的地方。我已经用一个样本和截图更新了答案。请检查它是否有助于解决您的问题。如果您想插入行调用,则是这样。插入。例如:Sheet1.Range(“A2:E2”).Insert(xlDown)将在a到E的第二行插入一行单元格。使用
Intersect
。SpecialCells(xlCellTypeVisible)
仅用于过滤范围:)我将试一试Siddharth,我的大部分代码(包括Intersect)来自谷歌搜索和另一个论坛。老实说,我不是100%确定代码在做什么,但它在大部分情况下确实有效。