-
VBA/파워포인트/사진정리 - 1.2. 사진 삽입 서브 프로시저코딩/vba 2024. 1. 13. 00:21728x90
폴더의 사진 파일을 슬라이드로 옮기는 프로시저다.
인수로 파일들, 배치 위치와 사진 폭을 받는다. 파일명과 배치 위치는 배열이기 때문에 참조로 전달받고 사진 폭은 값으로 전달 받는다.
처리할 방법은 아래와 같다.
처리할 파일의 수를 계산한다.
현재 슬라이드 번호를 변수에 저장한다.
반복되는 호출을 위해 현재 파워포인트를 객체화하고 새로 만드는 슬라이드를 위해 현재 레이아웃도 저장한다.
다음의 내용으로 Do..While문으로 사진 목록을 순환한다.
728x90슬라이드를 추가하는 이유는 현재의 사진 ZOrder를 변경하면 사진의 인덱스가 바뀌기 때문에 전체 사진을 순환할 수 없어 새 슬라이드에 사진을 하나씩 복사하여 내보내며 ZOrder를 정리하기 위함이다.
이 순환은 i=0으로부터 시작하지만 순환할 때마다 i=i+3으로 사진을 세 개씩을 처리한다.
Do While (numberOfFiles - i) > 0: 이 루프는 아래에 있는 코드 블록을 반복하는데, numberOfFiles는 삽입할 전체 파일 수이고, i는 현재까지 처리한 파일의 수. 파일이 남아있을 때까지 루프를 실행.
- slideIdx = slideIdx + 1: 슬라이드 인덱스를 증가시키고, 다음에 추가될 슬라이드를 지정.
- ppt.Slides.AddSlide slideIdx, pptLayout: PowerPoint 슬라이드를 추가.
- If (numberOfFiles - i) > 2 Then ...: 남은 파일의 수를 확인하고, 최대 2개의 사진을 현재 슬라이드에 추가. 남은 파일이 2개 이하일 경우, 해당 수만큼만 추가.
- For j = i To i + numberOfPics ... Next j: 현재 슬라이드에 추가할 파일 수만큼 루프를 실행하면서 각 파일을 슬라이드에 추가.
- For Each pic In ppt.Slides(slideIdx).Shapes ... Next pic: 슬라이드에 추가된 각 사진에 대해 루프를 실행하면서, 사진의 속성을 설정. 이 코드는 사진의 크기를 조절하고, 배치를 설정.
- i = i + 3: 현재까지 처리한 파일의 수를 3 증가. 이는 다음 루프에서 처리할 파일을 결정.
- 진행 과정을 확인하기 위해 터미널에 처리하는 슬라이드를 출력해서 확인.
서브 프로시저에서는 입력값을 설정하지 않는게 원칙이다. 입력값을 서브 프로시저에 두면 매번 값을 변경할 때마다 찾아야 한다. 그만치 귀찮은 일도 없다. 서브 프로시저는 정해진 값을 받아 절차만 수행해야 한다. 입력값을 여기서 주면 디버깅과 프로그램 세팅 변경이 힘들어진다.
Sub InsertPictures(ByRef files() As Variant, ByRef positions() As Variant, _ ByVal picWidth as Integer) '파일 수 계산 Dim numberOfFiles As Integer numberOfFiles = UBound(files) - LBound(files) + 1 ' 현재 슬라이브번호 Dim slideIdx As Integer slideIdx = ActiveWindow.View.Slide.SlideIndex Dim ppt As Object Dim pptLayout As CustomLayout Set ppt = ActivePresentation Set pptLayout = ppt.Slides(slideIdx).CustomLayout Dim i As Integer, j As Integer, k As Integer, numberOfPics As Integer Dim pic As Shape Dim file As String i = 0 Do While (numberOfFiles - i) > 0 ' add slide slideIdx = slideIdx + 1 ppt.Slides.AddSlide slideIdx, pptLayout ' 남은 사진의 수 계산 If (numberOfFiles - i) > 2 Then numberOfPics = 2 Else numberOfPics = numberOfFiles - i - 1 End If ''' add pictures For j = i To i + numberOfPics ' 사진 삽입 file = files(j) ppt.Slides(slideIdx).Shapes.AddPicture file, msoFalse, msoTrue, 0, 0 ' 사진 배치 k = 0 For Each pic In ppt.Slides(slideIdx).Shapes If pic.Type = msoPicture Then pic.LockAspectRatio = msoTrue pic.Width = picWidth pic.Left = positions(k)(0) pic.Top = positions(k)(1) k = k + 1 End If Next pic Next j i = i + 3 Debug.Print "Slide added: " & slideIdx Loop End Sub
728x90'코딩 > vba' 카테고리의 다른 글
VBA/파워포인트/사진정리 - 2.1. Shapes 배열 생성 (0) 2024.01.13 VBA/파워포인트/사진정리 - 2. 사진 정열 (0) 2024.01.13 VBA/파워포인트/사진정리 - 1.1.1. 배열 정렬 (2) 2024.01.12 VBA/파워포인트/사진정리 - 1.1. 파일명 배열 (0) 2024.01.12 VBA/파워포인트/사진정리 - 1. 사진 삽입 (1) 2024.01.12