Se eu tiver uma tabela como esta:
A B
C D
E F
Quando removo a célula B, quero que todas as células se desloquem em direção a A assim:
A C
D E
F
Como conseguir isso? Além disso, como conseguir o oposto - inserir uma única célula em algum lugar e fazer com que todas as outras células se movam para um lugar?
Responder1
Há alguns dias precisei de algo parecido com o que Knezmilos pediu e não encontrei nada para fazer. Então, criei uma macro VBA (Word 2016) para fazer exatamente isso. A macro funciona de quatro maneiras diferentes:
- Desloque todas as células para a direita até o final da tabela (Public Sub MoveCellsRight)
- Desloque todas as células para a direita até a primeira célula em branco (Public Sub MoveCellsRightFirstBlankCell)
- Desloque todas as células para a esquerda até o início da tabela (Public Sub MoveCellsLeft)
- Desloque todas as células para a esquerda até a primeira célula em branco (Public Sub MoveCellsLeftFirstBlankCell)
Esta macroNÃO VOU:
- Trabalhe com tabelas dentro de uma célula.
- Trabalhe com células divididas (cada linha deve ter o mesmo número de colunas).
- Preservar o formato da célula. (Espero que alguém melhore esta macro adicionando este recurso).
Aqui está a 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
Responder2
Tentativa de resposta:
Escreva uma macro para:
- crie uma cópia separada da última célula da tabela abaixo da tabela,
- remova a célula copiada da tabela,
- mova o cursor para a última célula restante para se preparar para uma repetição.
Teste e tente remover o espaçamento das bordas para o interalinhamento da tabela
e ajuste a renderização das bordas para obter um design/aparência funcional.
(Não tentei isso)
Tentando coisas no LibreOffice (v5.1.6.2) Writer, para ajudar na gravação da macro:
Nota: não estou tentando registrar isso no Write, apenas mostro como PODE funcionar no Word, assumindo que tenha as mesmas combinações de teclas do Write. Não tenho acesso ao Word no momento Este é um exemplo do PENSAMENTO a ser aplicado ao problema, não estou tentando uma resposta específica para a Q
Menu > Tabela > Inserir Tabela (CTRL+F12), o padrão é tabela 2x2...
Digite linhas de texto pelo menos nas duas últimas linhas de células.
Pressione o cursor para baixo para sair da tabela, pressione ENTER para ter pelo menos uma linha extra entre a tabela e qualquer colagem futura.
Agora, a descrição abaixo pode parecer "avançada" - mas as operações na prática NÃO são.
A gravação deve começar onde a última linha de células foi copiada. Então:
- Segure CTRL, pressione o cursor para cima duas vezes,
o cursor agora está no canto superior esquerdo da célula direita, última linha da tabela (o ponto inicial) - Comece a gravar (ao usar no Word)
- Selecione Menu > Tabela > Dividir tabela
(a última linha da tabela é dividida em uma tabela separada) - Agora segure CTRL e SHIFT, pressione End duas vezes.
Escreva selecionada toda a célula do lado direito da tabela de linha única e duas colunas. - Segure CTRL, aperte X - para cortar o conteúdo
- Segure CTRL + SHIFT, pressione Home
Ambas as células selecionadas - Selecione Menu > Tabela > Mesclar Células
- mova o cursor duas linhas para baixo, cole (CTRL+V)
- Mantenha pressionada a tecla CTRL e mova o cursor para cima um passo de cada vez até que o cursor seja posicionado de forma semelhante ao passo 1) acima.
- Pare de gravar (ao usar o Word).
A última linha da tabela foi extraída em duas “tabelas” separadas com uma célula cada.
Agora, atribuir uma tecla de atalho à macro fará com que você execute: O simples aqui é sentar e segurar enquanto a macro "devora" a mesa. Provavelmente alguns minutos para uma mesa grande, mais tempo se for maior.