제거/삽입 후 Microsoft Word 2013의 표에서 셀을 한 위치로 이동하는 방법은 무엇입니까?

제거/삽입 후 Microsoft Word 2013의 표에서 셀을 한 위치로 이동하는 방법은 무엇입니까?

다음과 같은 테이블이 있는 경우:

A B
C D
E F

셀 B를 제거하면 모든 셀이 다음과 같이 A쪽으로 한 위치 이동하기를 원합니다.

A C
D E
F

이것을 달성하는 방법은 무엇입니까? 또한 그 반대를 얻는 방법 - 단일 셀을 어딘가에 삽입하고 다른 모든 셀을 한 곳으로 이동시키는 방법은 무엇입니까?

답변1

며칠 전에 크네즈밀로스가 요청한 것과 같은 것이 필요했는데, 할 만한 것을 찾지 못했습니다. 그래서 이를 수행하기 위해 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에 기록하려고 시도하는 것이 아니라 Write와 동일한 키 바인딩이 있다고 가정하고 Word에서 어떻게 작동하는지 보여줍니다. 지금은 Word에 액세스할 수 없습니다. 이것은 문제에 적용하기 위한 THINKING의 예이며, Q에 대한 구체적인 답변을 시도하는 것이 아닙니다.

메뉴 > 표 > 표 삽입(CTRL+F12), 기본값은 2x2 표...

최소한 셀의 마지막 두 행에 텍스트 줄을 입력하십시오.

테이블을 종료하려면 커서를 아래로 누르고, 테이블과 붙여넣기할 붙여넣기 사이에 행을 하나 이상 추가하려면 Enter 키를 누르세요.

이제 아래 설명은 "고급"처럼 보일 수 있지만 실제 작업은 그렇지 않습니다.

기록은 셀의 마지막 행이 복사된 위치부터 시작되어야 합니다. 그래서:

  1. CTRL을 누른 채 커서를 위로 두 번 누르십시오.
    커서는 이제 오른쪽 셀의 왼쪽 상단, 테이블의 마지막 줄(시작점)에 있습니다.
  2. 녹음 시작(Word에서 사용하는 경우)
  3. 메뉴 > 테이블 > 테이블 분할을 선택합니다.
    (마지막 테이블 행이 별도의 테이블로 분할됩니다.)
  4. 이제 CTRL과 SHIFT를 누른 상태에서 End를 두 번 누릅니다.
    단일 행 2열 테이블의 오른쪽 셀 전체를 선택하여 씁니다.
  5. CTRL을 누른 상태에서 X를 누르면 내용이 잘립니다.
  6. CTRL+SHIFT를 누른 상태에서 Home을 누르십시오.
    두 셀이 모두 선택되었습니다.
  7. 메뉴 > 표 > 셀 병합을 선택합니다.
  8. 커서를 두 줄 아래로 이동하고 붙여넣기(CTRL+V)
  9. Ctrl 키를 누른 채 위의 1) 단계 이후와 비슷하게 커서가 배치될 때까지 커서를 한 번에 한 단계 위로 이동합니다.
  10. 녹음을 중지합니다(Word 사용 시).

테이블의 마지막 행은 각각 하나의 셀이 있는 두 개의 별도 "테이블"로 추출되었습니다.

이제 매크로에 바로가기 키를 지정하면 실행할 수 있습니다. 여기서 간단한 것은 매크로가 테이블을 "먹어버리는" 동안 그 키를 누르고 있는 것입니다. 큰 테이블의 경우 몇 분 정도 걸릴 수 있으며, 더 큰 경우에는 더 길어질 수 있습니다.

관련 정보