三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

XXXXXさんへ Excel VBA 1行単位 A列からE列 5つのデータをPowerPointの1スライド 縦に5個並べたテキストボックスにセットする

下記の質問をいただきました。

>パワーポイントのVBAを検索していたらこちらに辿り着きました。
>A列~E列までのデータを1枚のスライドの5か所のテキストボックスに流し込むにはどうしたら
>いいでしょうか?
>テキストボックスは上から下へ同じ大きさのテキストボックスが5行あるような状態です。

いつもの、あのあの、そのその?が多すぎなテスト動画です
https://www.youtube.com/watch?v=ZLkCiXC0FzQ
www.youtube.com

1.事前準備
PowerPoint を新規で開き、5つのテキストボックスを作成します。

ホーム → 配置 → オブジェクトの選択と表示
を使い、オブジェクトの名前を設定します。
ここでは、
txtA
txtB
txtC
txtD
txtE
としました。

テンプレ000.pptxと名前を付け保存します。
テンプレートファイルを一つ作ります

※※作成したコードを実行させてから、細かい説明をする。

2.ExcelからPowerPointへデータを流し込む

2.1 Excelからテンプレ000.pptxを開く

2.2 別名を付け、20210725.pptx など、保存する。
※途中で止まった時に(トラブった時に)テンプレートを壊したくないので、
頭で別名保存する

2.3 Excelの行数分 テンプレのスライドをコピーする

2.4 Excel 1行(A列~E列) を
PowerPoint 1スライド 5つのテキストボックス(タテに並べたテンプレート)
データをセットする

だいぶまえ、前回のソース https://ken3memo.hatenablog.com/entry/2019/11/01/110000 参考にして

Option Explicit

'A列~E列(A2二行目から)にセットされたデータを使用して、
'1行1スライド テキストボックス五ヶ所にデータセット スライドを作成する
'事前に作られたPowerPointのテンプレート的なスライドをコピーし作成する
Sub PowerPointテンプレ開きテキストボックスにセットする()

    Dim oApp As Object  'PowerPoint.Applicationを作成して入れる

    'PowerPoint の 起動、インターフェース用のオブジェクトを作る
    Set oApp = CreateObject("PowerPoint.Application")
    oApp.Visible = True '可視にする
    
    '2.ExcelからPowerPointへデータを流し込む
    '2.1 Excelからテンプレ.pptxを開く
    
    Const strOpenFileName = "D:\2021\テンプレ000.pptx" '元のテンプレートファイル名
    Dim strSaveFileName As String  '保存ファイル名をD:2021\日付.pptで作成する

    '1.元ファイルを開く テンプレートファイルを開く
    oApp.Presentations.Open strOpenFileName
    '↑単純に、.Open "ファイル名" で開いただけです ファイルなしのエラーをチェックしろよコラ!!
    
    '2.2 別名を付け、202107250102.pptx などで、保存する。
    '※途中で止まった時に(トラブった時に)テンプレートを壊したくないので、
    '頭で別名保存する

    '保存場所とファイル名yyyymmddhhnn.pptxを作る 年月日時分.pptx
    strSaveFileName = "d:\2021\" & Format(Now(), "yyyymmddhhnn") & ".pptx"
    
    '単純に.SaveAs "ファイル名" で 保存する
    oApp.ActivePresentation.SaveAs strSaveFileName

    '2.3 Excelの行数分 テンプレのスライドをコピーする
    Dim n As Integer
    Dim strWORK As String
    For n = 3 To 99 'A3からデータ有無をチェックしてスライドを複製する
        'A列のデータ存在チェック
        strWORK = Trim("" & Cells(n, "A").Text)  'A列のデータを取り出し、左右の空白をカット
        If Len(strWORK) = 0 Then Exit For '文字列の長さが0 データ無しならループ処理を抜ける
        'テンプレートスライドを増やす
        oApp.ActivePresentation.Slides(1).Copy  '1ページ目をコピー
        oApp.ActivePresentation.Slides.Paste 1  '1ページ目に貼り付け
    Next n
    
    '2.4 Excel 1行(A列~E列) を
    '    PowerPoint 1スライド 5つのテキストボックス(タテに並べたテンプレート)
    '    データをセットする
    
    'ここからスライドをA列のデータがなくなるまで、追加する
    Dim nPAGE As Integer  'セットするスライドページ
    Dim objSlide As Object  'スライド
    For n = 2 To 99 'A2からデータ有無をチェックしてスライドにデータをセットする
        'A列のデータ存在チェック
        strWORK = Trim("" & Cells(n, "A").Text)  'A列のデータを取り出し、左右の空白をカット
        If Len(strWORK) = 0 Then Exit For '文字列の長さが0 データ無しならループ処理を抜ける
        'Excel A列からE列のデータをスライドにセットする
        nPAGE = n - 1 'Excel1行目が見出しなので、-1する。※だったらn-1をそのまま使ってもいいのにね
        Set objSlide = oApp.ActivePresentation.Slides(nPAGE)  'スライドオブジェクト
        'スライドの下にぶらさがっている、名前の付いたテキストボックスにデータセット
        objSlide.Shapes("txtA").TextFrame.TextRange.Text = Cells(n, "A").Text 'A列
        objSlide.Shapes("txtB").TextFrame.TextRange.Text = Cells(n, "B").Text
        objSlide.Shapes("txtC").TextFrame.TextRange.Text = Cells(n, "C").Text
        objSlide.Shapes("txtD").TextFrame.TextRange.Text = Cells(n, "D").Text
        objSlide.Shapes("txtE").TextFrame.TextRange.Text = Cells(n, "E").Text
        '↑単純に代入しただけです。ぉぃぉぃ。ループで回せよ??
    Next n
   
    '.Saveで保存
    oApp.ActivePresentation.Save
    
    'アプリを開きっぱなしで、ぎょうぎ悪く終わる。
    'oApp.Quit    '.QuitでoAppのPowerPoint終了

    MsgBox "PowerPointのスライドを作成しました、確認してください"

    '↑んっ?コードよりも、コメント行の方が行数多い?
    'たいした量のコードを書かないでも、こんなことできるんだ
    '※だって、テンプレファイル無しのエラー入ってないし、
    'txtAの名前が付いたテキストボックスが無かったときのエラー処理が入ってないじゃん
    'お金を取るプログラムなら、エラー処理入れろよ
    'と、読者の心の声が聞こえてきたので、このあたりで失礼します

End Sub


テストで作成してみました、処理の参考となれば幸いです。

Excel VBA 1行単位 A列からE列 5つのデータをPowerPointの1スライド 縦に5個並べたテキストボックスにセットする。 Excel 1行 を PowerPoint 1スライドで作成
https://www.youtube.com/watch?v=ZLkCiXC0FzQ
↑コードを修正しながら、遊んでみてください。

事前準備と単体テストの動画※下記3つの単体テストを先にやってました。合わせてみてください。

1.PowerPoint テキストボックスに名前を付ける VBAから値をセットしたかったのでオブジェクトに名前を手作業で付け セット処理を確認してみる
https://www.youtube.com/watch?v=1nKrP4nhqHE

2.PowerPoint VBA ファイルを開き 別名で保存してみる
https://www.youtube.com/watch?v=df4XyOdKdIk

3.PowerPoint VBA スライドをコピー 貼り付け スライドの複製を作成する
https://www.youtube.com/watch?v=PSEB-A5wIPw



2022/03/28 追記

>これの逆(パワポのスライドタイトルをExcelへ)ってできますか?

とコメントが来たので、パワポのテキスト取得にチャレンジしてみたいと思います。
ken3memo.hatenablog.com

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)