글목록

2022년 1월 24일

PowerPoint 매크로 - 문자 간격 조절하기

파워포인트 작업을 하다 보면, 텍스트박스 또는 표에 여러 줄이 포함되는 경우, 몇글자 때문에 줄넘김이 발생되면, 문자 간격을 줄여서라도 1줄로 맞추고 싶을 때가 종종 있습니다.

특히 보고서 작성하다보면, 이런 문장들 때문에 페이지를 넘기기도 애매해서 문자 간격을 줄여서 맞췄는데, 단어 수정을 하다보면 이런 작업을 무수히 반복하는 경우가 있습니다. 1줄 정도면 수작업으로 반복해도 괜찮겠지만, 여러줄을 반복해야 한다면 이 또한 번거로운 작업이지요.

게다가, 파워포인트에서 글꼴 옵션을 열어, 문자간격을 조정하면 슬라이드에 바로 반영되지 않고, 옵션창에 확인을 눌러 끄고 나야 반영됩니다. 문자 간격이 적절하지 않으면 다시 글꼴 옵션을 열어 문자 간격을 조절합니다. 이러한 사소한 작업 때문에 불필요한 시간 낭비가 발생하게 되죠.

파워포인트에 여러 줄의 문장을 선택한 후, 아래의 매크로를 실행하게 되면, 각각의 줄을 1줄짜리 문장이 되도록 문자 간격을 조절하는 매크로입니다. 여기에서 1줄짜리 문장이란 줄바꿈(enter 혹은 shift-enter로 잘린 영역)으로 구분된 영역을 의미합니다.


------------------------------------------------------------

Sub 문자간격조절()
  On Error GoTo ErrorHandler
  Dim i As Long, j As Long, n As Long, tTR As TextRange2, tTR2 As TextRange2, tLine() As TextRange2
  Dim tStr As String, tLN As Long, tSN As Long, tCheck As Boolean, tSp As Single, tSpL As Single
  '슬라이드에서 선택된 텍스트를 변수에 지정해줍니다. 슬라이드에서 문자열을 선택할 때, TextRange와 TextRange2 모두 지정가능하나, 폰트의 다양한 옵션을 설정하려면 TextRange2로 지정해줍니다.
  Set tTR = ActiveWindow.Selection.TextRange2
  n = 0  '문장의 갯수를 카운트할 변수입니다.

  'TextRange2 개체에서 Sentenses는 각각의 문장을 의미하며, 슬라이드에서 Enter키를 사용하여 구분된 영역이라고 생각하시면 됩니다. 그러나, Shift-Enter로 줄바꿈한 경우에는 단일 문장으로 판단하기 때문에 Shift-Enter로 구분된 문자열도 문장으로 나눠주기 위해 아래와 같이 문장을 나눠줍니다. 파워포인트에서는 Shift-Enter가 입력되면, Chr(11)이 삽입되어 줄바꿈을 해주게 됩니다.
  '선택된 문자열을 총 n개의 문장으로 나눠서 tLine()에 저장합니다.
  For i = 1 To tTR.Sentences.Count
    Set tTR2 = tTR.Sentences.Item(i)
    tStr = tTR2.Text
    tSN = 1
    For j = 1 To Len(tStr)
      If Mid(tStr, j, 1) = Chr(11) Then
        n = n + 1
        ReDim Preserve tLine(1 To n)
        Set tLine(n) = tTR2.Characters(tSN, j - tSN)
        tSN = j + 1
      End If
    Next
    n = n + 1
    ReDim Preserve tLine(1 To n)
    Set tLine(n) = tTR2.Characters(tSN, Len(tStr) - tSN + 1)
  Next
  
  '만약 선택된 문자열이 1개 문장이라면, 여러 행으로 된 문장일 수 있습니다. 예를 들어, 3줄짜리 문장을 간격을 줄여 2줄로 만들고 싶은 경우일 수 있습니다. 따라서, 몇줄로 맞출 것인지 물어봅니다.
  '만약 여러개 문장을 선택했다면, 각 문장을 1줄로 만들겠다는 것으로 간주합니다.
  If n = 1 Then
    tLN = tLine(1).Lines.Count - 1
    If tLN < 1 Then tLN = 1
    tStr = InputBox("몇줄로 맞추시겠습니까?", "줄 수 입력", tLN)
    If StrPtr(tStr) = 0 Or Val(tStr) < 1 Then GoTo ErrorHandler
    tLN = Val(tStr)
  Else
    tLN = 1
  End If
  
  '각각의 문장을 문자 간격을 0으로 바꿔준 후, 문자 간격을 0.1씩 줄여가면서 1개 줄이 되면 종료합니다. 문자 간격은 글꼴 크기의 1/5을 한계로 지정합니다. 지나치게 간격을 줄이게 되면 문자 겹침이 발생하기 때문에 보기가 좋지 않을 수 있습니다. 글꼴마다 차이가 있지만, 맑은 고딕 폰트에서는 약 1/7 정도까지는 글자 겹침이 없습니다. 사용환경에 따라 적당히 지정하시면 됩니다.
  '만약 문자 간격을 한계치까지 줄여도 1줄짜리 문장이 되지 않는다면, 작업이 불가능하다고 판단한 후, 초기의 문자 간격으로 되돌려줍니다.
  For i = 1 To n
    With tLine(i)
      tSp = .Font.Spacing
      tSpL = -.Font.Size / 5
      .Font.Spacing = 0
      tCheck = False
      Do
        If .Lines.Count > tLN Then
          .Font.Spacing = .Font.Spacing - 0.1
        Else
          tCheck = True
          Exit Do
        End If
      Loop Until .Font.Spacing < tSpL
      If Not tCheck Then .Font.Spacing = tSp
    End With
  Next
  
  '1문장인 경우, 문자 간격 조절이 실패했을 때, 글자크기를 줄여서 원하는 줄 수로 만들지 물어봅니다. Yes를 선택하면 글자크기를 0.5씩 줄여나가면서 원하는 줄 수로 만들어줍니다.
  If n = 1 And Not tCheck Then
    If MsgBox("문자간격 조절로 " & tLN & "줄로 만들 수 없습니다. 글자 크기를 줄이시겠습니까?", vbYesNo, "작업 확인") = vbYes Then
      With tLine(1)
        Do
          If .Lines.Count > tLN Then
            .Font.Size = .Font.Size - 0.5
          Else
            Exit Do
          End If
        Loop Until .Font.Size < 1
      End With
    End If
  End If
  
ErrorHandler:
  Erase tLine
End Sub
------------------------------------------------------------

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :