简体   繁体   English

需要根据Excel VBA中当前单元格中的单元格值删除Excel工作表中的上一行

[英]Need to delete the previous row in a Excel sheet based on a cell value in a current cell in Excel VBA

I'm writing my first macro for this project that has the following data exports from a motion sensor. 我正在为这个项目编写我的第一个宏,它从运动传感器输出以下数据。 It has a 'No Motion' after every 'Motion Detected' row. 每次“检测到运动”行后都会显示“无运动”。 This 'No Motion' is a glitch within that sensor's firmware that I cannot edit. 这个'No Motion'是我无法编辑的传感器固件中的一个小故障。 So it looks like this: 所以它看起来像这样:

DataMessageGUID SensorID    Sensor Name Date    Value   Formatted Value Battery
5d6f57c1-7449-4da3-a9fa-9709ae4b0671    301232  Bedroom Left    8/4/2017 8:57   0   No Motion   100
adaa026e-8847-4eab-ac48-6ac93fc93f16    301232  Bedroom Left    8/4/2017 8:56   1   Motion Detected 100
0b4287f2-258e-48d5-97e6-e00ed3c68a6a    301232  Bedroom Left    8/4/2017 8:56   0   No Motion   100
0a3ba320-f8e5-4ae9-97ac-26c5269e811e    301232  Bedroom Left    8/4/2017 8:55   1   Motion Detected 100
1946aa41-fbaf-4a0d-8e5e-c846ef0cdb24    301232  Bedroom Left    8/4/2017 8:55   0   No Motion   100
ae214e59-c93f-4832-bfd9-5c011a60435a    301232  Bedroom Left    8/4/2017 8:54   1   Motion Detected 100
c2518ff0-053c-49fd-99e6-e6ed20798279    301232  Bedroom Left    8/4/2017 8:22   0   No Motion   100
e1678d9e-c919-4378-8021-cc669b45918a    301232  Bedroom Left    8/4/2017 8:21   1   Motion Detected 100
ed8c20ee-3630-4b68-8063-788b25f7c433    301232  Bedroom Left    8/4/2017 8:19   0   No Motion   100
7d537313-9133-4525-9ef8-fcb1fbce81ad    301232  Bedroom Left    8/4/2017 8:19   1   Motion Detected 100
dcaa463c-0ff0-4a17-9881-f67641fae014    301232  Bedroom Left    8/4/2017 8:16   0   No Motion   100
c66d16d2-063b-4aca-bd81-3abdaaa3063f    301232  Bedroom Left    8/4/2017 8:15   1   Motion Detected 100
1fbf6e16-c8e8-4a18-ae71-42195fcf6e48    301232  Bedroom Left    8/4/2017 8:14   0   No Motion   100
7f5ed16c-ab3d-411e-a2c7-851eeb5641d4    301232  Bedroom Left    8/4/2017 8:13   1   Motion Detected 100
63f79047-143b-4b17-a359-6d6eac1d3a43    301232  Bedroom Left    8/4/2017 8:13   0   No Motion   100
52f857f2-5b5b-4fec-b7da-67390236f473    301232  Bedroom Left    8/4/2017 8:12   1   Motion Detected 100
19bce92e-0068-4f46-ac1d-a79877c88a0c    301232  Bedroom Left    8/4/2017 8:12   0   No Motion   100

I need to remove the 'No Motion that shows up immediately after the 'Motion Detected' rows. 我需要删除“运动检测到”行后立即显示的“无运动”。

With the help of a code online I edited, I got this: 在我编辑的在线代码的帮助下,我得到了这个:

Sub Macro_Delete_rows()
Dim Firstrow As Long
Dim Lastrow As Long
Dim Lrow    As Long
Dim CalcMode As Long
Dim ViewMode As Long

With Application
    CalcMode = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
End With

With ActiveSheet
    .Select
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView

    .DisplayPageBreaks = False

    'Set the first and last row to loop through
    Firstrow = .UsedRange.Cells(1).Row
    Lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row

    For Lrow = Lastrow To Firstrow Step -1
        With .Cells(Lrow, "F")
            If Not IsError(.Value) Then
                If .Value = "Motion Detected" Then .Rows(Lrow - 1).EntireRow.Delete
                'Here I try to delete previous row to this row
            End If
        End With
    Next Lrow
End With

ActiveWindow.View = ViewMode
With Application
    .ScreenUpdating = True
    .Calculation = CalcMode
End With

End Sub

This doesn't really work and mostly I end up deleting the wrong rows. 这实际上并不起作用,而且我最终会删除错误的行。 Where am I going wrong? 我哪里错了?

Thank you for the help! 感谢您的帮助!

Try this as your For loop: 试试这个For循环:

  For Lrow = Lastrow To Firstrow Step -1
        With .Cells(Lrow, "F")
            If Not IsError(.Value) Then
                If .Value = "No Motion" And .Offset(-1, 0) = "Motion Detected" Then
                    .EntireRow.Select
                    .EntireRow.Delete
                End If
            End If
        End With
    Next Lrow

The idea is that it looks to see if the current row is "No Motion" and the previous row is "Motion Detected". 其想法是查看当前行是否为“无运动” 前一行是否为“运动检测”。 If so, delete that "No Motion" row. 如果是,请删除“无运动”行。

Your original code was on the right track, but notice it wouldn't delete that last "No Motion" line, since there's no "Motion Detected" row after it. 您的原始代码在正确的轨道上,但请注意它不会删除最后一个“无运动”行,因为它之后没有“运动检测”行。

This will solve your problem. 这将解决您的问题。

Sub Macro_Delete_rows()
Dim TotalRows As Long
TotalRows = Application.WorksheetFunction.CountA(Sheets("yourSheetName").Range("A:A"))
    For i = 2 To TotalRows
        'You can delete the data by 0 before No Moton Cell

        'if G colomn has No Motion
        Range("G" & i).Select
        If ActiveCell.Value = "No Motion" Then
            ActiveCell.EntireRow.Delete
            i = 1 - 1
        End If
'        'If F column has 0
'        Range("F" & i).Select
'        If ActiveCell.Value = 0 Then
'            ActiveCell.EntireRow.Delete
'            i = 1 - 1
'        End If

    Next i

End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM