フォルダー内画像のスライドショー

Excelワークシート上でスライドショーを行うマクロです。フォルダー内の画像ファイルを1枚ずつ切り替えて表示します。

画像スライドショー マクロ

Sub Excelでスライドショー()

    Const pathUser As String = "C:\Pictures"
    Const maxW As Long = 700 '最大幅 pt単位
    Const maxH As Long = 500 '最大高 pt単位
    Dim aryFile() As String 'ファイルパスの配列
    Dim i As Long
    
    '対象画像のファイルパスを配列に格納
    s_getFileArray pathUser, aryFile, 0
    'スライドショーの実行
    For i = 1 To UBound(aryFile)
        s_InsImage aryFile(i), "スライドショー", maxW, maxH
        'ユーザー操作で切り替え
        If InputBox("次の画像を表示します", "スライドショー", "続行", 500, 500) = "" Then Exit For
        '時間経過で自動切り換え
        'Application.Wait (Now + TimeValue("00:00:05"))
    Next i
End Sub
'指定フォルダー以下の画像ファイルのリストを取得する
'要参照 : Microsoft Scripting Runtime
Private Sub s_getFileArray(aPath As String, aryFile() As String, cnt As Long)

    Dim oFS As New FileSystemObject
    Dim oFile As File
    Dim oFolder As Folder
    
    'サブフォルダーの処理: 再帰呼び出し
    For Each oFolder In oFS.GetFolder(aPath).SubFolders
        f_getFileArray oFolder.Path, aryFile, cnt
    Next
    'ファイルの処理: 指定拡張子のファイルを配列に追加
    For Each oFile In oFS.GetFolder(aPath).Files
        Select Case LCase(oFS.GetExtensionName(oFile))
        Case "png", "gif", "jpeg", "jpg"
            cnt = cnt + 1
            ReDim Preserve aryFile(1 To cnt)
            aryFile(cnt) = oFile.Path
        End Select
    Next
    Set oFile = Nothing
    Set oFolder = Nothing
    Set oFS = Nothing
End Sub
'アクティブシートの画像貼り替え(スライドショー)
Private Sub s_InsImage(pathImg As String, nameShp As String, maxW As Long, maxH As Long)

    Dim oShp As ShapeRange

    Application.ScreenUpdating = False
    On Error Resume Next '未配置時のエラー回避
    ActiveSheet.Shapes(nameShp).Delete
    On Error GoTo 0
    Set oShp = ActiveSheet.Pictures.Insert(pathImg).ShapeRange
    With oShp
        .Name = nameShp
        .LockAspectRatio = True
        .Top = 30
        .Left = 10
        '最大サイズを超える場合は調整
        If .Width > maxW Then .Width = maxW
        If .Height > maxH Then .Height = maxH
    End With
    Application.ScreenUpdating = True
    
    Set oShp = Nothing
End Sub

ポイント解説

スライドショーの実体

画像を切り替えているように見えますが、画像の削除と貼り付けを繰り返すというのが実体です。

[図の変更]コマンドについて
画像を右クリックしたショートカットメニューに[図の変更]がありますが、このコマンドはマクロ記録できず、相当するメソッドもありません。
画像の場所と最大サイズ(固定値の変数)

pathUser に画像ファイルのあるフォルダーパス、maxWmaxHにスライド画像の最大サイズ(ポイント単位)を指定します。必要に応じて書き換えたり、実行時にユーザー指定する方法に変更してください。

最大サイズに収まる画像は原寸、超える画像は最大サイズまで縮小されます。

フォルダー内の画像ファイルを検索して配列に格納

ここでは、ファイル拡張子で選別しています。ファイル拡張子は以下の構文で求められます。

FileSystemオブジェクト.GetExtensionName(Fileオブジェクト) 

画像の切り替え(InputBoxで手動切り替え)

ダイアログボックスのボタンクリックの度に画像を切り替える方法です。あえて InputBox を使っているのは、表示位置を指定できるからです。MsgBox は常に中央に表示されるので、画像にかぶってしまうのです。ユーザーフォームを使うのが正攻法なのですが、手間いらずのInputBoxで代用しています。

画像の切り替え(時間経過で自動切り換え)

マクロ動作を一定時間停止させるには、Application.Waitメソッドで再開時刻を指定します。5秒停止の場合は現在時刻+5秒 を指定します。

Application.Wait (Now + TimeValue("00:00:05"))

 

タイトルとURLをコピーしました