위처럼 빈칸채우기 문제에서 문장의 특정부분을 빈칸으로 가려놓고 누르면 정답을 보여주게
빈칸 도형을 일괄로 자동 추가해주는 매크로입니다.
노란색 둥근 네모도형에 사라지는 애니메이션효과를 주고 트리거를 자기자신으로 지정하면 됩니다.
하나를 만들고 계속 복사하면 효과가 그대로 유지됩니다.
그런데 이런 버튼 만드는 과정을 좀더 편하게 미리 문장에 [ 빈칸 ] 만 추가해 놓으면 그 위치에 자동으로 빈칸도형을 일괄 생성해주는 것입니다.
일단 텍스트박스에서 빈칸이 들어갈 부분에 [ 빈칸 ]을 좌우에 추가하고 텍스트박스를 선택하거나
슬라이드 1개 또는 여러개의 슬라이드를 선택하고 Alt-F8 매크로를 실행합니다.
AddBlank 매크로는 빈칸도형을 추가하고 뒤에 숨은 답은 진한 노란색으로 바꿔주고
DelBlanks 는 현재 선택된 텍스트박스나 슬라이드들에서 모든 빈칸 도형을 삭제해줍니다.
눌렀을 때 셔터효과음도 추가됩니다.
빈칸 도형 추가 결과입니다.
한 슬라이드만 선택되거나 한개의 텍스트박스만 선택되어 있으면 해당 개체내의 문장에 빈칸 도형을 추가합니다.
아래는 실행화면입니다.
매크로 소스입니다.
더보기
'//텍스트박스에 모든 [괄호]안에 빈칸도형을 생성하고 클릭시 사라지는 효과를 자동 추가
Option Explicit
Sub AddBlank()
Dim sld As Slide
Dim shp As Shape
On Error Resume Next
If ActiveWindow.Selection.SlideRange Is Nothing Then _
MsgBox "먼저 슬라이드를 선택하세요.": Exit Sub
If ActiveWindow.Selection.ShapeRange Is Nothing Then
For Each sld In ActiveWindow.Selection.SlideRange
For Each shp In sld.Shapes
AddBlankAnim shp
Next shp
Next sld
Else
For Each shp In ActiveWindow.Selection.ShapeRange
AddBlankAnim shp
Next shp
End If
On Error GoTo 0
End Sub
Function AddBlankAnim(oShp As Shape)
Dim oSld As Slide
Dim str As String
Dim i As Integer, k As Integer, b1 As Long, b2 As Long
Dim x$, y$, w$, h$, lineSpace$
Dim blank As Shape, spkr As Shape
Dim eft As Effect
Dim margin As Single '// 빈칸 도형의 여백
Set oSld = oShp.Parent
If oShp.HasTextFrame Then
With oShp.TextFrame.TextRange
str = .Characters.Text
For i = 1 To Len(str)
'// 문자 "["가 있는 경우 "]"까지의 문자 위치를 알아냄
If .Characters(i) = "[" Then
b1 = i + 1
'Debug.Print .Characters(b1, Len(str) - b1).Text
b2 = InStr(.Characters(b1, Len(str) - b1).Text, "]")
If b2 > 0 Then
'// 문자열 시작위치부터 마지막 위치까지 계산
b2 = b2 - 1
'// Debug.Print b1, b2, .Characters(b1, b2).Text
'// 빈칸속 정답 색깔 변경
.Characters(b1, b2).Font.Bold = msoTrue
.Characters(b1, b2).Font.Color.RGB = rgbOrange
b2 = b1 + b2 - 1
x = .Characters(b1).BoundLeft
margin = (.Characters(b1).ParagraphFormat.SpaceWithin - 1) * 15
lineSpace = (.Characters(b1).ParagraphFormat.SpaceWithin - 1) * .Characters(b1).Font.Size
y = .Characters(b1).BoundTop + margin + lineSpace / 2
w = .Characters(b2).BoundLeft + .Characters(b2).BoundWidth - x
h = .Characters(b2).BoundHeight - (margin * 2.5)
'- IIf(.Characters(b2).BoundTop >= .Lines(.Lines.Count).BoundTop, 0, lineSpace / 2)
'//ActiveWindow.Selection.ShapeRange(1).TextFrame.TextRange.Characters(11).Font.Size
'//도형 추가
Set blank = oSld.Shapes.AddShape(msoShapeRoundedRectangle, x, y, w, h)
k = k + 1
With blank
.Name = "Blank_" & oShp.Name & "_" & k
.Fill.ForeColor.RGB = rgbOrange
.Line.Visible = msoFalse
.Adjustments(1) = 0.1
End With
'//Trigger 애니메이션 추가
Set eft = oSld.TimeLine.InteractiveSequences.Add().AddTriggerEffect( _
blank, msoAnimEffectGrowAndTurn, msoAnimTriggerOnShapeClick, blank)
eft.Exit = msoTrue 'disappear
eft.Timing.Duration = 0.25
'//사운드 복사 후 효과 추가
'eft.EffectInformation.SoundEffect.ImportFromFile _
ActivePresentation.Path & Chr(92) & "shutter.wav"
If Not ShpExist(oSld, "Shutter") Then
ActivePresentation.Designs(1).SlideMaster.CustomLayouts(3).Shapes("Shutter").Copy
oSld.Shapes.Paste
'Set spkr = oSld.Shapes.AddMediaObject2( _
ActivePresentation.Path & Chr(92) & "shutter.wav", msoFalse, msoTrue)
End If
Set spkr = oSld.Shapes("Shutter")
Set eft = oSld.TimeLine.InteractiveSequences.Add().AddTriggerEffect( _
spkr, msoAnimEffectMediaPlay, msoAnimTriggerOnShapeClick, blank)
eft.Timing.TriggerType = msoAnimTriggerWithPrevious
End If
End If
Next i
End With
End If '//if hasTextFrame
End Function
Function setTrigger(oShp As Shape, tShp As Shape)
Dim sld As Slide
Dim eft As Effect
Dim iSeq As Sequence
Dim i As Integer
Set sld = oShp.Parent
For Each iSeq In sld.TimeLine.InteractiveSequences
For i = 1 To iSeq.Count
With iSeq.Item(i)
If .Shape = oShp Then
Debug.Print ">>", .Index, .Shape.Name, .Timing.TriggerShape
.Timing.TriggerShape = tShp
End If
End With
Next i
Next iSeq
End Function
Function ShpExist(oSld As Slide, shpName As String) As Boolean
Dim shp As Shape
ShpExist = False
For Each shp In oSld.Shapes
If shp.Name = shpName Then ShpExist = True: Exit Function
Next shp
End Function
Sub delBlanks()
Dim sld As Slide
Dim i As Long, k As Long
On Error Resume Next
If ActiveWindow.Selection.SlideRange Is Nothing Then _
MsgBox "먼저 슬라이드를 선택하세요.": Exit Sub
On Error GoTo 0
For Each sld In ActiveWindow.Selection.SlideRange
For i = sld.Shapes.Count To 1 Step -1
If sld.Shapes(i).Name Like "Blank_*" Or sld.Shapes(i).Name Like "Shutter*" Then _
k = k + 1: sld.Shapes(i).Delete
Next i
Next sld
If k Then MsgBox k & "개의 빈칸 도형 삭제 완료", vbInformation + vbOKOnly
End Sub
(셔터효과음은 pptm내에 포함되어 있지만 삭제된 경우를 위해 첨부합니다.)
테이블(표)의 셀 내부에 빈칸이 있는 경우
(빈 칸이 두줄이상으로 이어지는 경우는 반영하지 못했습니다.)
'PPT+VBA' 카테고리의 다른 글
슬라이드의 테이블(표)과 차트의 데이터 연동시키기 (1) | 2020.10.08 |
---|---|
일괄로 일정한 틀의 이미지 대량 생성 (2) | 2020.08.28 |
[WordScatter] 슬라이드에 랜덤 단어 흩뿌리기 (2) | 2020.08.02 |
슬라이드 구역별로 페이지 번호 삽입 (1) | 2020.07.24 |
유투브 영상 삽입 후 에러(온라인 비디오가 현재 차단되어 있습니다. Online videos are currently blocked.) 해결 방법 (0) | 2020.06.16 |
[Split TextBox] 텍스트박스 자동 분할 (2) | 2020.04.02 |
파워포인트 2019에서 달라진, 추가된 기능들 요약 (0) | 2020.04.01 |
도넛모양 다이아그램 만들기 (0) | 2020.03.11 |
최근댓글