0

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

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

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

这是否可以在 Excel 宏中使用 Visual Basic,任何人都可以给我一些关于我可以使用哪些功能的入门提示吗?完全新手在这里。我还没有发现任何类似 VBA 的东西,仅适用于 R。

4

1 回答 1

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是一个返回字典的函数(它将轨道号存储为键,与该轨道关联的单元格地址作为字符串)

DeleteRowsWhereTrackLTE3GetCountOfRowsForEachTrack用于获取轨道编号和与其关联的单元格的聚合信息的过程。此方法循环遍历字典并检查与 track 关联的单元格的数量是否为<=2(因为拆分字符串返回从 0 开始的数组)。它构建这些单元格的地址字符串,并在最后一次将其全部删除。

笔记:

  1. 在基本模块(或您拥有数据的特定工作表)中添加以下代码。
  2. 添加对“Microsoft Scripting.Runtime”库的引用。在 VBA 中,单击“工具”->“参考”菜单。勾选“Microsoft Scripting.Runtime”并单击“确定”。
  3. 我曾用过A2:A15这个例子。请根据您的单元格范围对其进行修改。
  4. 假设您没有要删除的数千个单元格,在这种情况下,该方法可能会失败。
  5. 调用以DeleteRowsWhereTrackLTE3删除此类行。
于 2013-06-04T18:41:14.177 回答