三流君 ken3のmemo置き場

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

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

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

A列の値が変わるまで(グループ単位で)PowerPointのテンプレにセットする 差し込み印刷もどき処 理

A列の日付が変わるまで(グループ化)
最大5件のデータを事前に用意したPowerPointひな型テンプレートにセットする。
↑あっ、勝手に最大5件にして、あとでトラブル発生パターンを作る気満々で・・・
youtu.be
https://youtu.be/tprejIA-Q-M
目次とソースコード
00:00 やりたいこと 1.要求仕様:下記の質問をいただく
00:54 2.仕様をまとめる:入力と出力を考える
02:23 3.テンプレートファイルを作成する
03:13 4.1 1日単位で1スライドを作成
10:02 4.2 明細行 1~5のデータのセット 列名+連番の名前にデータをセットする
15:34 4.3 余った、行を消す じゃなくて、先に消してからセットする
22:55 5.終わりの挨拶 納品
24:20 5.1 テストデータを追加 5件以上のテスト 不具合バグの確認
27:00 5.2 勝手に5件以上あると想像したけど、実際は無かったりもするし・・・
29:00 閃いて修正に入り、ハマる・・・思い付きは・・・
32:32 6件以上の複数ページをわかりやすく?
36:52 余計な修正をやって伝書バトSEに怒られる 勝手にA列を変えて応用説明


1.要求仕様:下記の質問をいただく

質問、お題をいただく。

Excel

A列 日付
B列 名前
C列 会場
D列 時間
E列 イベント名

A列の日付事に1~5前後レコードがあり一か月分の情報があります。

これらを日付事にPowerPointのテキストボックスに貼付け転記をします。

上記の繰り返しで日付事1日分の複数のレコードに1シートに作成、2日目を追加シート増やします。
日付は一か月分のレコードになります。

これらの作業をExcelマクロを実行しPowerPointテキストボックスに転記する作業になります。

2.仕様をまとめる:入力と出力を考える

ExcelからPowerPointへデータを差し込む処理

使用するデータ
日付
名前
会場
開始時間
イベント名

入力イメージ:A列から明細行で1行単位

出力イメージ:1スライド5件に差し込む

入力データ:Excel
A列,B列,C列,D列,E列
日付,名前,会場,開始時間,イベント名
6/1,AA,あいう,10:00,音楽ライブ
6/1,BB,かきく,11:00,サッカー
6/2,CC,さしす,12:00,就職説明会
6/2,BB,かきく,13:00,就職説明会
6/2,AA,あいう,14:00,就職説明会
6/2,FF,んんん,15:00,就職説明会
6/3,XX,ををを,16:00,フットサル

出力:PowerPoint 1スライド 5件

1スライド目
日付,名前,会場,開始時間,イベント名
6/1,AA,あいう,10:00,音楽ライブ
6/1,BB,かきく,11:00,サッカー

2スライド目
日付,名前,会場,開始時間,イベント名
6/2,CC,さしす,12:00,就職説明会
6/2,BB,かきく,13:00,就職説明会
6/2,AA,あいう,14:00,就職説明会
6/2,FF,んんん,15:00,就職説明会

3スライド目
日付,名前,会場,開始時間,イベント名
6/3,XX,ををを,16:00,フットサル


3.テンプレートファイルを作成する

テンプレートファイルを
d:\テンプレート\

テンプレ0620.pptx
で作成する。

テンプレートファイルイメージ

スライド内に項目名+1~5のテキストボックスを作成する

日付,名前,会場,開始時間,イベント名

日付1,名前1,会場1,開始時間1,イベント名1
日付2,名前2,会場2,開始時間2,イベント名2


日付5,名前5,会場5,開始時間5,イベント名5


とりあえず、固定の場所、固定の名前で作成。
※固定の場所だったり、Excelと同じ場所とかルールを決めて運用する人達が多いかな。
(ルール、仕様を決めるのって、センスがでるよなぁ・・・)

テンプレートファイルの名前の付け方、操作は過去記事:
ken3memo.hatenablog.com
↑を参考にして作って下さい。


4.テンプレートファイルを開き データをセットする

A列のグループが変わるまでパワポのテンプレにセットする

A列の日付が変わるまで(グループ化)
最大5件のデータを事前に用意したPowerPointひな型テンプレートにセットする。
↑あっ、勝手に最大5件にして、あとでトラブル発生パターンを作る気満々で・・・

これも、センスが問われる、
コントロールブレーク処理かなぁ。

4.1 1日単位で1スライドを作成

A列の値が変わるまで、これをブレーク基準にすることから始めますか。

仕様:A列のデータが変わったら、新しいスライドをパワポに追加する

A列,B,C,D,E....
日付,名前,会場,開始時間,イベント名
6/1,山田,グリーンホール,9:30,ピアノコンサート
6/1,中村,ブルーパーク,10:45,バスケットボー


6/13,中田,カルシウムカフェ ,10:45,チーズテイスティング
6/14,加藤,カリウム公園 ,10:15,バナナフェスティバル
6/14,小野,ナトリウム通り ,11:45,ラーメン食べ放題
6/15,松田,カーボン博物館 ,10:30,生命の歴史

結果:日付別にスライドが作成される

Sub A列でコントロールブレイク001ひな型コピーテスト()

    'PowerPointアプリの起動
    Dim ppApp As Object   'PowerPoint.Application
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True '可視にする
    DoEvents

    'ひな型ファイルを開く
    Dim strPPFName As String
    strPPFName = "D:\テンプレート\テンプレ0620.pptx"  '※固定でフルパス
    
    '開く、コピー元を変数に入れる
    Dim ppひな型 As Object  'PowerPoint.Presentation  'pp:プレゼンテーション
    Set ppひな型 = Nothing '初期化、エラーチェックもかねて
    On Error Resume Next   '↓でSet 取得エラー時に次へ ファイルが開けなかった時
    Set ppひな型 = ppApp.Presentations.Open(strPPFName) 'ファイル名を指定して開く
    DoEvents
    On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意
    '↑単純に、.Open "ファイル名" で開いただけです
    If ppひな型 Is Nothing Then '↑上で開けたか?
        'openエラーの時、開けなかったことを知らせる
        MsgBox strPPFName & "が開けません確認してください", vbExclamation
        Exit Sub  'んっ?空のppAppが残るか、これだと・・・
    End If

    
    '新規の枠、新規プレゼンの作成
    Dim pp新規 As Object  'As PowerPoint.Presentation
    Set pp新規 = ppApp.Presentations.Add(WithWindow:=msoTrue) '新規追加
    
    Dim ppSlide As Object  'As PowerPoint.Slide
    
    Dim y As Long  '行カウンタ
    Dim PageCODE As Variant  'この値がキーが変更されたら改ページする
    
    'A列が存在する間ループする
    y = 2    'A2から始めたいので 2
    PageCODE = "初回に改ページしてねの意味を込めて長文"  '本当はPageCODE ="" などで初期化
    While Len(Trim(Cells(y, "A"))) > 0  'A列のデータが存在する間、ループする
        '改ページチェック CODEが変わったか?チェックする
        If PageCODE <> Cells(y, "A") Then '保存されている値と比べ 変更されていたら
            PageCODE = Cells(y, "A")  '値を保存する※このキー値の間処理をするため保存
            'キー、基準が変わったので、改ページ処理(ひな型からコピーして増やす)
            ppひな型.Slides.Range(1).Copy  '単純に1ページ目をコピー
            DoEvents
            '新規に貼り付ける。新スライドページの作成
            Set ppSlide = pp新規.Slides.Paste   'ひな型を新プレゼンの最後に追加貼り付け
            '↑ペーストついでに、変数にセットしておくと、便利ですよ
            DoEvents
            'ページが変わったので、タイトルをセット
            ppSlide.Shapes("タイトル 1").TextFrame.TextRange.Text = PageCODE  'キーをタイトルにセット
            DoEvents
        End If
        
        '明細のセット ↑で、作られた枠、ページにセットする
        
        y = y + 1  '次の行へ※忘れて無限ループはシャレにならないよ・・・
    Wend
    
    'ひな型は閉じる、新規プレゼンは開いたまま
    ppひな型.Close
    DoEvents
    Set ppひな型 = Nothing
    
    MsgBox "処理終了、パワポで確認してください"

