본문 바로가기
WeekdayLife/powerpoint

[파워포인트VBA] 글상자 줄간격(spacing) 맞추기

by JO_i 2024. 8. 28.
글 상자의 줄간격

이와 관련된 용어나 단어가 많은데, 그냥 내맘대로 정의하고 적었음을 미리 밝힌다.

파워포인트의 글 상자에서 행간의 줄간격을 여느 워드프로그램처럼 두가지 유형이 있다.

line : 글 상자의 끝까지 와서, 다음 줄로 내려갔거나, Shift + Enter를 친 상태
paragraph : 문단으로 그냥 Enter 친 상태

 

파워포인트는 워드프로그램처럼 공간이 정형화되어있지 않아서, 이에 대한 다양한 방법이 있을 수 있다. 글상자를 마치 문단처럼 배치를 할 수도 있고, 글상자 안에서 줄간격을 설정해줄 수 있다.

개인적으로는 Enter를 두번 친 다음 빈공간의 폰트크기를 조절해서 사용하는 방법을 선호한다. 그 이유는 폰트크기를 늘렸다 줄였다 하면서, 직관적으로 줄간격이 적당한지 바로 확인이 가능하기 때문이다.

 

위에 적었 듯 파워포인트에는 문단 또는 줄간격을 맞추는 기능이 있는데, 이를 사용하는 것이 바람직한 방법이긴 할 것이다. 하지만, 창으로 뜨는 관계로 확인을 눌러 적용하기 전까지는 수치 변경에 대해서 즉각적인 확인이 불가능해서, 개인적으로는 별로 좋아하지는 않는 방법이지만, 일단은 알아두는 것이 좋을 것이다.

창의 생김새는 아래와 같으나, 맨 하단에 있는 줄간격 조정 기능인 Spacing 만 사용해보자. 두개의 영역으로 구분되어 있으며, Before/After 기능으로 엔터를 쳤을때 구분이 지어지는 문단(Paragraph)의 간격을 조정하고, (Shift + Enter 를 치거나 줄이 길어져 하단으로 내려갈 때는 적용되지 않는다.) Line Spacing 기능으로 모든 간격을 조정하는 줄간격 기능으로 나누어진다.

 

줄간격 설정 창
줄간격 설정 창

 

 

아래 그림은 아무것도 설정하지 않은 상태이다. 줄간격이 빽빽해 보이므로 조정이 필요한 상황이다. 폰트마다 기본으로 주어지는 줄간격이 다르므로, 본인이 자주쓰는 폰트에 대한 이해가 필요하다.

 

줄간격이 적용되지 않은 상태
줄간격이 적용되지 않은 상태

 

 

일단 전체 줄간격을 일괄로 맞추기 위해, paragraph든 line이든 모든 행에 적용되는 Line spacing 기능을 통해 전체 간격을 정해준다. Exactly 옵션을 주고 18pt 값을 넣은 결과는 아래와 같다. Exactly 옵션은 절대값으로 간격을 준다는 뜻이므로, 폰트 사이즈가 변하면 매번 설정값을 바꿔줘야 한다.

 

줄간격 설정 예시
줄간격 설정 예시

 

 

이제 Enter로 구분된 paragraph만 별도의 줄간격 주기 위해 After값을 12pt로 주었다. 알겠지만, before값을 같이 주면 위아래 텍스트가 있는 경우, 합산이 된 만큼 떨어진다. After 값을 적용한 결과는 아래와 같다. 한결 보기 편해졌다.

 

줄간격 설정 예시

 

 

파워포인트에서는 글을 저렇게 적을 일이 많지는 않겠지만... 실시간으로 보면서 수정할 수 있는 기능이 있었으면 좋을 것 같다는 생각이 들었다.

눈으로 확인하면서 줄간격 맞추기

대충 떠오르는데로 만들어본 사용자 폼은 다음과 같다.

- 줄간격이 설정되어있지 않은 상태에서, 글상자를 선택하고 코드를 호출하면 위의 예시에서 사용했던 값이 자동 설정된다. (Spacing - 12pt, Line Spacing - Exactly 18pt)
- spin 버튼으로 Spacing 값고, Line Spacing 값을 1단위로 가감할 수 있다.
- userform 창을 닫으면 그대로 적용
- 맨 아래 Reset & Close 버튼을 누르면, 줄간격이 설정되지 않은 상태로 복원

 

Spacing Userform 예시
Spacing Userform 예시

 

 

사용된 코드는 아래와 같다.

 

Public sp_shp As Shape
Public sp_after_textbox As TextBox
Public sp_line_textbox As TextBox
Public sp_para As ParagraphFormat2
Public sp_val_after As Integer
Public sp_val_line As Integer


Sub UserForm_Initialize()

    Call sp_initTextBox

    Set sp_after_textbox = TextBox1
    Set sp_line_textbox = TextBox2
    Set sp_para = sp_shp.TextFrame2.TextRange.ParagraphFormat

    With sp_para
        .SpaceAfter = 12
        .LineRuleWithin = False
        .SpaceWithin = 18
    End With

    sp_val_after = sp_para.SpaceAfter
    sp_val_line = sp_para.SpaceWithin

    sp_after_textbox = sp_val_after
    sp_line_textbox = sp_val_line
   
   
End Sub

Sub sp_initTextBox()

    If ActiveWindow.Selection.Type = ppSelectionShapes Then
        Set sp_shp = ActiveWindow.Selection.ShapeRange(1)

        If Not (sp_shp.HasTextFrame) Then
            MsgBox "There is no TextFrame"
        End If
       
    End If

