2017-03-15 68 views
0

会下面的代码能够被修改以Excel的VBA宏删除基于列标题整个行

  1. 除去基于列标题和单元格的值的多个行,和
  2. 了多列要这样做行组合?

例如:列“状态”值“完成” 循环使用所有床单和寻找这样的状态,并删除其中的状态中有一个完整的全行所有标题?

Sub Delete_Rows_Based_On_Header_and_Value() 
' 
' Delete_Rows_Based_On_Header_and_Value Macro 
' 
' Declaration 
Dim a as long 
Dim w as long 
Dim vDELCOLs as variant 
Dim vCOLNDX as variant 
Dim vDELROWs as variant 
Dim vROWNDX as variant 

vDELCOLs = array("status","Status Name","Status Processes") 
vDELROWs = array("Complete","Completed","Done") 

with Activeworkbook 
    for w=1 to .worksheets.count 
     with worksheets(w) 
' I know this part is to delete columns based on the column name and I am not sure how to modify it to just check column name then delete row based on the value on that column only. 
      for a=lbound(vdelcols) to ubound(vdelcols) 
       vcolndx=application.match(vdelcols(a), .rows(1), 0) 
       if not iserror(vcolndx) then 
        .columns(vcolndx).entirecolumn.delete 
       end if 
      next a 
     end with 
    next w 
end with 
+1

之前,你可以写任何代码更有效,你需要决定是否要删除行如果(a)的状态列包含“完成”或者状态名称列包含“已完成”,或者状态进程列包含“已完成”,或者(b)状态列包含“完成”并且状态名称列包含“已完成”并且状态处理列包含“已完成”。 – YowE3K

+0

因此,对于1列名称和1个单元格值,即:Status和Complete,然后执行状态名称和完成的第三行以及状态处理的第三行,并完成正确操作会更容易?这样可以简化代码和流程? –

+0

对于一个值来说,它会略微**更简单 - 它可以节省您想要的所有值是匹配还是任何值匹配。但是,如果你愿意只检查一列的值,那么你可能已经**已经决定,如果任何**值匹配,你想要删除该行。 – YowE3K

回答

1

下面的代码将数组作为vDELROWS的阵列以及将删除一行如果任何值匹配的内容是在相应的列中。

Sub Delete_Rows_Based_On_Header_and_Value() 
    ' 
    ' Delete_Rows_Based_On_Header_and_Value Macro 
    ' 
    ' Declaration 
    Dim a As Long 
    Dim w As Long 
    Dim vDELCOLs As Variant 
    Dim vCOLNDX As Variant 
    Dim vDELROWs As Variant 
    Dim vROWNDX As Variant 
    Dim r As Long 
    Dim v As Long 

    vDELCOLs = Array("status", "Status Name", "Status Processes") 
    vDELROWs = Array(Array("Complete", "Pending"), Array("Completed", "Pending"), Array("Done")) 

    With ActiveWorkbook 
     For w = 1 To .Worksheets.Count 
      With Worksheets(w) 
       For a = LBound(vDELCOLs) To UBound(vDELCOLs) 
        vCOLNDX = Application.Match(vDELCOLs(a), .Rows(1), 0) 
        If Not IsError(vCOLNDX) Then 
         For r = .Cells(.Rows.Count, vCOLNDX).End(xlUp).Row To 1 Step -1 
          For v = LBound(vDELROWs(a)) To UBound(vDELROWs(a)) 
           If .Cells(r, vCOLNDX).Value = vDELROWs(a)(v) Then 
            .Rows(r).EntireRow.Delete 
            Exit For 
           End If 
          Next 
         Next 
        End If 
       Next a 
      End With 
     Next w 
    End With 
End Sub 
+0

你好,为了确保我明白,因为这远远超过了我现在..所以你说的是这将删除“status -Complete”“status - Pending”“status - Completed”“Status - Done “状态处理完成”“状态处理 - 完成”“状态处理 - 完成”“状态处理 - 完成”状态名称 - 完成“”状态名称 - 待处理“”状态名称 - 完成“”状态 - 完成“是对的吗? –

+0

不,它将首先处理“状态”列并删除包含“Complete”或“Pending”(由于Array(“Complete”,“Pending”))的任何行,然后它将通过“状态名称“列并删除包含”已完成“或”待定“(由于Array(”已完成“,”待定“))的任何行,然后它将通过”状态过程“列并删除包含完成(由于Array(“完成”))。因此'vDELROWS'数组中的每个'Array(...)'对应于'vDELCOLS'数组中的等效列。 – YowE3K

+0

很有意义!它非常完美,非常好 –

0

自动筛选比循环

Sub DeleteRows() 
    Sheet1.Range("a1:c35").AutoFilter Field:=2, Criteria1:="Completed" 
    Sheet1.UsedRange.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete 
Sheet1.UsedRange.AutoFilter 
'repeat for each value 
End Sub