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:
- Desplaza todas las celdas hacia la derecha hasta el final de la tabla (Public Sub MoveCellsRight)
- Desplaza todas las celdas hacia la derecha hasta la primera celda en blanco (Public Sub MoveCellsRightFirstBlankCell)
- Desplaza todas las celdas hacia la izquierda hasta el comienzo de la tabla (Public Sub MoveCellsLeft)
- Desplaza todas las celdas hacia la izquierda hasta la primera celda en blanco (Public Sub MoveCellsLeftFirstBlankCell)
Esta macroNO LO HARA:
- Trabajar con tablas dentro de una celda.
- Trabajar con celdas divididas (cada fila debe tener el mismo número de columnas).
- 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:
- cree una copia separada de la última celda en la tabla debajo de la tabla,
- eliminar la celda copiada de la tabla,
- 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:
- 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) - Iniciar grabación (cuando se usa en Word)
- Seleccione Menú > Tabla > Dividir tabla
(la última fila de la tabla se divide en una tabla separada) - 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. - Mantenga presionada la tecla CTRL y presione X para cortar el contenido.
- Mantenga presionada la tecla CTRL+MAYÚS y presione Inicio.
Ambas celdas seleccionadas. - Seleccione Menú > Tabla > Combinar celdas
- mueva el cursor hacia abajo dos líneas, pegue (CTRL+V)
- 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.
- 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.