VBA通过查找和平均删除一行

时间:2019-05-22 15:24:45

标签: excel vba

我有一张每天更换的桌子。有时会在A列中以三的倍数找到文本“ AB12”。发生这种情况时,我需要VBA识别它已发生,找到它已发生的行,然后对该行的C,E,G,I,K,M,O和Q列中的值求平均值。然后,需要将此平均值与下一行的平均值进行比较,然后删除该行之后的平均值,但平均值最高的行除外。

下面可以找到我到目前为止编写的代码。

Sub FindAB12()
    Columns("A:Q").Select
    Set rngRange = Selection.CurrentRegion
    lngNumRows = rngRange.Rows.Count
    lngFirstRow = rngRange.Row
    lngLastRow = lngFirstRow + lngNumRows - 1
    lngCompareColumn = ActiveCell.Column
    For lngCurrentRow = lngLastRow To lngFirstRow Step -1
        If (Cells(lngCurrentRow, lngCompareColumn).Text = "AB12" And Cells(lngCurrentRow + 1, lngCompareColumn).Text = "AB12") Then _
            AB121 = Application.WorksheetFunction.Average(Sheet1.Range("C" & lngCurrentRow & ":Q" & lngCurrentRow))
            AB122 = Application.WorksheetFunction.Average(Sheet1.Range("C" & (lngCurrentRow + 1) & ":Q" & (lngCurrentRow + 1)))
            AB123 = Application.WorksheetFunction.Average(Sheet1.Range("C" & (lngCurrentRow + 2) & ":Q" & (lngCurrentRow + 2)))
        Next lngCurrentRow

        If AB1211 > AB122 And AB1211 > AB123 Then
            Rows(lngCurrentRow + 1 And lngCurrentRow + 2).Delete
        ElseIf AB122 > AB123 And AB122 > AB121 Then
            Rows(lngCurrentRow And lngCurrentRow + 2).Delete
        ElseIf AB123 > AB122 And AB123 > AB121 Then
            Rows(lngCurrentRow And lngCurrentRow + 1).Delete
        End If
    End Sub

在一个单独的模块中,我在打开选项卡时调用了sub。可以预期的是,打开此选项卡后,连续的行中只会存在一个名为AB12的行(尽管在随后的行中可能会存在另一个AB12)。该代码将一直工作到我尝试求平均为止(在不需要计算时,我使用相同的代码成功找到并删除了这些重复的行)。当它播放并达到第二个平均函数时,出现错误"Run-time error '1004': Method 'Range' of object '_Worksheet' failed。我对VBA还是很陌生,在查看了其他人创建的许多代码后,我仍然无法解决问题。希望有人可以提供帮助。我以前从未使用过此论坛,也不确定如何最好地上传当前代码,希望我的问题和当前代码很清楚。

1 个答案:

答案 0 :(得分:0)

我在这里为您清理了照片-我删除了一些不必要的变量,删除了Select/ActiveColumn,并修复了一些错字(可以通过使用Option Explicit轻松找到):

Option Explicit
Sub FindAB12()

    Dim lngLastRow As Long, lngCompareColumn As Long, lngCurrentRow As Long
    Dim AB121 As Long, AB122 As Long, AB123 As Long

    lngCompareColumn = 1 'Column A
    lngLastRow = Cells(Rows.Count, lngCompareColumn).End(xlUp).Row

    For lngCurrentRow = lngLastRow To 2 Step -1

        If Cells(lngCurrentRow, lngCompareColumn).Value = "AB12" And _
           Cells(lngCurrentRow + 1, lngCompareColumn).Value = "AB12" And _
           Cells(lngCurrentRow + 2, lngCompareColumn).Value = "AB12" Then
            AB121 = Application.WorksheetFunction.Average(Sheet1.Range("C" & lngCurrentRow & ":Q" & lngCurrentRow))
            AB122 = Application.WorksheetFunction.Average(Sheet1.Range("C" & lngCurrentRow + 1 & ":Q" & lngCurrentRow + 1))
            AB123 = Application.WorksheetFunction.Average(Sheet1.Range("C" & lngCurrentRow + 2 & ":R" & lngCurrentRow + 2))

            If AB121 >= AB122 And AB121 >= AB123 Then
                Rows(lngCurrentRow + 2).Delete
                Rows(lngCurrentRow + 1).Delete
            ElseIf AB122 >= AB123 And AB122 >= AB121 Then
                Rows(lngCurrentRow + 2).Delete
                Rows(lngCurrentRow).Delete
            ElseIf AB123 >= AB122 And AB123 >= AB121 Then
                Rows(lngCurrentRow + 1).Delete
                Rows(lngCurrentRow).Delete
            End If

        End If

    Next lngCurrentRow

End Sub