2014-05-07 30 views
4

我希望在Excel(2003)中采用导入的数据转储并将其格式化为报告。我所做的大部分工作都涉及录制宏,然后在需要的地方自定义代码。我有一个需要纯代码的地方。基于单元格值删除整个行

我有一个SORTED列(D)列出了发生率的类型(例如:车辆火灾,中风,动物咬伤等)。我想阅读D列中的每个值,如果它不是我们正在寻找的几个值之一,请删除整行。

我已经试过的代码(即我在网上找到),并产生最接近的结果是什么,我需要的代码的多个版本是这样的:

Range("D:D").Select 
Dim workrange As Range 
Dim cell As Range 
Set workrange = Intersect(Selection, ActiveSheet.UsedRange) 
For Each cell In workrange 
    If ActiveCell.Value <> "VFIRE" _ 
     And ActiveCell.Value <> "ILBURN" _ 
     And ActiveCell.Value <> "SMOKEA" _ 
     And ActiveCell.Value <> "ST3" _ 
     And ActiveCell.Value <> "TA1PED" _ 
     And ActiveCell.Value <> "UN1" _ 
      Then ActiveCell.EntireRow.Delete 
Next cell 
End Sub 

此代码删除大部分的名单( 〜原来的168行),但它只是删除行,直到它达到我想要的东西的第一个值。例如,当前数据转储没有“ILBURN”或“SMOKEA”的任何值,但是当第一次出现“ST3”时,宏停止。没有产生错误,它似乎认为它完成了。

我应该添加什么来通过整个列表调用宏?

+2

当删除行时,通常的方法是从底部开始并工作*向上 - 然后当您删除一行时,您不会踩在自己的脚上。 –

+0

从底部开始的逻辑是有道理的,但是在我尝试了几个我写在网上发现的代码版本之后,我仍然无法完成这项工作。你能否给我一些建议(使用上面的例子)?谢谢。 – user3613124

+0

蒂姆,我能在rondebruin的网站上找到工作的代码。非常感谢你从底层开始寻找工作的想法。 – user3613124

回答

3

我都是关于简洁。

Sub DeleteRowBasedOnCriteria() 
Dim RowToTest As Long 

For RowToTest = Cells(Rows.Count, 4).End(xlUp).Row To 2 Step -1 

With Cells(RowToTest, 4) 
    If .Value <> "VFIRE" _ 
    And .Value <> "ILBURN" _ 
    And .Value <> "SMOKEA" _ 
    And .Value <> "ST3" _ 
    And .Value <> "TA1PED" _ 
    And .Value <> "UN1" _ 
    Then _ 
    Rows(RowToTest).EntireRow.Delete 
End With 

Next RowToTest 

End Sub 
+0

工作完美......而且简短。谢谢! – user3613124

0

我同意@Tim_Williams,你需要向后工作,因为这似乎是问题所在。我会做这样的事情。

Sub Main() 
Dim workrange As Range 
Dim Firstrow As Integer 
Dim Lastrow As Integer 
Dim lrow As Integer 

'Find first and last used row in column D 
Range("D:D").Select 
Firstrow = ActiveSheet.UsedRange.Cells(1).Row 
Lastrow = ActiveSheet.Range("D1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp).Row 

'Loop through used cells backwards and delete if needed 
For lrow = Lastrow To Firstrow Step -1 
    Set workrange = Cells(lrow, 4) 
    If workrange.Value <> "VFIRE" _ 
     And workrange.Value <> "ILBURN" _ 
     And workrange.Value <> "SMOKEA" _ 
     And workrange.Value <> "ST3" _ 
     And workrange.Value <> "TA1PED" _ 
     And workrange.Value <> "UN1" _ 
      Then workrange.EntireRow.Delete 

Next lrow 

End Sub 
0

我在我的任务,其中,因为我有100迭代的测试数据,这是我要修剪至第一10迭代阵列中的一个所使用到,所以所使用的“迭代#> 10”的细胞删除整行。

Sub trim_row() 

' trim_row Macro 
' to trim row which is greater than iteration#10 

Dim RowToTest As Long 
Dim temp As String 
Dim temp1 As Integer 

For RowToTest = Cells(Rows.Count, 6).End(xlUp).Row To 2 Step -1 

With Cells(RowToTest, 6) 

temp = .Value 
If temp = "" Then 

    Else 
    temp1 = Trim(Replace(temp, "Iteration# :: ", "")) 

     If temp1 > 10 Then 
     Rows(RowToTest).EntireRow.Delete 
     End If 
End If 

End With 

Next RowToTest 

End Sub 

予用户更换&行程从字符串中提取号码,并介绍了如果=“”条件跳过空行。我将空行分隔成一组测试数据。

相关问题