End Sub

4.2 明細行 1~5のデータのセット 列名+連番の名前にデータをセットする

仕様:列名+連番の名前にデータをセットする

A列,B,C,D,E....
日付,名前,会場,開始時間,イベント名
6/1,山田,グリーンホール,9:30,ピアノコンサート
6/1,中村,ブルーパーク,10:45,バスケットボー

結果:列名+連番でパワーポイントの
日付1,名前1,会場1,開始時間1,イベント名1
日付2,名前2,会場2,開始時間2,イベント名2


日付5,名前5,会場5,開始時間5,イベント名5
にデータがセットされる。

10:02 4.2 明細行 1~5のデータのセット 列名+連番の名前にデータをセットする
https://www.youtube.com/watch?v=tprejIA-Q-M&t=602s&list=PL8vZhsyiiFhtDYDOdz94s6bQ54vwPRN-3&index=1&t=1299s&pp=gAQBiAQB
↑が解説場所です、動画結果と下記のソースコードを合わせて見てください。

'明細データのセット
' https://ken3memo.hatenablog.com/entry/2022/04/25/190000
'を参考に、明細行1~5へデータをセットする
Sub A列でコントロールブレイク002明細行のセット()

    'PowerPointアプリの起動
    Dim ppApp As Object   'PowerPoint.Application
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True '可視にする
    DoEvents

    'ひな型ファイルを開く
    Dim strPPFName As String
    strPPFName = "D:\テンプレート\テンプレ0620.pptx"  '※固定でフルパス
    
    '開く、コピー元を変数に入れる
    Dim ppひな型 As Object  'PowerPoint.Presentation  'pp:プレゼンテーション
    Set ppひな型 = Nothing '初期化、エラーチェックもかねて
    On Error Resume Next   '↓でSet 取得エラー時に次へ ファイルが開けなかった時
    Set ppひな型 = ppApp.Presentations.Open(strPPFName) 'ファイル名を指定して開く
    DoEvents
    On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意
    '↑単純に、.Open "ファイル名" で開いただけです
    If ppひな型 Is Nothing Then '↑上で開けたか?
        'openエラーの時、開けなかったことを知らせる
        MsgBox strPPFName & "が開けません確認してください", vbExclamation
        Exit Sub  'んっ?空のppAppが残るか、これだと・・・
    End If

    
    '新規の枠、新規プレゼンの作成
    Dim pp新規 As Object  'As PowerPoint.Presentation
    Set pp新規 = ppApp.Presentations.Add(WithWindow:=msoTrue) '新規追加
    
    Dim ppSlide As Object  'As PowerPoint.Slide
    
    Dim y As Long  '行カウンタ
    Dim PageCODE  As Variant  'この値がキーが変更されたら改ページする
    
    Dim x As Long  '4.2追加 列のカウンター
    Dim cnt明細行   As Long   '明細行1~5をカウントする
    Dim str転記列名 As String '日付1~5,や,場所1~5 などppの転記先テキストボックス名
    Dim ppShape     As Object 'As PowerPoint.Shape ↑の名前のシェイプを代入

    'A列が存在する間ループする
    y = 2    'A2から始めたいので 2
    PageCODE = "初回に改ページしてねの意味を込めて長文"  '本当はPageCODE ="" などで初期化
    While Len(Trim(Cells(y, "A"))) > 0  'A列のデータが存在する間、ループする
        '改ページチェック CODEが変わったか?チェックする
        If PageCODE <> Cells(y, "A") Then '保存されている値と比べ 変更されていたら
            PageCODE = Cells(y, "A")  '値を保存する※このキー値の間処理をするため保存
            'キー、基準が変わったので、改ページ処理(ひな型からコピーして増やす)
            ppひな型.Slides.Range(1).Copy  '単純に1ページ目をコピー
            DoEvents
            '新規に貼り付ける。新スライドページの作成
            Set ppSlide = pp新規.Slides.Paste   'ひな型を新プレゼンの最後に追加貼り付け
            '↑ペーストついでに、変数にセットしておくと、便利ですよ
            DoEvents
            'ページが変わったので、タイトルをセット
            ppSlide.Shapes("タイトル 1").TextFrame.TextRange.Text = PageCODE  'キーをタイトルにセット
            DoEvents
            '4.2 ページが変わったら、明細行も1からなので
            cnt明細行 = 1   'ppセットへ名前1にリセット
        End If
        
        '4.2 明細のセット ↑で、作られた枠、ページにセットする
        '列のループですよ、y行内で横方向に進むぞ
        For x = 1 To 99  '99列までループにして途中でExitするループ
            str転記列名 = Trim("" & Cells(1, x)) '1行目の見出し x列で項目名を取得
            If Len(str転記列名) = 0 Then Exit For '転記項目が無くなったら抜ける
            
            '転送先の項目名は、名前1~5なので、
            str転記列名 = str転記列名 & cnt明細行  'で単純に作る。※DATA1とDATA11,15問題は考えない
            
            'Excelから単純にItem(項目名)でデータセット、エラーを無視して項目名無しを回避
            On Error Resume Next  'エラーが発生しても強引に次の命令に行け
            Set ppShape = Nothing  'これが無いと、前回オブジェクトが残る
            Set ppShape = ppSlide.Shapes(str転記列名) 'セットするオブジェクト
            ppShape.TextFrame.TextRange.Text = Cells(y, x).Text 'Excelから文字列を代入
            On Error GoTo 0  '忘れないで戻すぞ
        Next x
        
        cnt明細行 = cnt明細行 + 1  '4.2 明細のセット位置も次にするよ
        
        y = y + 1  '次の行へ※忘れて無限ループはシャレにならないよ・・・
    Wend
    
    'ひな型は閉じる、新規プレゼンは開いたまま
    ppひな型.Close
    DoEvents
    Set ppひな型 = Nothing
    
    MsgBox "処理終了、パワポで確認してください"

