ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VBA/파워포인트/사진정리 - 1.2. 사진 삽입 서브 프로시저
    코딩/vba 2024. 1. 13. 00:21
    728x90

    폴더의 사진 파일을 슬라이드로 옮기는 프로시저다.

    인수로 파일들, 배치 위치와 사진 폭을 받는다. 파일명과 배치 위치는 배열이기 때문에 참조로 전달받고 사진 폭은 값으로 전달 받는다.

     

    처리할 방법은 아래와 같다.

     

    처리할 파일의 수를 계산한다.

    현재 슬라이드 번호를 변수에 저장한다.

    반복되는 호출을 위해 현재 파워포인트를 객체화하고 새로 만드는 슬라이드를 위해 현재 레이아웃도 저장한다.

     

    다음의 내용으로 Do..While문으로 사진 목록을 순환한다.

    728x90

    슬라이드를 추가하는 이유는 현재의 사진 ZOrder를 변경하면 사진의 인덱스가 바뀌기 때문에 전체 사진을 순환할 수 없어 새 슬라이드에 사진을 하나씩 복사하여 내보내며 ZOrder를 정리하기 위함이다.

    이 순환은 i=0으로부터 시작하지만 순환할 때마다 i=i+3으로 사진을 세 개씩을 처리한다.

     

    Do While (numberOfFiles - i) > 0: 이 루프는 아래에 있는 코드 블록을 반복하는데, numberOfFiles는 삽입할 전체 파일 수이고, i는 현재까지 처리한 파일의 수. 파일이 남아있을 때까지 루프를 실행.

    1. slideIdx = slideIdx + 1: 슬라이드 인덱스를 증가시키고, 다음에 추가될 슬라이드를 지정.
    2. ppt.Slides.AddSlide slideIdx, pptLayout: PowerPoint 슬라이드를 추가.
    3. If (numberOfFiles - i) > 2 Then ...: 남은 파일의 수를 확인하고, 최대 2개의 사진을 현재 슬라이드에 추가. 남은 파일이 2개 이하일 경우, 해당 수만큼만 추가.
    4. For j = i To i + numberOfPics ... Next j: 현재 슬라이드에 추가할 파일 수만큼 루프를 실행하면서 각 파일을 슬라이드에 추가.
    5. For Each pic In ppt.Slides(slideIdx).Shapes ... Next pic: 슬라이드에 추가된 각 사진에 대해 루프를 실행하면서, 사진의 속성을 설정. 이 코드는 사진의 크기를 조절하고, 배치를 설정.
    6. i = i + 3: 현재까지 처리한 파일의 수를 3 증가. 이는 다음 루프에서 처리할 파일을 결정.
    7. 진행 과정을 확인하기 위해 터미널에 처리하는 슬라이드를 출력해서 확인.

    서브 프로시저에서는 입력값을 설정하지 않는게 원칙이다. 입력값을 서브 프로시저에 두면 매번 값을 변경할 때마다 찾아야 한다. 그만치 귀찮은 일도 없다. 서브 프로시저는 정해진 값을 받아 절차만 수행해야 한다. 입력값을 여기서 주면 디버깅과 프로그램 세팅 변경이 힘들어진다.

    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

    댓글

Designed by Tistory.