操作Excel电子表格,根据列中的值删除行,然后根据另一列中的值删除更多行

时间:2015-09-16 11:03:52

标签: excel vba excel-vba

我有一个相当复杂的问题。

我有一个日志文件,当放入excel列#34;我"包含事件ID,列J包含一个自定义键,使特定的组保持均匀。

我想要做的就是删除事件id列中不包含say 102值的所有行。 然后我需要检查自定义键(列J)并删除重复的行,因为任何重复项都会错误地显示我想要的其他统计信息。

我已经能够使用com对象和.entirecolumn单元格值等从列中检索值,但我完全不知道如何拼凑一个可靠的方法来删除行。我无法弄清楚如何获取每个值的行。

为了更清楚一点,这是我对自己需要做的思考过程:

如果列I中的单元格值不= 102则删除单元格包含的行。 对电子表格中的所有行重复此操作。 然后- 读取J列中的每个单元格,并根据J列中的值删除包含重复项的所有行。 保存电子表格。

任何善良的人都可以帮助我吗?

其他信息:

第I列包含一个字符串,该字符串是事件ID号,例如= 1029 列J包含一个数字和字母混合的字符串= 1ASER0X3NEX0S

2 个答案:

答案 0 :(得分:1)

Ellz,我同意Macro Man的观点,认为你的标签具有误导性,更重要的是,我确实需要知道J列的细节。

然而,我今天对这些粗鲁的帖子感到厌倦,而且你的礼貌和尊重是我的,所以我在下面粘贴了一些代码就可以解决问题...提供了J列可以是一个字符串(你的详细信息)没有给我们......看看Macro Man的目标是什么?)。

有很多方法可以测试重复项。一种是尝试向集合添加唯一键,看它是否会引发错误。许多人不会喜欢这种哲学,但它似乎对你有好处,因为它还为你提供了J列中所有独特(即剩余)键的集合。

Sub Delete102sAndDuplicates()
    Dim ws As Worksheet
    Dim uniques As Collection
    Dim rng As Range
    Dim rowPair As Range
    Dim iCell As Range
    Dim jCell As Range
    Dim delRows As Range

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set rng = Intersect(ws.UsedRange, ws.Range("I:J"))
    Set uniques = New Collection

    For Each rowPair In rng.Rows

        Set iCell = rowPair.Cells(, 1)
        Set jCell = rowPair.Cells(, 2)

        On Error Resume Next
        uniques.Add jCell.Value2, jCell.Text

        If Err = 457 Or iCell.Value2 = 102 Then
            On Error GoTo 0
            If delRows Is Nothing Then
                Set delRows = rowPair.EntireRow
            Else
                Set delRows = Union(delRows, rowPair.EntireRow)
            End If
        End If

    Next

    If Not delRows is Nothing then
        MsgBox delRows.Address(False, False) & " deleted."
        delRows.Delete
    End If

End Sub

答案 1 :(得分:0)

有多种方法可以完成此操作,哪种方式最好取决于您执行此任务的频率以及是否要将其完全自动化。由于您已使用INSERT into history(history_date,sql_query,ip,authuser,authId) VALUES(2015-09-16 00:00:00,'UPDATE itemstypes SET typedesc="Keyboard",hassoftware=0 WHERE id="10"','10.16.7.44','superadmin','6') 标记了您的问题,因此我假设您对基于VBA的答案感到满意:

VBA

关键字是Sub removeValues() Range("I1").Select 'Start at the top of the I column 'We are going to go down the column until we hit an empty row Do Until IsEmpty(ActiveCell.Value) = True If ActiveCell.Value <> 102 Then ActiveCell.EntireRow.Delete 'Then delete the row Else ActiveCell.Offset(1).Select 'Select the cell below End If Loop 'Now we have removed all non-102 values from the column, let`s remove the duplicates from the J column Range("A:J").RemoveDuplicates Columns:=10, Header:=xlNo End Sub 。它将根据您在指定的列中找到的重复项从指定的范围中删除行。在这种情况下,它将根据第10列(即J)中的重复项从A-J列中删除项目。如果您的数据超出Range("A:J").RemoveDuplicates列,那么您需要将J替换为适当的范围。请注意,"A:J"值是相对于第一列的索引,因此当Columns列为J时,当该范围从A(1)开始时,它将是{{1}例如,如果范围仅为10。这有意义吗?

(注意:使用2并不是最好的做法,但这种方法最明显地转化为您尝试做的事情,因为看起来您对VBA不熟悉我认为这是最简单的理解)。