End Sub



参考過去記事:
ken3memo.hatenablog.com

4.3 余った、行を消す じゃなくて、先に消してからセットする

仕様:2件データをセットしたら、残りの3件(5-2)を消す

テンプレートが5行固定なので、
セットしない場所のデータをスペースでクリアする。

デバッグ時の見た目から、
残りの3件(5-2)を消す↑と、考えると大変。
仕様書を書く人のセンスが悪いと、大変だね・・・

仕様:テンプレートからページをコピーして追加後、先に1~5をクリアする

↑の方が、自然な流れですね。

残りのゴミデータを消すじゃなくて、
先にキレイニしてから書き込む。

まぁ、こんな感じで、仕様を考えるのって大事なんですよ。
なんて、センス無しの私が言うと説得力ないけどね。
(告白:始め余りを消すコードFor n=明細行+1 To 5のループを考えてました、
でも、ぴったり5で止まった時は、あっ5+1=6 to 5だからいいのか?
など、
しばらくして、作成中に先に消せばいいことに気が付く)

(創作:さらに、動画を撮る前に、
そもそもテンプレートが空白なら、サンプル文字を入れるな、
と、激怒する先輩?が物語的にはありかなぁ?なんて思ったり。)

15:34 4.3 余った、行を消す じゃなくて、先に消してからセットする
https://www.youtube.com/watch?v=tprejIA-Q-M&t=934s&list=PL8vZhsyiiFhtDYDOdz94s6bQ54vwPRN-3&index=1&t=1299s&pp=gAQBiAQB
↑が解説場所です、動画結果と下記のソースコードを合わせて見てください。

