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

我正在写这个项目的第一个macros,它有一个来自运动传感器的数据导出。 在每个“检测到动作”行后都有一个“无动作”。 这个“无运动”是我无法编辑的传感器固件中的一个小故障。 所以看起来像这样:

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 

我需要删除“检测到dynamic”行之后立即显示的“无动作”。

在我编辑的在线代码的帮助下,我得到了这个:

 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 

这不是真的工作,大多数我最终删除了错误的行。 我哪里错了?

感谢您的帮助!

试试这个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 

这个想法是,它看起来是看当前行是否“没有运动” 前一行是“移动检测”。 如果是,请删除该“无动作”行。

您的原始代码在正确的轨道上,但注意它不会删除最后一个“无运动”行,因为它后面没有“运动检测”行。

这将解决您的问题。

 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