Как сместить ячейки на одно место в таблице в Microsoft Word 2013 после удаления/вставки?

Как сместить ячейки на одно место в таблице в Microsoft Word 2013 после удаления/вставки?

Если у меня есть такая таблица:

A B
C D
E F

Когда я удаляю ячейку B, я хочу, чтобы все ячейки сместились на одну позицию в сторону A, вот так:

A C
D E
F

Как этого добиться? А как сделать наоборот - вставить одну ячейку куда-нибудь и заставить все остальные ячейки переместиться на одну позицию?

решение1

Несколько дней назад мне нужно было что-то вроде того, о чем просил knezmilos, и я не нашел ничего, что могло бы это сделать. Поэтому я создал макрос VBA (Word 2016), чтобы сделать именно это. Макрос работает четырьмя разными способами:

  1. Сдвинуть все ячейки вправо до конца таблицы (Public Sub MoveCellsRight)
  2. Сдвинуть все ячейки вправо до первой пустой ячейки (Public Sub MoveCellsRightFirstBlankCell)
  3. Сдвинуть все ячейки влево до начала таблицы (Public Sub MoveCellsLeft)
  4. Сдвинуть все ячейки влево до первой пустой ячейки (Public Sub MoveCellsLeftFirstBlankCell)

Этот макросНЕ БУДЕТ:

  1. Работа с таблицами внутри ячейки.
  2. Работа с разделенными ячейками (в каждой строке должно быть одинаковое количество столбцов).
  3. Сохраняет формат ячейки. (Надеюсь, кто-нибудь улучшит этот макрос, добавив эту функцию).

Вот макрос:


Option Explicit

Dim vmCurrentTableIndex As Integer
Dim vmCurrentTableRowCount As Integer
Dim vmCurrentTableColCount As Integer
Dim vmCurrentCellRow As Integer
Dim vmCurrentCellCol As Integer
Dim vmDirection As String
Enum StopCellMode
    FirstLastCell = 0
    FirstBlankCell = 1
End Enum

Public Sub MoveCellsRight()
    If SetModuleVariables("right") Then
        If CheckCurrentCellPosition() Then
            MoveCellContent (FirstLastCell)
        End If
    End If
End Sub

Public Sub MoveCellsLeft()
    If SetModuleVariables("left") Then
        If CheckCurrentCellPosition() Then
            MoveCellContent (FirstLastCell)
        End If
    End If
End Sub

Public Sub MoveCellsRightFirstBlankCell()
    If SetModuleVariables("right") Then
        If CheckCurrentCellPosition() Then
            MoveCellContent (FirstBlankCell)
        End If
    End If
End Sub

Public Sub MoveCellsLeftFirstBlankCell()
    If SetModuleVariables("left") Then
        If CheckCurrentCellPosition() Then
            MoveCellContent (FirstBlankCell)
        End If
    End If
End Sub

Private Function SetModuleVariables(vpDirection As String) As Boolean
    Dim vsOK As Boolean
    Dim vsMsgBoxValue As Integer
    'Check if the [cursor | insertion point] is inside a table.
    If ActiveDocument.ActiveWindow.Selection.Information(wdWithInTable) Then
        vsOK = True
        'Get the index of the current table. / Source: https://wordmvp.com/FAQs/MacrosVBA/GetIndexNoOfPara.htm
        vmCurrentTableIndex = ActiveDocument.Range(0, Selection.Tables(1).Range.End).Tables.Count
        vmCurrentTableRowCount = ActiveDocument.Tables(vmCurrentTableIndex).Rows.Count
        vmCurrentTableColCount = ActiveDocument.Tables(vmCurrentTableIndex).Columns.Count
        vmCurrentCellRow = ActiveDocument.ActiveWindow.Selection.Cells(1).RowIndex
        vmCurrentCellCol = ActiveDocument.ActiveWindow.Selection.Cells(1).ColumnIndex
        vmDirection = vpDirection
    Else
        vsMsgBoxValue = MsgBox("This command can be executed only within a table.", vbInformation, "Error")
        vsOK = False
    End If
    SetModuleVariables = vsOK
End Function

Private Function CheckCurrentCellPosition() As Boolean
    Dim vsOK As Boolean
    Dim vsMsgBoxValue As Integer
    vsOK = True
    If vmDirection = "right" Then
        If vmCurrentCellRow = vmCurrentTableRowCount And vmCurrentCellCol = vmCurrentTableColCount Then
            vsMsgBoxValue = MsgBox("This is the last cell. There is no cell to move to the right.", vbCritical, "Error")
            vsOK = False
        End If
    Else
        If vmCurrentCellRow = 1 And vmCurrentCellCol = 1 Then
            vsMsgBoxValue = MsgBox("This is the first cell. There is no cell to move to the left.", vbCritical, "Error")
             vsOK = False
        End If
    End If
    CheckCurrentCellPosition = vsOK
End Function

Private Sub MoveCellContent(vpStopCellMode As StopCellMode)
    Dim vsCol As Integer
    Dim vsRow As Integer
    Dim vsStartRow As Integer
    Dim vsStartCol As Integer
    Dim vsEndRow As Integer
    Dim vsEndCol As Integer
    Dim vsStep As Integer
    Dim IsStartColSet As Boolean
    Dim vsCurrentCellContent As String
    Dim vsPreviousCellContent As String
    Dim vsLenght As Integer
    vsPreviousCellContent = ""
    IsStartColSet = False
    vsStartRow = vmCurrentCellRow
    vsStartCol = vmCurrentCellCol
    If vmDirection = "right" Then
        vsStep = 1
        vsEndRow = vmCurrentTableRowCount
        vsEndCol = vmCurrentTableColCount
    Else
        vsStep = -1
        vsEndRow = 1
        vsEndCol = 1
    End If
    For vsRow = vsStartRow To vsEndRow Step vsStep
        For vsCol = vsStartCol To vsEndCol Step vsStep
            vsLenght = Len(ActiveDocument.Tables(vmCurrentTableIndex).Cell(vsRow, vsCol).Range.Text) - 2
            vsCurrentCellContent = Left(ActiveDocument.Tables(vmCurrentTableIndex).Cell(vsRow, vsCol).Range.Text, vsLenght)
            ActiveDocument.Tables(vmCurrentTableIndex).Cell(vsRow, vsCol).Range.Text = vsPreviousCellContent
            vsPreviousCellContent = vsCurrentCellContent
            If vsCurrentCellContent = "" And vpStopCellMode = FirstBlankCell Then
                Exit Sub
            End If
        Next
        If IsStartColSet = False Then
            If vmDirection = "right" Then
                vsStartCol = 1
            Else
                vsStartCol = vmCurrentTableColCount
            End If
            IsStartColSet = True
        End If
    Next
End Sub

решение2

Попытка ответа:
Написать макрос для:

  1. создать отдельную копию последней ячейки в таблице под таблицей,
  2. удалить скопированную ячейку из таблицы,
  3. верните курсор в последнюю оставшуюся ячейку, чтобы подготовиться к повторению.

Протестируйте, затем попробуйте удалить межстраничный интервал для выравнивания таблиц
и отрегулируйте отображение границ, чтобы получить рабочий дизайн/внешний вид.
(Не пробовал)


Пробуем сделать что-нибудь в LibreOffice (v5.1.6.2) Writer, чтобы помочь записать макрос:

Примечание: Я не пытаюсь записать это в Write, просто показываю, как это МОЖЕТ работать в Word, предполагая, что у него те же сочетания клавиш, что и у Write. У меня нет доступа к Word в данный момент Это пример МЫШЛЕНИЯ, которое можно применить к проблеме. Я не пытаюсь дать конкретный ответ на вопрос.

Меню > Таблица > Вставить таблицу (CTRL+F12), по умолчанию таблица 2x2...

Введите строки текста как минимум в последние две строки ячеек.

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

Приведенное ниже описание может показаться «продвинутым», но на практике операции таковыми не являются.

Запись должна начинаться с того места, где скопирована последняя строка ячеек. Итак:

  1. Удерживая клавишу CTRL, дважды нажмите курсор вверх.
    Теперь курсор находится в верхнем левом углу правой ячейки, в последней строке таблицы (начальная точка).
  2. Начать запись (при использовании в Word)
  3. Выберите Меню > Таблица > Разделить таблицу
    (последняя строка таблицы разделится на отдельную таблицу)
  4. Теперь, удерживая клавиши CTRL и SHIFT, дважды нажмите End.
    Запишите выбранную ячейку с правой стороны таблицы из одной строки и двух столбцов.
  5. Удерживайте CTRL, нажмите X — чтобы вырезать содержимое
  6. Удерживая CTRL+SHIFT, нажмите «Домой».
    Выделены обе ячейки.
  7. Выберите Меню > Таблица > Объединить ячейки.
  8. переместить курсор вниз на две строки, вставить (CTRL+V)
  9. Удерживая клавишу CTRL, перемещайте курсор на один шаг вверх, пока он не займет положение, аналогичное положению после шага 1) выше.
  10. Остановить запись (при использовании Word).

Последняя строка таблицы была разделена на две отдельные «таблицы» с одной ячейкой в ​​каждой.

Теперь назначение макросу сочетания клавиш заставит вас работать: Самое простое здесь — сидеть и удерживать его, пока макрос «съедает» таблицу. Вероятно, несколько минут для большой таблицы, дольше, если таблица больше.

Связанный контент