'4.3 スライド追加後、テンプレのサンプル文字を消す
'明細行が余った時、ゴミデータが残るので、1~5を先に消す
Sub A列でコントロールブレイク003サンプル文字を先に削除()

    'PowerPointアプリの起動
    Dim ppApp As Object   'PowerPoint.Application
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True '可視にする
    DoEvents

    'ひな型ファイルを開く
    Dim strPPFName As String
    strPPFName = "D:\テンプレート\テンプレ0620.pptx"  '※固定でフルパス
    
    '開く、コピー元を変数に入れる
    Dim ppひな型 As Object  'PowerPoint.Presentation  'pp:プレゼンテーション
    Set ppひな型 = Nothing '初期化、エラーチェックもかねて
    On Error Resume Next   '↓でSet 取得エラー時に次へ ファイルが開けなかった時
    Set ppひな型 = ppApp.Presentations.Open(strPPFName) 'ファイル名を指定して開く
    DoEvents
    On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意
    '↑単純に、.Open "ファイル名" で開いただけです
    If ppひな型 Is Nothing Then '↑上で開けたか?
        'openエラーの時、開けなかったことを知らせる
        MsgBox strPPFName & "が開けません確認してください", vbExclamation
        Exit Sub  'んっ?空のppAppが残るか、これだと・・・
    End If

    
    '新規の枠、新規プレゼンの作成
    Dim pp新規 As Object  'As PowerPoint.Presentation
    Set pp新規 = ppApp.Presentations.Add(WithWindow:=msoTrue) '新規追加
    
    Dim ppSlide As Object  'As PowerPoint.Slide
    
    Dim y As Long  '行カウンタ
    Dim PageCODE  As Variant  'この値がキーが変更されたら改ページする
    
    Dim x As Long  '4.2追加 列のカウンター
    Dim cnt明細行   As Long   '明細行1~5をカウントする
    Dim str転記列名 As String '日付1~5,や,場所1~5 などppの転記先テキストボックス名
    Dim ppShape     As Object 'As PowerPoint.Shape ↑の名前のシェイプを代入

    'A列が存在する間ループする
    y = 2    'A2から始めたいので 2
    PageCODE = "初回に改ページしてねの意味を込めて長文"  '本当はPageCODE ="" などで初期化
    While Len(Trim(Cells(y, "A"))) > 0  'A列のデータが存在する間、ループする
        '改ページチェック CODEが変わったか?チェックする
        If PageCODE <> Cells(y, "A") Then '保存されている値と比べ 変更されていたら
            PageCODE = Cells(y, "A")  '値を保存する※このキー値の間処理をするため保存
            'キー、基準が変わったので、改ページ処理(ひな型からコピーして増やす)
            ppひな型.Slides.Range(1).Copy  '単純に1ページ目をコピー
            DoEvents
            '新規に貼り付ける。新スライドページの作成
            Set ppSlide = pp新規.Slides.Paste   'ひな型を新プレゼンの最後に追加貼り付け
            '↑ペーストついでに、変数にセットしておくと、便利ですよ
            DoEvents
            'ページが変わったので、タイトルをセット
            ppSlide.Shapes("タイトル 1").TextFrame.TextRange.Text = PageCODE  'キーをタイトルにセット
            DoEvents
            '4.3 サンプル文字を消す cnt明細行 ← 変数使いまわしはバグの元だけど
            For cnt明細行 = 1 To 5  '列見出し+1~5の項目をクリアする
                '列のループですよ、y行内で横方向に進むぞ
                For x = 1 To 99  '99列までループにして途中でExitするループ
                    str転記列名 = Trim("" & Cells(1, x)) '1行目の見出し x列で項目名を取得
                    If Len(str転記列名) = 0 Then Exit For '転記項目が無くなったら抜ける
                    
                    '転送先の項目名は、名前1~5なので、
                    str転記列名 = str転記列名 & cnt明細行  'で単純に作る。※DATA1とDATA11,15問題は考えない
                    
                    'Excelから単純にItem(項目名)でデータセット、エラーを無視して項目名無しを回避
                    On Error Resume Next  'エラーが発生しても強引に次の命令に行け
                    Set ppShape = Nothing  'これが無いと、前回オブジェクトが残る
                    Set ppShape = ppSlide.Shapes(str転記列名) 'セットするオブジェクト
                    ppShape.TextFrame.TextRange.Text = " " '4.3 スペースを1つセットでクリア
                    On Error GoTo 0  '忘れないで戻すぞ
                Next x
            Next cnt明細行
            
            '4.2 ページが変わったら、明細行も1からなので
            cnt明細行 = 1   'ppセットへ名前1にリセット 4.3ホント、ここ、忘れないでね・・・
        End If
        
        '4.2 明細のセット ↑で、作られた枠、ページにセットする
        '列のループですよ、y行内で横方向に進むぞ
        For x = 1 To 99  '99列までループにして途中でExitするループ
            str転記列名 = Trim("" & Cells(1, x)) '1行目の見出し x列で項目名を取得
            If Len(str転記列名) = 0 Then Exit For '転記項目が無くなったら抜ける
            
            '転送先の項目名は、名前1~5なので、
            str転記列名 = str転記列名 & cnt明細行  'で単純に作る。※DATA1とDATA11,15問題は考えない
            
            'Excelから単純にItem(項目名)でデータセット、エラーを無視して項目名無しを回避
            On Error Resume Next  'エラーが発生しても強引に次の命令に行け
            Set ppShape = Nothing  'これが無いと、前回オブジェクトが残る
            Set ppShape = ppSlide.Shapes(str転記列名) 'セットするオブジェクト
            ppShape.TextFrame.TextRange.Text = Cells(y, x).Text 'Excelから文字列を代入
            On Error GoTo 0  '忘れないで戻すぞ
        Next x
        
        cnt明細行 = cnt明細行 + 1  '4.2 明細のセット位置も次にするよ
        
        y = y + 1  '次の行へ※忘れて無限ループはシャレにならないよ・・・
    Wend
    
    'ひな型は閉じる、新規プレゼンは開いたまま
    ppひな型.Close
    DoEvents
    Set ppひな型 = Nothing
    
    MsgBox "処理終了、パワポで確認してください"

