我希望将快捷键与可在Word文档的某些表上使用的VBA宏相关联。此宏应遍历所选表的所有行,并删除具有特定Shading.BackgroundPatternColor的行
我已经尝试了以下代码:
Sub DeleteRowWithShading()
Dim oRow As Word.Row
For Each oRow In Selection.Rows
If oRow.Shading.BackgroundPatternColor = -721354855 Then
oRow.Delete
End If
Next oRow
End Sub表中所有行的循环都是正确的,但是没有像预期的那样删除行。
我是VBA的新手,所以感谢大家的帮助!
发布于 2019-03-28 22:52:21
当在循环期间删除集合的元素时,就会出现问题。删除操作会将该项从集合中移除,从而停止内部计数。
有两种基本的方法可以解决这个问题。
1)从后到前遍历项目。由于要从集合中删除的内容在末尾,因此不会抛出计数:
Sub DeleteRowWithShading()
Dim oRow As Word.Row
Dim tbl As Word.Table
Dim nrRows As Long, rowCounter As Long
Dim check As Long
Set tbl = Selection.Tables(1)
nrRows = tbl.Rows.Count
For rowCounter = nrRows To 1 Step -1
Set oRow = tbl.Rows(rowCounter)
If oRow.Shading.BackgroundPatternColor = -721354855 Then
check = check + 1
oRow.Delete
End If
Next
Debug.Print "Nr of rows deleted: " & check
End Sub2)在第一次循环中将项添加到数组或自定义集合中,然后循环数组/集合以删除所有项(行)。
Sub DeleteRowWithShadingInArray()
Dim oRow As Word.Row
Dim tbl As Word.Table
Dim RowsToDelete() As Variant
Dim check As Long, itemNr As Long
Set tbl = Selection.Tables(1)
itemNr = 0
For Each oRow In tbl.Rows
ReDim Preserve RowsToDelete(itemNr)
If oRow.Shading.BackgroundPatternColor = -721354855 Then
Set RowsToDelete(itemNr) = oRow
itemNr = itemNr + 1
End If
Next
itemNr = 0
For itemNr = 0 To UBound(RowsToDelete)
check = check + 1
RowsToDelete(itemNr).Delete
Next
Debug.Print "Nr of rows deleted: " & check
End Subhttps://stackoverflow.com/questions/55382744
复制相似问题