Como deslocar células um lugar em uma tabela no Microsoft Word 2013 depois de remover / inserir?

0

Se eu tiver uma tabela como esta:

A B
C D
E F

Quando eu removo a célula B, quero que todas as células mudem um lugar para A assim:

A C
D E
F

Como conseguir isso? Além disso, como obter o oposto - inserir uma única célula em algum lugar e fazer com que todas as outras células se movam para um lugar?

    
por knezmilos 04.02.2018 / 12:11

2 respostas

1

Alguns dias atrás eu precisava de algo parecido com o que knezmilos pediu, e eu não encontrei nada para fazer isso. Então, criei uma macro VBA (Word 2016) para fazer exatamente isso. A macro funciona de quatro maneiras diferentes:

  1. Desloque todas as células para a direita até o final da tabela (Public Sub MoveCellsRight)
  2. Desloque todas as células para a direita até a primeira célula em branco (Public Sub MoveCellsRightFirstBlankCell)
  3. Desloque todas as células para a esquerda até o início da tabela (Public Sub MoveCellsLeft)
  4. Desloque todas as células para a esquerda até a primeira célula em branco (Public Sub MoveCellsLeftFirstBlankCell)

Esta macro NÃO :

  1. Trabalhe com tabelas dentro de uma célula.
  2. Trabalhe com células divididas (cada linha deve ter o mesmo número de colunas).
  3. Preserve o formato da célula. (Espero que alguém melhore essa macro adicionando esse 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
    
por 30.09.2018 / 13:59
-1

Answer Attempt:
Escreva uma macro para:

  1. crie uma cópia separada da última célula na tabela abaixo do mesa,
  2. remova a célula copiada da tabela,
  3. mova o cursor para a última célula restante para se preparar para um repita.

Teste e tente remover o espaçamento entre bordas para o alinhamento de tabelas. e ajuste a renderização de borda para obter um design / aparência de trabalho.
(Não tentei isso)

Experimentando coisas no LibreOffice (v5.1.6.2) Writer, para ajudar na gravação da macro:

Observação: não estou tentando gravar isso em Write, apenas mostre como ele pode funcionar no Word, assumindo que ele tenha as mesmas vinculações de teclas que o Write. Eu não tenho acesso ao Word neste momento Este é um exemplo do THINKING para aplicar ao problema, eu não estou tentando uma resposta específica para o Q

Menu > Tabela > Inserir tabela (CTRL + F12), o padrão é 2x2 tabela ...

Digite linhas de texto pelo menos nas duas últimas linhas de células.

Pressione o cursor para baixo para sair da tabela e pressione ENTER para ter pelo menos uma linha a mais entre a tabela e qualquer outra pasta.

Agora, a descrição abaixo pode parecer "avançada" - mas as operações na prática NÃO são.

A gravação tem que começar de onde a última linha de células é copiada. Então:

  1. Pressione CTRL, pressione o cursor duas vezes,
    Cursor está agora no canto superior esquerdo da célula direita, última linha da tabela (o ponto inicial)
  2. Iniciar gravação (ao usar no Word)
  3. Selecione o menu > Tabela > Mesa dividida

    (A última linha da tabela é dividida em uma tabela separada)
  4. Agora segure CTRL e SHIFT, pressione End duas vezes
    Escreva selecionado toda a célula do lado direito da tabela de duas colunas de linha única.
  5. Pressione CTRL, pressione X - para cortar o conteúdo
  6. Mantenha pressionada a tecla CTRL + SHIFT, pressione Início | Ambas as células selecionadas
  7. Selecione o menu > Tabela > Mesclar Células
  8. mova o cursor duas linhas para baixo, cole (CTRL + V)
  9. Mantenha a tecla CTRL pressionada, mova o cursor um passo de cada vez até que o cursor esteja posicionado de forma semelhante ao que estava após a etapa 1) acima.
  10. Parar de gravar (ao usar o Word).

A última linha da tabela foi extraída em duas "tabelas" separadas com uma célula cada.

Agora, a atribuição de uma tecla de atalho à macro fará com que você execute: O mais simples aqui é sentar e segurar enquanto a macro "consome" a tabela. Provavelmente alguns minutos para uma mesa grande, maior se for maior.

    
por 04.02.2018 / 13:52