top of page

【PowerPoint活用術 004】スライドに配置した文字をExcelに用意したリストからランダムに置換する方法

今回も会員様からのご質問です。

「パワポのスライドにワードアートなどを使って複数の文字列を配置しました。それをExcelに用意したリストの中からランダムで選択して置き換えたい。置き換える文字は重複しないように選択してほしい。」

イメージとしては下のようなものです。

PowerPoint、オブジェクトの文字列置換

VBAを使ってエクセルを呼び出し、繰り返し文を使って、エクセルに用意したリストからランダムで選択し、文字列を置き換えればよさそうですね。


ちょっと長いコードになりそうですが、パワーポイントのVBAを作ってみましょう。


1,事前準備


■ PowerPointの確認

変更したい文字列を含むPowerPointでは、文字列がオブジェクトとして登録されているのを確認します。

❶ 任意の文字列が入力されているオブジェクトを選択

❷ 「図形の形式」タブが表示されるので選択、「オブジェクトの選択と表示」をクリック

❸ 右側に複数のオブジェクトリストが表示るのを確認。

PowerPointにオブジェクトがあるのを確認

■ Excelの確認

対象のPowerPointと、データリストが登録されたエクセルは同じフォルダに格納します。

エクセルとパワーポイントを同一フォルダに格納

フォルダ内に格納したExcelを立ち上げます。

今回は任意の名前のファイル名、シート名のA列に置き換えたい文字列を必要な数だけ登録します。ファイル名とシート名はこの後VBAで使用します。

サンプルではファイル名「DT.xlsx」、シート名「Sheet1」にしています。

文字列のデータはいくつでも構いません。サンプルでは都道府県名を登録してみました。

エクセルでリストを作成

2,コードの作成


PowerPointで開発タブを表示、または「Altキー」+ 「F11」でVisualBasicを立ち上げます。標準モジュールを追加して、以下のコードを入力します。


まずは重複した場合に True を返す関数を作成します。

'使用済みかどうかを判定する関数
Function IsUsed(usedKenmei As Collection, kenmei As String) As Boolean
    Dim i As Variant
    On Error Resume Next
    For Each i In usedKenmei
        If i = kenmei Then
            IsUsed = True
            Exit Function
        End If
    Next i
    IsUsed = False
End Function

続いて都道府県名を置き換える関数を作成します。

Sub Replace()
    Dim ppApp As Object             'PowerPointアプリケーション用の変数
    Dim ppSlide As Object           '現在のスライド用の変数
    Dim ppShape As Object           'スライド上の各Shape用の変数
    Dim xlApp As Object             'Excelアプリケーション用の変数
    Dim xlBook As Object            'Excelブック用の変数
    Dim xlSheet As Object           'Excelシート用の変数
    Dim nameList As Collection      'リストを格納するためのCollection変数
    Dim usedKenmei As Collection    '使用済みの県名を格納するのCollection変数
    Dim i As Long                   'くり返し用変数
    Dim randIndex As Long           'ランダムなインデックスを格納する変数
    Dim currenPath As String        '基準となるフォルダパス

    'PowerPointアプリケーションを取得
    Set ppApp = GetObject(, "PowerPoint.Application")
    Set ppSlide = ppApp.ActiveWindow.View.Slide   'アクティブスライドを取得

    '現在のPowerPointファイが保存されているフォルダ
    currenPath = ppApp.ActivePresentation.Path   
    'Excelを開く
    Set xlApp = CreateObject("Excel.Application")   'ExcelApplication作成
    xlApp.Visible = False                           'Excelを非表示モードに
    '❶相対パスを利用してExcelファイルを開く
    Set xlBook = xlApp.Workbooks.Open(currenPath & "\DT.xlsx")  
    Set xlSheet = xlBook.Sheets("Sheet1")  'シート名「Sheet1」を指定して取得

    'ExcelのA列のデータを収集してnameListに登録する処理
    Set nameList = New Collection     'Collection型のインスタンスを作成
    On Error Resume Next              'エラーが発生してもスキップ
    'A列のデータを最後の行までループ(-4162はxlUp)
    For i = 1 To xlSheet.Cells(xlSheet.Rows.Count, "A").End(-4162).Row
    nameList.Add xlSheet.Cells(i, "A").Value   'A列の各値をCollectionに追加
    Next i
    On Error GoTo 0                    'エラーハンドリングをリセット

    '使用済み県名を追跡するためのCollectionを作成
    Set usedKenmei = New Collection

    'スライド内のテキストオブジェクトをランダムに置き換える
    Randomize                   'Rnd関数の乱数シードを初期化
    For Each ppShape In ppSlide.Shapes    'スライド内の全てのShapeをループ
        If ppShape.HasTextFrame Then      'ShapeがTextFrameを持っている場合
            If ppShape.TextFrame.HasText Then   'TextFrameがテキストを含む
                'テキストが空でない場合
                If ppShape.TextFrame.TextRange.Text <> "" Then  
                    '未使用の県名を取得する
                    Do
                        randIndex = Int((nameList.Count) * Rnd + 1)
                    Loop While IsUsed(usedKenmei, nameList(randIndex))

                    '県名を使用済みリストに追加
                    usedKenmei.Add nameList(randIndex)

                    'ランダムに選ばれた県名でテキストを置き換え
                    ppShape.TextFrame.TextRange.Text = nameList(randIndex)
                End If
            End If
        End If
    Next ppShape '次のShapeに進む

    'Excelを終了
    xlBook.Close False 'Excelブックを保存せずに閉じる
    xlApp.Quit 'Excelアプリケーションを終了

    MsgBox "県名を置き換えました。" '処理完了のメッセージを表示
End Sub

このファイルを保存する際には、PowerPointの拡張子をマクロ有効プレゼンテーション(.pptm)に置き換えます。


3,運用


1,事前にExcelファイルの任意のシート、A列に置き換えたいデータを登録します。

2,PowerPointでVBAを立ち上げ、上で作成したExcelのファイル名、シート名を指定します。

上のVBAの❶の青色部分で指定したファイル名、シート名を修正

Set xlBook = xlApp.Workbooks.Open(currenPath & "\DT.xlsx")   
Set xlSheet = xlBook.Sheets("Sheet1")

3,PowerPointの文字を置換したいスライドをActive(開いている)状態にして、VBAを立ち上げ、Replace()関数を呼び出します。


文字列が置き換わっているのを確認できたと思います。


ファイブボックスでは、PowerPoint、Excelの使い方やマクロの作成、その他プログラミング言語の学習やスクラッチやUnityの個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。



Comments


bottom of page