Як зрушити клітини на одне місце в таблиці в Microsoft Word 2013 після видалення / вставки?


0

Якщо у мене є така таблиця:

A B
C D
E F

Коли я видаляю комірку В, я хочу, щоб усі комірки змістилися на одне місце у напрямку А так:

A C
D E
F

Як цього досягти? Крім того, як отримати зворотне - вставити одну клітинку кудись і перенести всі інші клітини на одне місце?


Зображення можна зробити вирівняними так, якщо вони досить малі, щоб розміститися між полями. Тепер у мене немає слова, з яким можна грати, тож: Чи можуть окремі невеликі столики вести себе однаково?
Ханну

Оскільки ви користуєтесь репутацією 1: Якщо відповідь допомогла вам, не забудьте натиснути сіру ☑ зліва від тексту, що означає "так, це відповідь"!
Ханну

Можливо, це би працювало з невеликими таблицями, але проблема в тому, що у мене вже є величезна таблиця, яку я редагую. І, мабуть, поводився б трохи інакше.
knezmilos

Це було б неможливо при повній структурі таблиці, яку використовує слово. Він може працювати лише в тому випадку, якщо для кожної комірки є своя власна таблиця з фіксованим розміром і змусити її обернути слова. Зважаючи на те, що у вас вже є величезна таблиця, справедливо сказати, що для перетворення структури таблиці буде потрібно стільки ж роботи, скільки перероблення її, що означає: ні, це неможливо. Макрос VBA був би дуже складним, щоб зробити цю роботу.
LPChip

1
Також зауважте, Word насправді не є інструментом для цього. Видавець набагато краще підходить для таких матеріалів. Видавець - це як слово, за винятком того, щоб упорядкувати розділи слів - це його сила, де у слові, його слабкість. Насправді ви можете мати більше удачі, якщо зможете скопіювати все до видавця та спробувати виконати там дію.
LPChip

Відповіді:


1

Кілька днів тому мені було потрібно щось на кшталт того, про що просив кнезміло, і я не знаходжу нічого для цього. Отже, я створив макрос 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

-1

Спроба відповіді:
Напишіть макрос на:

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

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


Спробуйте щось у програмі LibreOffice (v5.1.6.2) Writer, щоб допомогти у записі макросу:

Примітка: я не намагаюся записати це в Write, просто покажіть, як воно МОЖЕ працювати в Word, якщо припустити, що він має ті ж ключові прив’язки, що і Write. На даний момент у мене немає доступу до Word. Це приклад ДУМКИ, що застосовується до проблеми, я не намагаюся дати конкретну відповідь на питання Q

Меню> Таблиця> Вставити таблицю (CTRL + F12), за замовчуванням до таблиці 2х2 ...

Введіть рядки тексту принаймні в останні два ряди комірок.

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

Тепер опис нижче може здатися "вдосконаленим" - але на практиці операції НЕ.

Запис повинен починатися з того місця, з якого скопійовано останній ряд комірок. Тому:

  1. Утримуйте CTRL, двічі натисніть курсор,
    курсор тепер у верхній лівій частині правої комірки, останній рядок таблиці (початкова точка)
  2. Почніть запис (при використанні в Word)
  3. Виберіть Меню> Таблиця> Сплит-таблиця
    (Останній рядок таблиці розбивається на окрему таблицю)
  4. Тепер утримуйте CTRL та SHIFT, натисніть Кінець двічі.
    Напишіть вибрану всю праву бічну клітинку таблиці одного стовпця в один рядок.
  5. Утримуйте CTRL, натисніть X - щоб вирізати вміст
  6. Утримуйте CTRL + SHIFT, натисніть Home
    обидві комірки
  7. Виберіть Меню> Таблиця> Об'єднати клітини
  8. перемістити курсор вниз по двох рядках, вставити (CTRL + V)
  9. Утримуючи CTRL, переміщуйте курсор вгору на крок, поки курсор не буде розміщений так, як це було після кроку 1) вище.
  10. Зупиніть запис (при використанні Word).

Останній рядок таблиці був вилучений у дві окремі "таблиці" з однією коміркою.

Тепер, якщо призначити клавішу швидкого доступу до макросу, ви почнете працювати: найпростіша річ - сісти і утримувати її, поки макрос "з'їдає" таблицю. Напевно, кілька хвилин за великим столом, довше, якщо більший.


-1 тому, що в цій відповіді немає макросу VBA. І не буде такого, оскільки з досвіду я можу сказати вам, що це практично неможливо зробити. Словом макроса VBA не можна легко визначити таблицю, тому у величезному документі це зробити буде дуже важко.
LPChip

Б'юся об заклад , хоча , що це можливо, використовуючи відносні переміщення курсора і вибору створених шляхом введення з клавіатури (утримуючи SHIFT при переміщенні курсора). Наразі не варто спробувати
Ханну

Все можливо, але рівень навичок досягти цього набагато перевищує випадкового користувача. Вам потрібно знати документ ізсередини та VBA. ОП, звичайно, не може цього зробити, і через ту ж проблему, що у вас немає документа, удачі отримати якийсь код, який вони можуть використовувати без будь-яких змін. Чи згадував я протидію тому, як Word працює з клітинками, коли раптом вони обертаються навколо сторінок тощо ... змушуючи курсор переміщуватися до небажаних місць тощо
LPChip

VBA: Не обов'язково "Запис макросу" може бути усім необхідним. Останнє речення: Погоджено.
Ханну

Так ... Я дуже сумніваюся, що ви можете записати макрос, записати кілька натискань клавіш і отримати величезну таблицю, яка змінює їх клітинки приблизно так, як хоче ОП. Не кажучи вже про те, що якщо вам потрібно повторити макрос стільки разів, це можливо зробити швидше вручну, не записуючи макрос.
LPChip
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.