글목록

2022년 2월 12일

PowerPoint 매크로 - 그림 파일 일괄 삽입하고 Label 붙이기 (대체 텍스트 이용)

슬라이드에 여러 개의 파일을 불러오는 방법으로, 리본 메뉴의 '삽입 → 그림' 버튼을 이용하거나, 파일 탐색기에서 여러 개의 파일을 슬라이드에 끌어놓게 되면 한꺼번에 삽입이 가능합니다.

그러나, 간혹 비슷하게 생긴 사진을 읽어 오는 경우가 있습니다. 예를 들어, 동일한 실험 샘플을 매일 1장씩 찍어서 시간 경과에 따른 변화를 확인한다거나, 형상이 동일한 여러 개의 샘플을 찍어서 한꺼번에 삽입하려고 하는 경우가 있습니다. 비록 원본 파일명에는 무슨 사진인지 구분이 되어 있지만, 사진을 Powerpoint나 Excel에 삽입하고 나면, 원본 파일명이 무엇이었는지 알 수가 없습니다. 사진 배치를 하거나, 불필요한 것들은 삭제하는 등 몇가지 작업을 거치다 보면, 사진에 이름이 표기되어 있지 않아 몇 번째 사진이었는지 헛갈리게 되고, 원본과 다시 대조해야 하는 사태가 벌어지기도 합니다. 만약 수십~수백장의 사진으로 작업해야 한다면 사진 파일 정리만 하루 종일 걸리는 문제가 있습니다.

예전 MS Office 2003 버전까지는 파일을 끌어놓거나 삽입하게 되면, 원본의 정보(예를 들어, 파일명이나 인터넷 주소 등)가 자동으로 기입되어 있었습니다. 오히려 이런 원본 정보를 삭제하는 것이 귀찮았던 것으로 기억합니다. 그러나, 2007 버전 이후로 끌어놓기나, 개체 삽입 방법으로는 원본 정보가 남지 않아 많은 파일 작업을 할 때 헛갈리는 문제가 있습니다. 따라서, 그림 파일을 삽입할 때 원본 정보를 남겨주면 좋을 것 같아서 아래와 같은 매크로를 작성해두었습니다.

아래의 매크로를 이용하여 그림을 삽입하게 되면, 그림의 '서식 → 대체 텍스트' 안에 파일명을 기입해줍니다. 필요하면 옵션을 설정하여 파일명을 텍스트 박스로 만들어 원본 그림과 그룹화시키는 방식으로 슬라이드에 그림과 label을 덧붙이는 방식을 사용할 수 있습니다. 배열 작업이 끝나고 나서 그룹화된 텍스트 박스는 삭제하더라도 각 사진마다 대체 텍스트에는 여전히 파일명이 기록되어 있습니다.


