如何在删除/插入后将 Microsoft Word 2013 中的表格中的单元格移动一个位置?

如何在删除/插入后将 Microsoft Word 2013 中的表格中的单元格移动一个位置?

如果我有这样的表格:

A B
C D
E F

当我删除单元格 B 时,我希望所有单元格都向 A 方向移动一个位置,如下所示:

A C
D E
F

如何实现这一点?另外,如何实现相反的效果 - 在某处插入一个单元格,并让所有其他单元格移动一个位置?

答案1

几天前,我需要一些类似 knezmilos 要求的东西,但我找不到任何东西可以做。因此,我创建了一个 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

答案2

回答尝试:
编写一个宏来:

  1. 在表格下方创建表格中最后一个单元格的单独副本,
  2. 从表中删除复制的单元格,
  3. 将光标移回最后剩余的单元格以准备重复。

测试,然后尝试删除表格间对齐的边框间距
并调整边框渲染以获得有效的设计/外观。
(没试过)


在 LibreOffice (v5.1.6.2) Writer 中尝试以下操作以帮助录制宏:

注意:我并没有试图在 Write 中记录这一点,只是展示它在 Word 中可能如何工作(假设它具有与 Write 相同的键绑定)。我目前无法访问 Word 这是一个应用于问题的思考的例子,我并没有试图对问题做出具体的回答

菜单 > 表格 > 插入表格(CTRL+F12),默认为 2x2 表格...

至少在单元格的最后两行中输入几行文本。

按下光标向下退出表格,按 ENTER 键在表格和任何粘贴内容之间至少增加一行。

现在,下面的描述可能看起来很“高级” - 但实际操作却并非如此。

记录必须从最后一行单元格被复制出来的地方开始。因此:

  1. 按住 CTRL,向上按两次光标,
    光标现在位于右侧单元格的左上角,表格的最后一行(起点)
  2. 开始录制(在 Word 中使用时)
  3. 选择菜单 > 表格 > 拆分表格
    (表格的最后一行拆分为一个单独的表格)
  4. 现在按住 CTRL 和 SHIFT,按两次 End
    写入选定单行两列表格的整个右侧单元格。
  5. 按住 CTRL,按 X - 剪切内容
  6. 按住 CTRL+SHIFT,按 Home
    选定两个单元格
  7. 选择菜单 > 表格 > 合并单元格
  8. 将光标向下移动两行,粘贴(CTRL+V)
  9. 按住 CTRL,每次将光标向上移动一步,直到光标的位置与上面步骤 1) 之后的位置相似。
  10. 停止录制(使用 Word 时)。

表格的最后一行已被提取成两个单独的“表格”,每个表格一个单元格。

现在为宏指定一个快捷键,您就可以开始运行了:这里最简单的方法就是坐下来,等着宏“吃掉”桌子。对于大桌子,可能需要几分钟,如果桌子更大,则需要更长时间。

相关内容