제목과 같이 특정 폴더 안의 여러개의 PPT 파일 안에서
사용자가 지정한 특정 단어가 들어있는지 검색하는 일종의 프로그램입니다.
위처럼 윈도우탐색기에서 .txt, .csv, .xlsx, .pptx, .html 등의 파일에 대해서는 내용 검색이 가능하지만
pptx 의 경우 어느 슬라이드에 해당 검색어가 있는지는 알 수없고 매크로 내용은 검색하지 않습니다.
이 프로그램은 특히 VBA 코드의 내용까지 포함하여 검색합니다.
파일이 여러개인데 사용된 문구가 들어간 파일, 슬라이드, 도형을 찾고 싶다든지
특정 코드를 사용했었는데 어디에 들어 있는지, 또 기존코드 내용을 참고하고 싶을 때 요긴하겠습니다.
검색어를 입력하고 PPT검색버튼을 누르면 위 처럼 폴더를 선택하는 창이 뜹니다.
선택한 폴더를 시작으로 하위폴더를 모두 검색합니다.
폴더와 파일이 많을수록 검색시간이 오래 걸립니다.
현재 검색하는 파일은 아래 엑셀 상태창에 보여줍니다.
검색결과를 아래와 같이 엑셀시트에 보여줍니다.
대상 파일의 전체경로와 파일명이 보이고 옆에 슬라이드번호와 개체이름이 나옵니다.
VBA에서 발견된 경우 VBAProject의 이름(Slide1 이나 Module1 같은)과 발견된 라인(행수)를 알려줍니다.
하이퍼링크를 누르면 발견된 위치를 직접 보여주는 것이 장점입니다.
만일 일반 슬라이드에서 발견되었다면 아래처럼 슬라이드를 열어서 해당개체를 선택해서
어디에 해당문자열이 있는지 알려줍니다.
만일 VBA코드에서 발견된 경우 VBE 창을 띄워서
해당 라인위치를 반전선택해서 해당 검색문자열이 정확히 어느 위치에 사용되었는지 알려줍니다.
아래 엑셀 매크로 파일을 받아 매크로컨텐츠허용해서 열고 테스트해보세요.
약간 수정된 버전입니다.(2021.03.18)
주의 사항:
1. 윈도우10에서는 C:\ 루트 폴더가 보안상 접근이 기본적으로 제한되어 있기 때문에
엑셀을 관리자로 실행해보세요. 아래처럼 엑셀 아이콘 우클릭하고 관리자 권한으로 실행하세요.
아니면 파일 개수가 많지 않은 특정 하위폴더를 대상으로 검색하는 것이 효율적입니다.
2. VBA코드까지 검색하기 때문에 PowerPoint 파워포인트 옵션-보안센터에서
'VBA프로젝트 개체에 안전하게 접속'할 수 있도록 옵션이 체크되어 있어야 합니다.
3. 검색되는 ppt 파일 자체에 제한이 되어 있지 않도록 외부에서 받은 파일은 차단해제를 하세요.
4. 파일자체에 오류가 있는 경우 검색을 위해 해당 파일을 열 때 오류가 발생할 수 있습니다.
오류가 발생하는 파일은 파워포인트에서 다시 열어보시기 바랍니다. 오류가 있는 경우 복구한 파일을 저장하고 기존 파일은 삭제해야 오류가 발생하지 않습니다.
매크로 내용 더보기:
'PPT 파일내 개체내에서 특정단어를 검색합니다.
'PPT, PPTx, PPSX, PPTM, PPSM 등 .*pp* 파일을 대상으로 합니다.
'검색 결과 해당된 파일의 해당슬라이드의 해당개체를 열어줍니다.
'그룹내의 도형도 검색합니다.
'by konahn(at)naver.com
Option Explicit
Sub SearchPPT()
Dim sht As Worksheet
Dim sFolder As String
Dim FSO As New FileSystemObject
Set sht = ActiveSheet
If [B1] = "" Then MsgBox "검색어를 입력하세요!": Exit Sub
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "검색을 시작할 폴더로 이동하고 '선택'버튼을 누르세요!"
.ButtonName = "현재 폴더 선택"
.InitialFileName = ThisWorkbook.Path & Chr(92)
If .Show = -1 Then sFolder = .SelectedItems(1)
End With
If sFolder = "" Then Exit Sub
[B2] = sFolder
sht.Hyperlinks.Delete
sht.UsedRange.Offset(2).ClearContents
On Error Resume Next
SearchFolder FSO.GetFolder(sFolder), [B1]
Application.StatusBar = False
End Sub
Function SearchFolder(oFolder As folder, str As String)
Dim subFolder As folder
Dim oFile As file
Dim pptApp As New PowerPoint.Application
Dim pptPres As PowerPoint.Presentation
Dim pptSld As PowerPoint.Slide
Dim pptShp As PowerPoint.Shape
Dim vbComp As VBIDE.VBComponent
Dim vbMod As VBIDE.CodeModule
Dim stline As Long
Dim sht As Worksheet
Dim rng As Range
For Each subFolder In oFolder.SubFolders
SearchFolder subFolder, str
Next subFolder
Debug.Print oFolder.Path & ":"
For Each oFile In oFolder.Files
Application.StatusBar = "Searching <" & oFile.Path & ">..."
If oFile.Name Like "*.pp*" And Not oFile.Name Like "*.ppa*" Then
Debug.Print "--- " & oFile.Path
Set pptPres = pptApp.Presentations.Open(oFile.Path, msoTrue, , msoFalse)
For Each vbComp In pptPres.VBProject.VBComponents
stline = 1
If vbComp.CodeModule.Find(str, stline, 1, -1, -1) Then
Debug.Print " --- Found in VBA code : " & vbComp.Name
Set sht = ActiveSheet
Set rng = sht.Cells(Rows.Count, 1).End(xlUp).Offset(1)
rng = rng.Row - 2
rng.Offset(, 1) = pptPres.FullName
rng.Offset(, 1).HorizontalAlignment = xlHAlignRight
rng.Offset(, 2) = vbComp.Name
rng.Offset(, 3) = stline
'sht.Hyperlinks.Add rng.Offset(, 1), pres.FullName
sht.Hyperlinks.Add rng.Offset(, 1), "", rng.Offset(, 1).Address
End If
Next vbComp
For Each pptSld In pptPres.Slides
Debug.Print "--- --- --- " & pptSld.SlideIndex & " ) Slide :"
For Each pptShp In pptSld.Shapes
SearchText pptShp, str
Next pptShp
Next pptSld
End If
Next oFile
End Function
Function SearchText(oShp As PowerPoint.Shape, oStr As String)
Dim pres As PowerPoint.Presentation
Dim shp As PowerPoint.Shape
Dim sht As Worksheet
Dim rng As Range
Debug.Print "--- --- " & oShp.Name
If oShp.Type = msoGroup Then
For Each shp In oShp.GroupItems
SearchText shp, oStr
Next shp
Else
If oShp.HasTextFrame Then
Debug.Print "--- --- """ & oShp.TextFrame.TextRange & """"
If oShp.TextFrame.TextRange Like "*" & oStr & "*" Then
Debug.Print "--- --- * found *"
Set pres = oShp.Parent.Parent
Set sht = ActiveSheet
Set rng = sht.Cells(Rows.Count, 1).End(xlUp).Offset(1)
rng = rng.Row - 2
rng.Offset(, 1) = pres.FullName
rng.Offset(, 1).HorizontalAlignment = xlHAlignRight
rng.Offset(, 2) = oShp.Parent.SlideIndex
rng.Offset(, 3) = oShp.Name
'sht.Hyperlinks.Add rng.Offset(, 1), pres.FullName
sht.Hyperlinks.Add rng.Offset(, 1), "", rng.Offset(, 1).Address
End If
End If
End If
End Function
'현재 통합 문서의 코드
Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink)
Dim pptApp As New PowerPoint.Application
Dim pres As PowerPoint.Presentation
Dim ppres As PowerPoint.ProtectedViewWindow
Dim sld As PowerPoint.Slide
Dim shp As PowerPoint.Shape
Dim sht As Worksheet
Dim rng As Range
Dim stline As Long
Set rng = Target.Range
Debug.Print rng.Value
If rng.Value Like "*.pps*" Then
Set ppres = pptApp.ProtectedViewWindows.Open(CStr(rng.Value))
Set pres = ppres.Edit
'Set pres = ppres.Presentation
'pptApp.ActiveWindow.ViewType = ppViewSlide
pptApp.ActiveWindow.SplitVertical = 90
pptApp.ActiveWindow.SplitHorizontal = 80
Else
Set pres = pptApp.Presentations.Open(rng.Value, , , msoTrue)
End If
If IsNumeric(rng.Offset(, 1)) Then
'If pptApp.SlideShowWindows.Count Then
'pres.SlideShowWindow.Activate
'pres.SlideShowWindow.View.GotoSlide CLng(rng.Offset(, 1))
'pres.SlideShowWindow.View.GotoClick pres.SlideShowWindow.View.GetClickCount
'Else
Set sld = pres.Slides(CLng(rng.Offset(, 1)))
With pres.Windows(1).View
.GotoSlide rng.Offset(, 1)
'.Slide.Shapes(rng.Offset(, 2)).Select
sld.Shapes(CStr(rng.Offset(, 2))).Select
With sld.Shapes(CStr(rng.Offset(, 2))).TextFrame.TextRange
.Characters(InStr(.Text, [B1]), Len([B1])).Select
End With
End With
'End If
Else
'open VBE window and select the line
With pres.VBProject
.VBE.MainWindow.Visible = True
.VBComponents(rng.Offset(, 1)).Activate
stline = CLng(rng.Offset(, 2))
.VBComponents(rng.Offset(, 1)).CodeModule.CodePane.Show
.VBComponents(rng.Offset(, 1)).CodeModule.CodePane _
.SetSelection stline, 1, stline + 1, 1
End With
End If
End Sub
지식인 링크 참조: https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102&docId=330607982&clubid=16854404&menuid=248
kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020103&docId=384254201#answer1
'PPT+VBA' 카테고리의 다른 글
PPT 실시간 시계 혹은 타이머 추가 v2 (8) | 2019.12.21 |
---|---|
PPT 실시간 시계 또는 타이머 추가 (26) | 2019.12.17 |
PPT 한글, 영문 폰트 및 기타 속성 일괄 변경하기 (19) | 2019.10.29 |
파워포인트에서 메뉴-서브메뉴 시스템 구현 (1) | 2019.09.05 |
각 슬라이드에 한글자씩 가득차게 분할 출력 (0) | 2019.07.02 |
슬라이드 이미지 분할 인쇄 및 저장 (2) | 2019.06.08 |
VBA로 슬라이드 자동 생성 - '자주 쓰는 영어속담 50개' (4) | 2019.04.16 |
ppt 슬라이드를 워드 Doc, PDF, txt 로 저장 (4) | 2019.04.05 |
최근댓글