基本上,我想要完成的是:删除表中从光标在表中的位置到表末尾的所有行。
问题是这个表包含垂直合并的单元格,所以当我尝试做这样的事情时:
For i = Selection.Tables(1).Rows.Count To Selection.Cells(1).RowIndex Step -1
Selection.Tables(1).Rows(i).Delete
Next
它抱怨无法访问各个行,因为表包含垂直合并的单元格。
我也尝试过先选择范围,然后删除选择。但我无法正确定义范围;它总是抱怨参数定义不正确。
使用 VBA 合并表格单元不是很麻烦吗? Word 似乎与列数和行数混淆了。 对于水平或垂直合并单元格的任意组合,以下内容似乎非常强大。
Sub DeleteRows()
Selection.MoveDown Unit:=wdLine, Count:=(Selection.Tables(1).Rows.Count - Selection.Cells(1).RowIndex), Extend:=wdExtend
Selection.Rows.Delete
End Sub
我想在尝试 CuberChase 解决方案时添加答案,但它不适用于我的表:
注意,我在第 1、2 和 5 列中垂直合并了行。当我实现
Selection.MoveDown
并意图选择父“A3”行中的所有行时,它无法识别第 3 列和第 4 列中的内部行。而是选择父“A4”、“A5”和“A6”行(与 A3 格式相同),而不选择任何内部行。
这是我最终必须做的才能成功删除表中的父行和子行。我首先必须收集每行中第一个单元格的索引以删除到数组中。我反转了数组,以便从下往上工作,以免在运行时更改索引。
然后我循环遍历反转数组,选择属于每个父行的单元格范围并删除与我的选择关联的行。
table = ActiveDocument.Tables(1)
For Each idx In ReverseArray
cells_to_delete = ActiveDocument.Range(Start=table.Range.Cells(idx).Range.Start, End=table.Range.Cells(idx+*count_of_cells*).Range.End)
cells_to_delete.Select
Selection.Range.Rows.Delete
Next idx
不知道其他人是否遇到过类似的问题,但我想我会将答案放在这里以防万一有人遇到。 :)
我遇到了类似的问题,我解决了计算适当的范围并删除选择的问题。请注意,当您合并单元格时,无法访问 table.Rows(i),但可以访问单个单元格。
代码片段:
For i As Integer = 1 To oWordTable.Range.Cells.Count
Dim rowIndex As Integer = oWordTable.Range.Cells(i).RowIndex
If rowIndex > iToRow Then Exit For
If cellFrom Is Nothing Then
'Select start cell of from row
If rowIndex = iFromRow Then
cellFrom = oWordTable.Range.Cells(i)
End If
End If
'Select end cell of to row
If rowIndex = iToRow Then
cellTo = oWordTable.Range.Cells(i)
End If
Next
Dim selRange As Word.Range = docWord.Range(
CObj(cellFrom.Range.Start), CObj(cellTo.Range.End))
'This only delete content
'selRange.Delete()
selRange.Select()
docWord.Application.Selection.Rows.Delete()