End Sub

'Spacing spin button

Sub after_spin_SpinUp()
   
    sp_val_after = sp_val_after + 1
    sp_para.SpaceAfter = sp_val_after
   
    sp_after_textbox.Text = sp_val_after
   
End Sub

Sub after_spin_SpinDown()

    If sp_val_after > 1 Then
       
        sp_val_after = sp_val_after - 1
        sp_para.SpaceAfter = sp_val_after
       
    Else
        MsgBox "Value must be above 1"
       
    End If
   
    sp_after_textbox.Text = sp_val_after
   
End Sub

'Line Spacing spin button

Sub line_spin_SpinUp()
   
    sp_val_line = sp_val_line + 1
    sp_para.SpaceWithin = sp_val_line
   
    sp_line_textbox.Text = sp_val_line
   
End Sub

Sub line_spin_SpinDown()

    If sp_val_line > 1 Then
       
        sp_val_line = sp_val_line - 1
        sp_para.SpaceWithin = sp_val_line
       
    Else
        MsgBox "Value must be above 1"
       
    End If
   
    sp_line_textbox.Text = sp_val_line
   
End Sub

Sub CommandButton1_Click()

    With sp_para
        .SpaceAfter = 0
        .LineRuleWithin = True
        .SpaceWithin = 1
    End With
   
    Unload Me
   
End Sub

 

 

여러가지 기능을 넣어두려다가 일단 필요한 부분만 먼저 작성을 했다.

위의 코드를 이해할 필요는 없지만, 좀 재밌는 부분이 있다. 아래는 좀 디테일한 내용을 작성해보았다. 필요한 사람만 보길 바란다.

 

 

좀 더 이해를 하고 나서 개선

 

각 항목별로 속성값이 두 개씩 있는데, Rule 적용 여부 Boolean 값과 이에대한 값을 가지는 속성이 있다.

희한한건 Before와 After는 LineRule의 용도를 모르겠다. 그래서 그냥 배제를 한다. 속성값을 False로 두자. Within 값을 False로 두는 경우, SpaceWithin값은 pt값이 들어가고, True로 둘 경우 배수가 된다.

 

Case After Within
LineRuleAfter SpaceAfter LineRuleWithin SpaceWithin
After 5, Within 12 False 5 False(0) 12
After 5, Within single False 5 True(-1) 1
After 5, Within double False 5 True(-1) 2
After 5, Within multiple False 5 True(-1) 3

 

 

이를 활용하여 좀더 진보한 userform을 만들 수 있다. 텍스트 박스를 선택하여 refresh하고 유형을 변경할 수 있도록 해보았다.

 

Space Userform 개선판
Space Userform 개선판

 

 

급하게 생각한 코드는 아래와 같다. 필요한 부분이 있다면 잘라서 쓰면 될 것이다.

 

Public sp_shp As Shape
Public sp_para As ParagraphFormat2

Sub UserForm_Initialize()

    On Error GoTo dd:

    Call sp_selbox
    Call sp_boxtext
   
    TextBox1.Text = sp_para.SpaceAfter
    TextBox2.Text = sp_para.SpaceWithin

dd:
End Sub

Sub sp_selbox()

    If ActiveWindow.Selection.Type = ppSelectionShapes Then
       Set sp_shp = ActiveWindow.Selection.ShapeRange(1)
       Set sp_para = sp_shp.TextFrame2.TextRange.ParagraphFormat
    End If

End Sub

Private Sub CommandButton3_Click()

    sp_para.LineRuleWithin = Not sp_para.LineRuleWithin
    Call sp_boxtext

    sp_para.SpaceWithin = 1
    TextBox2.Text = sp_para.SpaceWithin

End Sub


Sub sp_boxtext()

    If sp_para.LineRuleWithin = True Then
        TextBox3 = "X lines"
    Else:
        TextBox3 = "Exactly"
    End If  

End Sub


'Spacing spin button

Sub line_after_SpinUp()
   
    sp_para.SpaceAfter = sp_para.SpaceAfter + 1
    TextBox1.Text = sp_para.SpaceAfter
   
End Sub


Sub line_after_SpinDown()

    If sp_para.SpaceAfter > 0 Then
        sp_para.SpaceAfter = sp_para.SpaceAfter - 1
        TextBox1.Text = sp_para.SpaceAfter
    Else
        MsgBox "Value must be above 0"
       
    End If
   
End Sub


'Line Spacing spin button

Sub line_within_SpinUp()

    sp_para.SpaceWithin = sp_para.SpaceWithin + 1
    TextBox2.Text = sp_para.SpaceWithin
   
End Sub

Sub line_within_SpinDown()
    If sp_para.SpaceWithin > 1 Then
        sp_para.SpaceWithin = sp_para.SpaceWithin - 1
        TextBox2.Text = sp_para.SpaceWithin
    Else
        MsgBox "Value must be above 1"
    End If
End Sub

'reset

Sub CommandButton1_Click()
   
    Call UserForm_Initialize
   
End Sub


Sub CommandButton2_Click()

    With sp_para
        .SpaceAfter = 0
        .LineRuleWithin = True
        .SpaceWithin = 1
    End With
   
    Unload Me
   
End Sub

 

 

간만에 오랜만에 약간 생각이란걸 하는 코드를 만들어보았다.

 

끝.