Удаление столбцов из таблицы с объединенными ячейками

Я пытаюсь удалить столбцы из таблицы с горизонтально объединенными ячейками

table before delete columns

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

Несмотря на то, что столбцы удаляются, объединенные ячейки удаляются в процессе, оставляя разбитую таблицу.

table after delete columns

Почти аналогичный подход к удалению строк отлично работает, как описано в этом ,

Обход

Я делаю что-то вроде этого, работая вокруг

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

Затем установите ширину ячейки в индексе 1,2 для остальной части строк таблицы. Таким образом, вы можете избежать удаленной слияния ячейки.

Ответ 1

Таблицы Word не всегда интуитивно понятны. Если ячейка охватывает столбец, который должен быть удален, тогда, как вы показали, всегда будет удалена клетка, связанная с ENTIRE.

Когда я НЕ использую 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

Ответ 2

Это должно сделать это

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