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

时间:2014-01-23 18:42:14

标签: vba vsto word-vba

我正在尝试从具有水平合并单元格的表中删除列

table before delete columns

Selection.MoveEnd Unit:=WdUnits.wdCell, Count:=3
Selection.Columns.Delete

尽管列被删除,但在此过程中删除合并的单元格会留下损坏的表格。

table after delete columns

几乎类似的删除行方法可以正常工作,如本answer

中所述

解决方法

我正在做这样的事情作为解决方法

Selection.MoveEnd Unit:=WdUnits.wdCell, Count:=3
Selection.MoveDown Unit:=WdUnits.wdLine, Count:=2, Extend:=wdExtend
Selection.Cells.Delete

然后将索引1,2处的Cell宽度设置为表行的其余部分。这样就可以避免合并单元格被删除。

3 个答案:

答案 0 :(得分:1)

Word表并不总是直观的。如果单元格跨越要删除的列,则将始终删除整个跨区单元格,如图所示。

当我不使用VBA时,我总是在删除行或列之前取消合并单元格;否则,Word的行为很难预测。

使用VBA我建议如下:

'splits the header row of the current table into 7 cells
Selection.tables(1).cell(1,2).split numrows:=1, numcolumns:=7

'your code to delete columns
Selection.MoveEnd Unit:=WdUnits.wdCell, Count:=3
Selection.Columns.Delete

'merge the header row back into one span
ActiveDocument.Range( _
    start:= Selection.tables(1).cell(1,2).range.start, _
    end :=  Selection.tables(1).cell(1,5).range.end _
    ).cells.Merge

或更常规的方法,删除n列:

width = Selection.tables(1).columns.count - 1
Selection.tables(1).cell(1,2).split numrows:=1, _
     numcolumns:= width - 1
Selection.MoveEnd Unit:=WdUnits.wdCell, Count:= n
Selection.Columns.Delete
ActiveDocument.Range( _
    start:= Selection.tables(1).cell(1,2).range.start, _
    end :=  Selection.tables(1).cell(1,width-n-1).range.end _
    ).cells.Merge

答案 1 :(得分:0)

这应该这样做

Sub DeleteCols()
    Dim Col2Delete As Range
    Set Col2Delete = Selection.EntireColumn
    Col2Delete.Delete
End Sub

答案 2 :(得分:0)

首先,我们必须将表不是行/列,而是索引单元格。 (图1)

enter image description here

现在,我们应该选择从第二个单元格开始到最后一个单元格的范围。

enter image description here

最后,删除选择列

        Set Rng = Tbl.Range.Cells(2).Range
        Rng.End = Tbl.Range.Cells(Tbl.Range.Cells.Count).Range.End
        Rng.Select
        Selection.Columns.Delete