如何根据使用VBA的条件删除Excel ListObject中的行?

我在Excel中有一个表,名为tblFruits与10列,我想删除Fruit列包含Apple任何行。 我怎样才能做到这一点?

以下子作品:

 Private Sub deleteTableRowsBasedOnCriteria(tbl As ListObject, columnName As String, criteria As String) Dim x As Long, lastrow As Long, lr As ListRow lastrow = tbl.ListRows.Count For x = lastrow To 1 Step -1 Set lr = tbl.ListRows(x) If Intersect(lr.Range, tbl.ListColumns(columnName).Range).Value = criteria Then 'lr.Range.Select lr.Delete End If Next x End Sub 

子可以像这样执行:

 Dim tbl As ListObject Set tbl = ThisWorkbook.Worksheets("Sheet1").ListObjects("tblFruits") Call deleteTableRowsBasedOnCriteria(tbl, "Fruit", "Apple") 

那么,似乎.listrows属性被限制为一个列表行或所有列表行。

我发现解决这个问题最简单的方法是:

  1. 用一个公式来设置一个列,这个公式将指出我想消除的所有行(在这种情况下,您可能不需要公式)

  2. 在特定列上对列表对象进行sorting(最好是使得我的值被删除将在sorting结束时)

  3. 检索listrows范围的地址,我将删除

  4. 最后,删除检索范围,向上移动单元格。

在这个特定的代码片段中:

 Sub Delete_LO_Rows Const ctRemove as string = "Remove" 'value to be removed Dim myLO as listobject, r as long Dim N as integer 'number of the listcolumn with the formula Set myLo = Sheet1.ListObjects("Table1") 'listobject goes here With myLO With .Sort With .SortFields .Clear .Add Key:=.HeaderRowRange(myLO.ListColumns(N)), SortOn:= _ xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal End With .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With On Error GoTo NoRemoveFound r = Application.WorksheetFunction.Match(ctRemove, .ListColumns(.ListColumns.Count).DataBodyRange, 0) Range(.parent.name & "!" & .DataBodyRange(r, 1).Address & ":" & .DataBodyRange(.ListRows.Count, .ListColumns.Count).Address).Delete xlShiftUp 'Added the .parent.name to make sure the address is on the correct sure, but it will fail if there are any spaces or characters on the sheet name that will make it need a pair of '. 'The error is just to skip these two lines in case the match returns an error. There's likely a better/cleaner way to do that. NoRemoveFound: End With End sub 

希望能帮助到你…