从包含合并单元格的表格中删除范围

问题描述 投票:0回答:3

基本上,我想要完成的是:删除表中从光标在表中的位置到表末尾的所有行。

问题是这个表包含垂直合并的单元格,所以当我尝试做这样的事情时:

For i = Selection.Tables(1).Rows.Count To Selection.Cells(1).RowIndex Step -1
    Selection.Tables(1).Rows(i).Delete
Next

它抱怨无法访问各个行,因为表包含垂直合并的单元格。

我也尝试过先选择范围,然后删除选择。但我无法正确定义范围;它总是抱怨参数定义不正确。

vba ms-word
3个回答
2
投票

使用 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

0
投票

我想在尝试 CuberChase 解决方案时添加答案,但它不适用于我的表:

Table Screenshot

注意,我在第 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

不知道其他人是否遇到过类似的问题,但我想我会将答案放在这里以防万一有人遇到。 :)


0
投票

我遇到了类似的问题,我解决了计算适当的范围并删除选择的问题。请注意,当您合并单元格时,无法访问 table.Rows(i),但可以访问单个单元格。

  • docWord 是文档
  • oWordTable 是要从中删除的表
  • iFromRow / iToRow 是要删除的行范围的索引

代码片段:

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()
© www.soinside.com 2019 - 2024. All rights reserved.