End Sub


5.終わりの挨拶 納品

やっと、完成したかなぁ。
納品完了。

視聴者の心の声:何か忘れてない?

あっ、忘れてた。
A列の日付が変わるまで(グループ化)
最大5件のデータを事前に用意したPowerPointひな型テンプレートにセットする。
↑あっ、勝手に最大5件にして、あとでトラブル発生パターンを作る気満々で・・・

5.1 テストデータを追加 5件以上のテスト

蛇足でAIを使って、テストデータを作成する実演
※もし動画録画中に混みあってて、応答時間が見えないから止めときゃいいのに・・・

データを貼り付けて、実行すると、

まぁ、そうなるよね。。。。

5.2 勝手に5件以上あると想像したけど、実際は無かったりもするし・・・

要求時の打ち合わせ

>A列の日付事に1~5前後レコードがあり一か月分の情報があります。
>これらを日付事にPowerPointのテキストボックスに貼付け転記をします。

日付事に1~5前後レコードがあり
ここ、よくある日本語だよね・・・・

わざと、大袈裟に想像して※トラブルを創造して
作った架空の話だけど、
システム開発アルアルかなぁ。

通常は、5件以上は無いんだけど、
晦日やクリスマスなど24時間イベント稼働・・とか、
打ち合わせ後に、後から気が付いたり。

誰でも自称SEと言えるこの時代、

