-1

我有一个过时的 CS 学位,所以我了解 VB 的基础知识,但我不经常编写宏并且需要帮助解决特定情况。(...但我了解函数和面向对象的编程)

假设如下: - A 列包含字母数字形式的参考 ID,按字母顺序排序。- B 列包含文本字符串或空格。

我正在尝试编写一个宏,该宏会根据 B 列中“注释”的内容自动删除每个唯一参考号的任何额外行。问题是,如果 A 列有多个唯一参考号实例,我需要确定哪一行包含 B 列中的某些内容。有一个问题:参考编号可能在 B 列中没有任何内容,应该保留。

为了进一步解释,在以下屏幕截图中,我需要:

  • 保留黄色突出显示的行
  • 删除剩余的行

我尝试使用右侧的括号并用红色标记显示报告如何显示数据的各种配置。很难解释我想要做什么,所以我想一张照片会更清楚地显示我需要什么。

此任务使报告变得非常手动且耗时。

4

1 回答 1

0

这很简单,您只需遍历行并检查是否需要删除该行,是否需要删除具有此 id 的较早行或什么都不会发生。在我的示例中,我标记了这些行并最终删除它们。

Sub foo()
Dim rngSelection As Range
Dim startingRow As Integer
Dim endRow As Integer
Dim idColumn As Integer
Dim noteColumn As Integer
Dim idValuableRow As New Dictionary
Dim deleteRows As New Collection

Set rngSelection = Selection
startingRow = rngSelection.Row
endRow = rngSelection.Rows.Count + startingRow - 1


idColumn = rngSelection.Column
noteColumn = idColumn + 1

For i = startingRow To endRow
    currentID = Cells(i, idColumn)
    If idValuableRow.Exists(currentID) Then
        If Trim(idValuableRow(currentID)("note")) <> "" And Trim(Cells(i, noteColumn)) = "" Then
            deleteRows.Add i
         ElseIf idValuableRow(currentID)("note") = "" And Trim(Cells(i, noteColumn)) <> "" Then
            deleteRows.Add idValuableRow(currentID)("row")
            idValuableRow(currentID)("row") = i
            idValuableRow(currentID)("note") = Cells(i, noteColumn)
        End If
    Else
        Dim arr(2) As Variant
        idValuableRow.Add currentID, New Dictionary
        idValuableRow(currentID).Add "row", i
        idValuableRow(currentID).Add "note", Cells(i, noteColumn)
    End If


Next i
deletedRows = 0
For Each element In deleteRows
    If element <> "" Then
        Rows(element - deletedRows & ":" & element - deletedRows).Select
        Selection.Delete Shift:=xlUp
        deletedRows = deletedRows + 1

        End If
    Next element

End Sub

它可能看起来像这样。您唯一需要的是在工具/参考中添加 Microsoft 脚本运行时

于 2012-05-29T16:40:44.240 回答