2013-06-04 40 views
0

我有可以简化为这种情况的数据来删除行: http://i.imgur.com/mn5GgrQ.png创建Excel宏如果列值重复连续小于3倍

在本例中,我想删除与轨道相关联的数据2,因为它只有3个相关的帧。所有超过3个关联帧的数据都可以保留。

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

这是可能的Visual Basic在Excel宏中,任何人都可以给我一些启动提示,我可能会使用哪些功能?完成新手在这里。我还没有发现任何类似的VBA,only for R.

回答

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获得磁道号码中的聚合信息的程序的功能和与之相关的细胞。此方法遍历字典并检查与轨道关联的单元格的数量是否为<=2(因为拆分字符串会返回从0开始的数组)。它建立一个这样的单元格的地址串,并在最后一次删除它。

注:

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