如果列值连续重复少于3次,则创建Excel宏以删除行

时间:2013-06-04 18:14:24

标签: vba excel-vba excel

我的数据可以简化为: http://i.imgur.com/mn5GgrQ.png

在这个例子中,我想删除与轨道2相关的数据,因为它只有3帧与之关联。所有包含3个以上相关帧的数据都可以保留。

帧编号并不总是从1开始,正如我试图演示的那样。对于跟踪的帧数,轨道号将始终是相同的数字。我正在考虑使用一个函数为A列中的每个连续值附加一个变量,然后执行测试以查看该值是否等于> = 3.如果是,则转到A中的下一个整数,如果不,然后删除标有该整数的所有行(在本例中为2)。

这是否可以在Excel宏中使用Visual Basic,并且任何人都可以给我一些关于我可以使用哪些功能的开始提示?在这里完成新手。我没有找到任何类似的VBA,only for R.

1 个答案:

答案 0 :(得分:0)

我假设您通过阅读它来理解代码。

Option Explicit
Public Function GetCountOfRowsForEachTrack(ByVal sourceColumn As Range) As _
Scripting.Dictionary
Dim cell As Range
Dim trackValue As String
Dim groupedData As Scripting.Dictionary

Set groupedData = New Scripting.Dictionary
For Each cell In sourceColumn
    trackValue = cell.Value

    If groupedData.Exists(trackValue) Then
        groupedData(trackValue) = cell.Address(False, False) + "," + groupedData(trackValue)
    Else
        groupedData(trackValue) = cell.Address(False, False)
    End If
Next

Set GetCountOfRowsForEachTrack = groupedData
End Function

Public Sub DeleteRowsWhereTrackLTE3()
Dim groupedData As Scripting.Dictionary
Set groupedData = GetCountOfRowsForEachTrack(Range("A2:A15"))

Dim cellsToBeDeleted As String
Dim item
For Each item In groupedData.Items
    If UBound(Split(item, ",")) <= 2 Then
        cellsToBeDeleted = item + IIf(cellsToBeDeleted <> "", "," + cellsToBeDeleted, "")
    End If
Next

Range(cellsToBeDeleted).EntireRow.Delete
End Sub

GetCountOfRowsForEachTrack是一个返回字典的函数(它将轨道号存储为键,与该轨道关联的单元格地址为字符串)

DeleteRowsWhereTrackLTE3是使用GetCountOfRowsForEachTrack获取轨道号和与之关联的单元格的聚合信息的过程。此方法遍历字典并检查与track关联的单元格数是否为<=2(因为拆分字符串会返回从0开始的数组)。它构建了一系列此类单元格的地址,并将其全部删除到最后。

注意:

  1. 在bas模块(或其中的特定工作表)中添加以下代码 你有数据)。
  2. 添加对“Microsoft Scripting.Runtime”库的引用。在VBA内部,点击“工具” - &gt; “参考”菜单。勾选“Microsoft Scripting.Runtime”并单击“确定”。
  3. 我以A2:A15为例。请根据您的小区范围进行修改。
  4. 假设您没有要删除数千个单元格,在这种情况下,该方法可能会失败。
  5. 拨打DeleteRowsWhereTrackLTE3以删除此类行。