【问题标题】:Deleting specific rows删除特定行
【发布时间】:2015-11-19 03:58:51
【问题描述】:

我必须为里程计算器生成 Excel VBA 宏,因此我必须保留特定名称的第一个条目和最后一个条目,并删除其间的所有值。例如:

EXAMPLE DATA IMAGE

所以我想留下第一个Rivor Minor253和最后一个Rivor Minor253,但是中间的都必须删除。现在,我可以手动执行此操作,但我有超过 3,000 行,这需要我几天才能完成,我可以生成一个删除重复项的宏,但我不知道如何生成一个只会删除中间行的宏。

谁能提供一个符合我描述的宏?

【问题讨论】:

  • 数据是否已经排序,相同的行一个接一个,或者没有排序和宏需要遍历所有行并选择相同的行?
  • 是的,数据已经按交叉名称排序。所有的 Rivor Minor253 都在彼此之下,Rivor Minor248、Rivor Minor250 等也是如此。@GSazheniuk

标签: vba excel excel-formula countif


【解决方案1】:

如果愿意,请先打开录制宏。假设 CHAINAGE 在 ColumnA 中,在 Row39 中并复制下来以适合请尝试:

=OR(COUNTIF(B$1:B39,B39)=1,COUNTIF(B$1:B39,B39)=COUNTIF(B:B,B39))  

然后过滤该列以选择和删除 FALSE 行。

【讨论】:

  • 抱歉,您的意思是选择 Row39 到 Row50?以及如何过滤它?
  • 我选择了所有 columnA,然后进入 DATA > Sort & Filter,点击小向下箭头,取消选中所有内容,但 FALSE 不存在。列 A 中的数字在那里。
  • 好的,我做到了,它删除了从 Row39 到 Row50 的所有中间行。那么我是否必须为 Rivor Minor248 等所有其他名称执行此操作?
  • 我的意思是如何写 =OR(COUNTIF(B$1:B39,B39)=1,COUNTIF(B$1:B39,B39)=COUNTIF(B:B,B39))一种让它为每个不同的 Rivor Minor 自动完成的方法?还是我必须手动完成每个 Rivor Minor? postimg.org/image/hn3rvi5vl
  • 谢谢,经过几次尝试和错误,我终于明白你的意思了,哈哈。 @pnuts
【解决方案2】:

作为一个宏,这非常简单。

Sub del_brick()
    Dim fr As Long, lr As Long

    With Worksheets("Sheet1")  '<~~ set this properly!
        lr = Application.Match("zzz", .Columns(2))
        Do While lr > 40  '<~~ if lr is above row, there is nothing to delete
            fr = Application.Match(.Cells(lr, 2).Value2, .Columns(2), 0)
            If CBool(lr - fr - 1) Then
                .Range(.Cells(fr + 1, 1), .Cells(lr - 1, 1)).EntireRow.Delete
            End If
            lr = fr - 1
        Loop
    End With
End Sub

【讨论】:

  • 如果 lr 在 row 之上,什么意思,没有什么可删除的?我得到了其余的宏代码,谢谢。
  • 您提供的示例图像显示第 38 行中的列标题数据。第 39 行中 Chainage 条目的第一行。要删除最后一行必须是第 41 行或更高行,因为如果它是行40 将没有“中间”行可删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2018-12-14
  • 2014-09-16
相关资源
最近更新 更多