¿Cómo cambiar las celdas un lugar en una tabla en Microsoft Word 2013 después de eliminarlas/insertarlas?

¿Cómo cambiar las celdas un lugar en una tabla en Microsoft Word 2013 después de eliminarlas/insertarlas?

Si tengo una tabla como esta:

A B
C D
E F

Cuando elimino la celda B, quiero que todas las celdas se desplacen un lugar hacia A, así:

A C
D E
F

¿Cómo lograr esto? Además, ¿cómo conseguir lo contrario: insertar una sola celda en algún lugar y hacer que todas las demás celdas se muevan un lugar?

Respuesta1

Hace unos días necesitaba algo como el que me pidió knezmilos y no encuentro nada para hacerlo. Entonces, creé una macro VBA (Word 2016) para hacer precisamente eso. La macro funciona de cuatro maneras diferentes:

  1. Desplaza todas las celdas hacia la derecha hasta el final de la tabla (Public Sub MoveCellsRight)
  2. Desplaza todas las celdas hacia la derecha hasta la primera celda en blanco (Public Sub MoveCellsRightFirstBlankCell)
  3. Desplaza todas las celdas hacia la izquierda hasta el comienzo de la tabla (Public Sub MoveCellsLeft)
  4. Desplaza todas las celdas hacia la izquierda hasta la primera celda en blanco (Public Sub MoveCellsLeftFirstBlankCell)

Esta macroNO LO HARA:

  1. Trabajar con tablas dentro de una celda.
  2. Trabajar con celdas divididas (cada fila debe tener el mismo número de columnas).
  3. Conservar el formato de la celda. (Espero que alguien mejore esta macro agregando esta función).

Aquí está la macro:


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

Respuesta2

Intento de respuesta:
escriba una macro para:

  1. cree una copia separada de la última celda en la tabla debajo de la tabla,
  2. eliminar la celda copiada de la tabla,
  3. retroceda el cursor a la última celda restante para prepararse para una repetición.

Pruebe, luego intente eliminar el espaciado de los bordes para la interalineación de las tablas
y ajuste la representación de los bordes para obtener un diseño/apariencia que funcione.
(No probé esto)


Probando cosas en LibreOffice (v5.1.6.2) Writer, para ayudar a grabar la macro:

Nota: No intento registrar esto en Write, solo mostrar cómo PODRÍA funcionar en Word, suponiendo que tenga las mismas combinaciones de teclas que Write. No tengo acceso a Word en este momento Este es un ejemplo del PENSAMIENTO a aplicar al problema, no estoy intentando una respuesta específica a la pregunta.

Menú > Tabla > Insertar tabla (CTRL+F12), por defecto es tabla 2x2...

Escriba líneas de texto al menos en las dos últimas filas de celdas.

Presione el cursor hacia abajo para salir de la tabla, presione ENTER para tener al menos una fila adicional entre la tabla y cualquier pegado siguiente.

Ahora bien, la descripción siguiente puede parecer "avanzada", pero las operaciones en la práctica NO lo son.

La grabación debe comenzar desde donde se copia la última fila de celdas. Entonces:

  1. Mantenga presionada la tecla CTRL, presione el cursor hacia arriba dos veces,
    el cursor ahora está en la parte superior izquierda de la celda derecha, última línea de la tabla (el punto de partida)
  2. Iniciar grabación (cuando se usa en Word)
  3. Seleccione Menú > Tabla > Dividir tabla
    (la última fila de la tabla se divide en una tabla separada)
  4. Ahora mantenga presionadas las teclas CTRL y MAYÚS, presione Finalizar dos veces.
    Escribir seleccionó toda la celda del lado derecho de la tabla de una sola fila y dos columnas.
  5. Mantenga presionada la tecla CTRL y presione X para cortar el contenido.
  6. Mantenga presionada la tecla CTRL+MAYÚS y presione Inicio.
    Ambas celdas seleccionadas.
  7. Seleccione Menú > Tabla > Combinar celdas
  8. mueva el cursor hacia abajo dos líneas, pegue (CTRL+V)
  9. Mantenga presionada la tecla CTRL y mueva el cursor hacia arriba un paso a la vez hasta que el cursor se coloque de manera similar a como estaba después del paso 1) anterior.
  10. Detener la grabación (cuando se utiliza Word).

La última fila de la tabla se ha extraído en dos "tablas" separadas con una celda cada una.

Ahora, al asignar una tecla de acceso directo a la macro, podrá ejecutar: lo simple aquí es sentarse y mantenerla presionada mientras la macro "devora" la mesa. Probablemente unos minutos para una mesa grande, más si es más grande.

información relacionada