다음과 같은 테이블이 있는 경우:
A B
C D
E F
셀 B를 제거하면 모든 셀이 다음과 같이 A쪽으로 한 위치 이동하기를 원합니다.
A C
D E
F
이것을 달성하는 방법은 무엇입니까? 또한 그 반대를 얻는 방법 - 단일 셀을 어딘가에 삽입하고 다른 모든 셀을 한 곳으로 이동시키는 방법은 무엇입니까?
답변1
며칠 전에 크네즈밀로스가 요청한 것과 같은 것이 필요했는데, 할 만한 것을 찾지 못했습니다. 그래서 이를 수행하기 위해 VBA 매크로(Word 2016)를 만들었습니다. 매크로는 네 가지 방식으로 작동합니다.
- 테이블 끝까지 모든 셀을 오른쪽으로 이동합니다(Public Sub MoveCellsRight).
- 첫 번째 빈 셀(Public Sub MoveCellsRightFirstBlankCell)이 나올 때까지 모든 셀을 오른쪽으로 이동합니다.
- 테이블 시작 부분까지 모든 셀을 왼쪽으로 이동합니다(Public Sub MoveCellsLeft).
- 첫 번째 빈 셀(Public Sub MoveCellsLeftFirstBlankCell)이 나올 때까지 모든 셀을 왼쪽으로 이동합니다.
이 매크로하지 않을 것이다:
- 셀 내부의 테이블로 작업합니다.
- 분할된 셀로 작업합니다(모든 행에는 동일한 수의 열이 있어야 함).
- 셀의 형식을 유지합니다. (누군가가 이 기능을 추가하여 이 매크로를 개선해 주기를 바랍니다.)
매크로는 다음과 같습니다.
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
답변 시도:
다음에 매크로를 작성하세요.
- 테이블 아래 테이블의 마지막 셀에 대한 별도의 복사본을 생성하고,
- 복사한 셀을 테이블에서 제거하고,
- 반복을 준비하려면 커서를 마지막 남은 셀로 다시 이동하세요.
테스트한 다음 테이블 간 정렬을 위해 테두리 간격을 제거하고
테두리 렌더링을 조정하여 작동하는 디자인/외관을 얻으세요.
(이것을 시도하지 않았습니다)
매크로 기록에 도움이 되도록 LibreOffice(v5.1.6.2) Writer에서 시도해 보세요.
참고: 나는 이것을 Write에 기록하려고 시도하는 것이 아니라 Write와 동일한 키 바인딩이 있다고 가정하고 Word에서 어떻게 작동하는지 보여줍니다. 지금은 Word에 액세스할 수 없습니다. 이것은 문제에 적용하기 위한 THINKING의 예이며, Q에 대한 구체적인 답변을 시도하는 것이 아닙니다.
메뉴 > 표 > 표 삽입(CTRL+F12), 기본값은 2x2 표...
최소한 셀의 마지막 두 행에 텍스트 줄을 입력하십시오.
테이블을 종료하려면 커서를 아래로 누르고, 테이블과 붙여넣기할 붙여넣기 사이에 행을 하나 이상 추가하려면 Enter 키를 누르세요.
이제 아래 설명은 "고급"처럼 보일 수 있지만 실제 작업은 그렇지 않습니다.
기록은 셀의 마지막 행이 복사된 위치부터 시작되어야 합니다. 그래서:
- CTRL을 누른 채 커서를 위로 두 번 누르십시오.
커서는 이제 오른쪽 셀의 왼쪽 상단, 테이블의 마지막 줄(시작점)에 있습니다. - 녹음 시작(Word에서 사용하는 경우)
- 메뉴 > 테이블 > 테이블 분할을 선택합니다.
(마지막 테이블 행이 별도의 테이블로 분할됩니다.) - 이제 CTRL과 SHIFT를 누른 상태에서 End를 두 번 누릅니다.
단일 행 2열 테이블의 오른쪽 셀 전체를 선택하여 씁니다. - CTRL을 누른 상태에서 X를 누르면 내용이 잘립니다.
- CTRL+SHIFT를 누른 상태에서 Home을 누르십시오.
두 셀이 모두 선택되었습니다. - 메뉴 > 표 > 셀 병합을 선택합니다.
- 커서를 두 줄 아래로 이동하고 붙여넣기(CTRL+V)
- Ctrl 키를 누른 채 위의 1) 단계 이후와 비슷하게 커서가 배치될 때까지 커서를 한 번에 한 단계 위로 이동합니다.
- 녹음을 중지합니다(Word 사용 시).
테이블의 마지막 행은 각각 하나의 셀이 있는 두 개의 별도 "테이블"로 추출되었습니다.
이제 매크로에 바로가기 키를 지정하면 실행할 수 있습니다. 여기서 간단한 것은 매크로가 테이블을 "먹어버리는" 동안 그 키를 누르고 있는 것입니다. 큰 테이블의 경우 몇 분 정도 걸릴 수 있으며, 더 큰 경우에는 더 길어질 수 있습니다.