ア.プロなら危ない所は事前につぶす?コーダーと違うのでそれが高給取りのSEですよ。。
イ.イヤイヤ仕様です、と、突っぱねる。交渉力もSEに必要な能力です。ぉぃぉぃ
ウ.作るのは下の人達や外注だから、そのまま仕様変更を下に流す、SE=劣化伝書鳩です
エ.その他

と、
スッキリしないところで、次回かなぁ。
※質問、感想待ってます、気軽にコメント欄へ

プログラムのアレンジ、
修正処理の流れで、
1つでも参考となればうれしいです。

27:00 5.2 勝手に5件以上あると想像したけど、実際は無かったりもするし・・・
https://www.youtube.com/watch?v=tprejIA-Q-M&t=1620s&list=PL8vZhsyiiFhtDYDOdz94s6bQ54vwPRN-3&index=1&t=1299s&pp=gAQBiAQB
↑が解説場所です、動画結果と下記のソースコードを合わせて見てください。
29:00 閃いて修正に入り、ハマる・・・思い付きは・・・
32:32 6件以上の複数ページをわかりやすく?
36:52 余計な修正をやって伝書バトSEに怒られる 勝手にA列を変えて応用説明

'蛇足
'思い付きで、いろいろとやってみた。
Sub A列でコントロールブレイク005蛇足で伝書鳩SEと戦う()

    'PowerPointアプリの起動
    Dim ppApp As Object   'PowerPoint.Application
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True '可視にする
    DoEvents

    'ひな型ファイルを開く
    Dim strPPFName As String
    strPPFName = "D:\テンプレート\テンプレ0620.pptx"  '※固定でフルパス
    
    '開く、コピー元を変数に入れる
    Dim ppひな型 As Object  'PowerPoint.Presentation  'pp:プレゼンテーション
    Set ppひな型 = Nothing '初期化、エラーチェックもかねて
    On Error Resume Next   '↓でSet 取得エラー時に次へ ファイルが開けなかった時
    Set ppひな型 = ppApp.Presentations.Open(strPPFName) 'ファイル名を指定して開く
    DoEvents
    On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意
    '↑単純に、.Open "ファイル名" で開いただけです
    If ppひな型 Is Nothing Then '↑上で開けたか?
        'openエラーの時、開けなかったことを知らせる
        MsgBox strPPFName & "が開けません確認してください", vbExclamation
        Exit Sub  'んっ?空のppAppが残るか、これだと・・・
    End If

    
    '新規の枠、新規プレゼンの作成
    Dim pp新規 As Object  'As PowerPoint.Presentation
    Set pp新規 = ppApp.Presentations.Add(WithWindow:=msoTrue) '新規追加
    
    Dim ppSlide As Object  'As PowerPoint.Slide
    
    Dim y As Long  '行カウンタ
    Dim PageCODE  As Variant  'この値がキーが変更されたら改ページする
    
    Dim x As Long  '4.2追加 列のカウンター
    Dim cnt明細行   As Long   '明細行1~5をカウントする
    Dim str転記列名 As String '日付1~5,や,場所1~5 などppの転記先テキストボックス名
    Dim ppShape     As Object 'As PowerPoint.Shape ↑の名前のシェイプを代入

    Dim cntGroup As Long
    

    'A列が存在する間ループする
    y = 2    'A2から始めたいので 2
    PageCODE = "初回に改ページしてねの意味を込めて長文"  '本当はPageCODE ="" などで初期化
    
    While Len(Trim(Cells(y, "A"))) > 0  'A列のデータが存在する間、ループする
        '改ページチェック CODEが変わったか?チェックする
        If PageCODE <> Cells(y, "A") Or cnt明細行 = 6 Then  '保存されている値と比べ 変更されていたら
            If PageCODE = Cells(y, "A") Then
                cntGroup = cntGroup + 1
            Else
                cntGroup = 1
            End If
            PageCODE = Cells(y, "A")  '値を保存する※このキー値の間処理をするため保存
            'キー、基準が変わったので、改ページ処理(ひな型からコピーして増やす)
            ppひな型.Slides.Range(1).Copy  '単純に1ページ目をコピー
            DoEvents
            '新規に貼り付ける。新スライドページの作成
            Set ppSlide = pp新規.Slides.Paste   'ひな型を新プレゼンの最後に追加貼り付け
            '↑ペーストついでに、変数にセットしておくと、便利ですよ
            DoEvents
            'ページが変わったので、タイトルをセット
            If cntGroup = 1 Then
                ppSlide.Shapes("タイトル 1").TextFrame.TextRange.Text = PageCODE  'キーをタイトルにセット
            Else
                ppSlide.Shapes("タイトル 1").TextFrame.TextRange.Text = PageCODE & " Page-" & cntGroup  'キ

ーをタイトルにセット
            End If
            DoEvents
            '4.3 サンプル文字を消す cnt明細行 ← 変数使いまわしはバグの元だけど
            For cnt明細行 = 1 To 5  '列見出し+1~5の項目をクリアする
                '列のループですよ、y行内で横方向に進むぞ
                For x = 1 To 99  '99列までループにして途中でExitするループ
                    str転記列名 = Trim("" & Cells(1, x)) '1行目の見出し x列で項目名を取得
                    If Len(str転記列名) = 0 Then Exit For '転記項目が無くなったら抜ける
                    
                    '転送先の項目名は、名前1~5なので、
                    str転記列名 = str転記列名 & cnt明細行  'で単純に作る。※DATA1とDATA11,15問題は考えない
                    
                    'Excelから単純にItem(項目名)でデータセット、エラーを無視して項目名無しを回避
                    On Error Resume Next  'エラーが発生しても強引に次の命令に行け
                    Set ppShape = Nothing  'これが無いと、前回オブジェクトが残る
                    Set ppShape = ppSlide.Shapes(str転記列名) 'セットするオブジェクト
                    ppShape.TextFrame.TextRange.Text = " " '4.3 スペースを1つセットでクリア
                    On Error GoTo 0  '忘れないで戻すぞ
                Next x
            Next cnt明細行
            
            '4.2 ページが変わったら、明細行も1からなので
            cnt明細行 = 1   'ppセットへ名前1にリセット 4.3ホント、ここ、忘れないでね・・・
        End If
        
        '4.2 明細のセット ↑で、作られた枠、ページにセットする
        '列のループですよ、y行内で横方向に進むぞ
        For x = 1 To 99  '99列までループにして途中でExitするループ
            str転記列名 = Trim("" & Cells(1, x)) '1行目の見出し x列で項目名を取得
            If Len(str転記列名) = 0 Then Exit For '転記項目が無くなったら抜ける
            
            '転送先の項目名は、名前1~5なので、
            str転記列名 = str転記列名 & cnt明細行  'で単純に作る。※DATA1とDATA11,15問題は考えない
            
            'Excelから単純にItem(項目名)でデータセット、エラーを無視して項目名無しを回避
            On Error Resume Next  'エラーが発生しても強引に次の命令に行け
            Set ppShape = Nothing  'これが無いと、前回オブジェクトが残る
            Set ppShape = ppSlide.Shapes(str転記列名) 'セットするオブジェクト
            ppShape.TextFrame.TextRange.Text = Cells(y, x).Text 'Excelから文字列を代入
            On Error GoTo 0  '忘れないで戻すぞ
        Next x
        
        cnt明細行 = cnt明細行 + 1  '4.2 明細のセット位置も次にするよ
        
        y = y + 1  '次の行へ※忘れて無限ループはシャレにならないよ・・・
    Wend
    
    'ひな型は閉じる、新規プレゼンは開いたまま
    ppひな型.Close
    DoEvents
    Set ppひな型 = Nothing
    
    MsgBox "処理終了、パワポで確認してください"

End Sub


関連過去記事:

ken3memo.hatenablog.com

ken3memo.hatenablog.com

ken3memo.hatenablog.com

Ken3 ホームページ 目次

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

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



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