2017-03-17 40 views
0

下面是我写的代码,其中删除包含在列中的值"PRODUCTION"M根据小区值和列标题

Sub DeleteProducts() 

    Dim LR, i As Long 
    Dim RNG As Range 
    Dim ws As Worksheet 

    For Each ws In ActiveWorkbook.Sheets 
     LR = ws.Cells(Rows.Count, "M").End(xlUp).Row 

     For i = LR To 2 Step -1 
      Select 
       Case ws.Cells(i, "M").Value 
       Case Is <> "Production" 
       ws.Cells(i, "M").EntireRow.Delete shift:=xlUp 
      End Select 
     Next i 
    Next ws 

End Sub 

我需要的行中根据多张要被删除的行删除的特定行到列标题,因为列名称可能会更改(M为其他内容),但标题在每张表中都是相同的。

+1

如果标题位于第一排,您将通过此行需要循环,直到指定的字符串被发现,这样的事情: '做虽然STR <>“myHeader” ... Loop' 在那个循环中,你必须使用整型变量,它会增加每个循环,并确定要搜索的列,所以你需要使用'Cells(1,i)'命令。当你找到字符串时,“i”将是列号。然后,你可以轻松地做你想做的。 –

回答

0

请使用Range.Find找到目标栏。修改下面的代码。

Sub DeleteProducts() 

Dim LR, i As Long 
Dim RNG As Range 
Dim ws As Worksheet 
Dim rngTargetColumn as range 


For Each ws In ActiveWorkbook.Sheets 
    Set rngTargetColumn = ws.Range("1:1").Find("*<Column Heading>*") 'Replace <Column Heading> with your column header string 
    if not rngTargetColumn is Nothing then 
     LR = ws.Cells(Rows.Count, rngTargetColumn.Column).End(xlUp).Row 

     For i = LR To 2 Step -1 
      If ws.Cells(i, rngTargetColumn.Column).Value <> "Production" Then 
        ws.Cells(i, rngTargetColumn.Column).EntireRow.Delete shift:=xlUp 
      End If 
     Next i 
     Set rngTargetColumn = Nothing 
    End If 
Next ws 
End Sub 
+0

嗨,代码,但当我第一次代码整个工作表空白,当我尝试第二个代码,我得到错误称为“对象变量或块变量未设置” – Kittu

+0

第一我得到错误在第10行第39我整顿它作为ws.Range(“1:1”) – Kittu

+0

是的,列的标题是在第一行 – Kittu

1

我假定列的标题是每个工作表的第一行:

Sub DeleteProducts() 

Dim LR as Long, LC as Long, i As Long, j As Long 
Dim RNG As Range 
Dim ws As Worksheet 

For Each ws In ActiveWorkbook.Sheets 

    LC = ws.Cells(1, Columns.Count).End(xlToRight).Column 
    For i = LC To 2 Step -1 
     If ws.Cells(1, i) = "YOURnameHERE" Then 
      LR = ws.Cells(Rows.Count, i).End(xlUp).Row 
      Exit For 
     End If 
    Next 

    For j = LR To 2 Step -1 
     If ws.Cells(j, i).Value <> "Production" Then ws.Cells(j, i).EntireRow.Delete shift:=xlUp 
    Next 

Next ws 

End Sub 

这将找到的列的名称,然后在i存储列的数量。通过这些信息,您可以找到该列的最后一行,并查找每个不是“生产”的值。

我还纠正了一些其他代码,只是为了更清洁。

0

她是我的任务。代码在所有工作表的第一行中搜索所需的标题。如果找到标题,那么在找到标题的列中继续搜索“Production”。

编辑:做了一些小的代码清理。

Sub DeleteRowProduction() 

Dim Header As Range 
Dim FoundCell As Range 
Dim ws As Worksheet 
Dim HeaderToFind As String 
Dim ValueToFind As String 

HeaderToFind = "aaa" 
ValueToFind = "Production" 

For Each ws In Worksheets 

    Set Header = ws.Rows(1).Find(what:=HeaderToFind, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True) 

    If Not Header Is Nothing Then 

     Set FoundCell = ws.Columns(Header.Column).Find(what:=ValueToFind, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True) 

     Do While Not FoundCell Is Nothing 
      ws.Rows(FoundCell.Row).Delete 
      Set FoundCell = Nothing 
      Set FoundCell = ws.Columns(Header.Column).Find(what:=ValueToFind, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True) 
     Loop 

    End If 

Next ws 

End Sub 
+0

这工作完美.... – Kittu

+0

@Kittu尼斯!如果您满意,您可能希望将我的解决方案标记为您的问题的答案。祝你一天愉快。 –

+0

是的..我想标记为解决方案 – Kittu