'----------------------------------------
Sub OpenPictures()
  On Error GoTo ErrorHandler
  Dim tFN, tStr As String, tFNS() As String, tSplit, tSh() As Shape, tLabel As Boolean, tSlide As Slide, tGapX As Single, tGapY As Single, tX As Long, tY As Long, tN As Long
  Set tSlide = ActiveSlide
  '그림파일을 선택할 수 있도록 대화상자를 호출합니다.
  With ActiveWindow.Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = True
    .Filters.Clear
    .Filters.Add "모든 파일", "*.*"
    .Filters.Add "모든 그림", "*.emf;*.wmf;*.jpg;*.jpeg;*.jfif;*.jpe;*.png;*.bmp;*.dib;*.rle;*.gif;*.emz;*.wmz;*.pcz;*.tif;*.tiff;*.eps;*.pct;*.pict;*.wpg"
    .FilterIndex = 2
    .Show
    Set tFN = .SelectedItems
  End With

  '파일명을 슬라이드에서 바로 확인할 수 있도록 텍스트 박스를 추가하고 그룹화하여 label을 붙여줄 것인지 확인합니다.
  tLabel = (MsgBox("삽입된 그림마다 파일명 라벨을 표시하시겠습니까?" & vbCrLf & "라벨을 표시하지 않더라도 '그림 서식'→'대체 텍스트'에 파일명을 표시합니다.", vbYesNo, "라벨 표시") = vbYes)

  'tFN()에는 선택된 모든 파일의 전체 경로를 저장하고, tFNS()에는 확장자를 제외한 파일명을 저장합니다. VB 에디터의 참조에서 Scripting Runtime을 추가하면 파일명만 추출하는 것이 용이해집니다만, 여기에서는 별도의 참조를 추가하지 않은 상태로 파일명만 추출하도록 하겠습니다.
  ReDim tFNS(1 To tFN.Count)
  For i = 1 To tFN.Count
    tStr = tFN(i)
    tSplit = Split(tStr, "\")
    tStr = tSplit(UBound(tSplit))
    tSplit = Split(tStr, ".")
    If UBound(tSplit) > 0 Then
      tStr = Left(tStr, Len(tStr) - Len(tSplit(UBound(tSplit))) - 1)
    End If
    tFNS(i) = tStr
  Next

  '파일탐색기에서 드래그&드롭으로 그림을 삽입하거나, 메뉴의 그림 삽입으로 삽입된 그림은 모두 슬라이드 중앙에 중복해서 삽입됩니다만, 현재의 매크로를 이용하는 경우, 그림의 위치를 약간씩 이동하여 cascade 형태로 삽입하도록 합니다. 그림의 갯수가 많으면 n x n 형태의 사각형으로 배열시킵니다.
  ReDim tSh(1 To 2)
  tX = 0: tY = 0: tN = -Int(-Sqr(tFN.Count)): If tN = 0 Then tN = 1
  For i = 1 To tFN.Count
    tX = (i - 1) Mod tN
    tY = Int((i - 1) / tN)
    Set tSh(1) = tSlide.Shapes.AddPicture(tFN(i), msoFalse, msoTrue, ActivePresentation.PageSetup.SlideWidth * 0.05 + tX * tGapX, ActivePresentation.PageSetup.SlideHeight * 0.05 + tY * tGapY)
    If i = 1 Then
      If tN > 1 Then tGapX = (ActivePresentation.PageSetup.SlideWidth * 0.9 - tSh(1).Width) / (tN - 1)
      If -Int(-tFN.Count / tN) > 1 Then tGapY = (ActivePresentation.PageSetup.SlideHeight * 0.9 - tSh(1).Height) / (-Int(-tFN.Count / tN) - 1)
    End If
  '삽입된 그림의 대체 텍스트에 파일명을 기입하기 위해 Shape의 Title에 파일명을 입력해줍니다.
    tSh(1).Title = tFNS(i)
  '슬라이드의 그림에 label을 붙이기 위해서는 Textbox를 추가해주고, 해당 그림의 중앙에 배열한 후 그룹화시켜줍니다. label의 서식은 사용자가 적당히 조정하시면 됩니다.
    If tLabel Then
      Set tSh(2) = tSlide.Shapes.AddTextbox(msoTextOrientationHorizontal, tSh(1).Left + tSh(1).Width / 6, tSh(1).Top + tSh(1).Height / 3, tSh(1).Width * 2 / 3, tSh(1).Height / 3)
      With tSh(2).TextFrame
        .VerticalAnchor = msoAnchorMiddle
        .TextRange.ParagraphFormat.Alignment = ppAlignCenter
        .TextRange.Font.Size = 10
        .TextRange.Text = tFNS(i)
      End With
  '그룹화된 그림은 가로/세로 비율을 유지하도록 합니다. 만약 비율을 고정하지 않으면 사진이 포함된 그룹일지라도 크기를 변경할 때 가로/세로 비율이 변경될 수 있습니다.
      With GetShapeRange(tSlide, tSh)
        .Group
        .LockAspectRatio = msoTrue
      End With
    End If
  Next
ErrorHandler:
  Erase tSh, tFNS
End Sub


댓글 없음:

댓글 쓰기

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

많이 본 글 :