Если у меня есть такая таблица:
A B
C D
E F
Когда я удаляю ячейку B, я хочу, чтобы все ячейки сместились на одну позицию в сторону A, вот так:
A C
D E
F
Как этого добиться? А как сделать наоборот - вставить одну ячейку куда-нибудь и заставить все остальные ячейки переместиться на одну позицию?
решение1
Несколько дней назад мне нужно было что-то вроде того, о чем просил knezmilos, и я не нашел ничего, что могло бы это сделать. Поэтому я создал макрос VBA (Word 2016), чтобы сделать именно это. Макрос работает четырьмя разными способами:
- Сдвинуть все ячейки вправо до конца таблицы (Public Sub MoveCellsRight)
- Сдвинуть все ячейки вправо до первой пустой ячейки (Public Sub MoveCellsRightFirstBlankCell)
- Сдвинуть все ячейки влево до начала таблицы (Public Sub MoveCellsLeft)
- Сдвинуть все ячейки влево до первой пустой ячейки (Public Sub MoveCellsLeftFirstBlankCell)
Этот макросНЕ БУДЕТ:
- Работа с таблицами внутри ячейки.
- Работа с разделенными ячейками (в каждой строке должно быть одинаковое количество столбцов).
- Сохраняет формат ячейки. (Надеюсь, кто-нибудь улучшит этот макрос, добавив эту функцию).
Вот макрос:
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
Попытка ответа:
Написать макрос для:
- создать отдельную копию последней ячейки в таблице под таблицей,
- удалить скопированную ячейку из таблицы,
- верните курсор в последнюю оставшуюся ячейку, чтобы подготовиться к повторению.
Протестируйте, затем попробуйте удалить межстраничный интервал для выравнивания таблиц
и отрегулируйте отображение границ, чтобы получить рабочий дизайн/внешний вид.
(Не пробовал)
Пробуем сделать что-нибудь в LibreOffice (v5.1.6.2) Writer, чтобы помочь записать макрос:
Примечание: Я не пытаюсь записать это в Write, просто показываю, как это МОЖЕТ работать в Word, предполагая, что у него те же сочетания клавиш, что и у Write. У меня нет доступа к Word в данный момент Это пример МЫШЛЕНИЯ, которое можно применить к проблеме. Я не пытаюсь дать конкретный ответ на вопрос.
Меню > Таблица > Вставить таблицу (CTRL+F12), по умолчанию таблица 2x2...
Введите строки текста как минимум в последние две строки ячеек.
Нажмите курсор вниз, чтобы выйти из таблицы, нажмите ENTER, чтобы между таблицей и любой вставляемой строкой была хотя бы одна дополнительная строка.
Приведенное ниже описание может показаться «продвинутым», но на практике операции таковыми не являются.
Запись должна начинаться с того места, где скопирована последняя строка ячеек. Итак:
- Удерживая клавишу CTRL, дважды нажмите курсор вверх.
Теперь курсор находится в верхнем левом углу правой ячейки, в последней строке таблицы (начальная точка). - Начать запись (при использовании в Word)
- Выберите Меню > Таблица > Разделить таблицу
(последняя строка таблицы разделится на отдельную таблицу) - Теперь, удерживая клавиши CTRL и SHIFT, дважды нажмите End.
Запишите выбранную ячейку с правой стороны таблицы из одной строки и двух столбцов. - Удерживайте CTRL, нажмите X — чтобы вырезать содержимое
- Удерживая CTRL+SHIFT, нажмите «Домой».
Выделены обе ячейки. - Выберите Меню > Таблица > Объединить ячейки.
- переместить курсор вниз на две строки, вставить (CTRL+V)
- Удерживая клавишу CTRL, перемещайте курсор на один шаг вверх, пока он не займет положение, аналогичное положению после шага 1) выше.
- Остановить запись (при использовании Word).
Последняя строка таблицы была разделена на две отдельные «таблицы» с одной ячейкой в каждой.
Теперь назначение макросу сочетания клавиш заставит вас работать: Самое простое здесь — сидеть и удерживать его, пока макрос «съедает» таблицу. Вероятно, несколько минут для большой таблицы, дольше, если таблица больше.