三流君のソースコード置き場

ブログにソースコードをアップして、ブログの検索機能で利用してます(利用予定です)

よく検索されるキーワード: [VBA]/ [VBS]/ [CreateObject]/ [Excel]/ [ADO]


test20240404_01ppスライドをexシートへグラフ情報付きで書き出す

あとで、解説を書く
まず、コードを質問者さんへ送る


ソースコード:

Option Explicit

'起動済みの既存 パワーポイントのスライドから
'パワポのシェイプ情報をexcelシートへ書き出す
'ex:新規ブックを追加して、pp:スライドの情報をex:シート単位で貼り付ける
'2024/04/04 シェイプでHasChart = True だったら、グラフの情報を書きだす

Const 基準セル = "B2"

Sub test20240404_01ppスライドをexシートへグラフ情報付きで書き出す()

    Dim ppApp As Object 'As PowerPoint.Application
    
    Set ppApp = Nothing 'エラーチェックのため初期化
    On Error Resume Next  '取得エラー時に次へ行く
    Set ppApp = GetObject(, "PowerPoint.Application")
    On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意

    If ppApp Is Nothing Then
        MsgBox "パワポを取得できません。プレゼンスライドを開いてから、再テストしてね"
        Exit Sub
    End If
    
    '新規に貼り付け先のExcelブックを作成したいので
    Dim wbNEW As Workbook
    Set wbNEW = Workbooks.Add  '新規ブックの追加
    
    Dim shNEW As Worksheet '新規のシート用に変数を作成する
    
    Dim p As Integer, y As Integer   'pページ、y行
    Dim objShape As Object  'As PowerPoint.Shape 'パワポのシェイプ、テキスト、図形ほか
    
    Dim n As Integer, x As Integer  '系列のカウンター,セットする列位置
    
    'パワポのスライドをExcelシートに
    For p = 1 To ppApp.ActivePresentation.Slides.Count  'スライド数ループ pページ
        
        '新規シートの追加
        Set shNEW = wbNEW.Sheets.Add(Before:=wbNEW.Worksheets(wbNEW.Worksheets.Count))
        shNEW.Name = "スライド" & p   'シート名をスライド1,2,3..にする
        '新規シートを一番後ろに追加するために↑細工してみた
        
      'ここから、シェイプの情報を書きこむ
        '書き込み開始位置の左上のセルを指定して、offictで対応する
        Dim rBASE As Range   '拠点、書き込みの左上を代入する
        Set rBASE = shNEW.Range(基準セル)

        rBASE.Select
        '0行目に見出しを書き込む
        rBASE.Offset(0, 0) = "Page番号"
        rBASE.Offset(0, 1) = "ID"
        rBASE.Offset(0, 2) = "名前 Shape.Name"
        rBASE.Offset(0, 3) = "種類 .Type"      '※あると便利
        rBASE.Offset(0, 4) = "左位置.Left"     '位置等で絞り込む?時、便利
        rBASE.Offset(0, 5) = "上位置.Top"
        rBASE.Offset(0, 6) = "幅 .Width"    '幅と高さ 24/03/02
        rBASE.Offset(0, 7) = "高さ .Height"
        rBASE.Offset(0, 8) = "テキスト 先頭から10文字"  'テキストがあれば判断時便利かな?
        
        'pページのスライド内のシェイプを探る
        y = 1 '基準の一つ下からセットする
        For Each objShape In ppApp.ActivePresentation.Slides(p).Shapes
            rBASE.Offset(y, 0) = p   'スライド番号(ページ番号)
            rBASE.Offset(y, 1) = objShape.ID    'IDで今回、区別したいので※24/03/02追加
            rBASE.Offset(y, 2) = objShape.Name  'オブジェクトの名前
            rBASE.Offset(y, 3) = objShape.Type  '※種類
         
            rBASE.Offset(y, 4) = objShape.Left  '位置 左上の左 判断材料
            rBASE.Offset(y, 5) = objShape.Top   '位置 左上の縦
         
            rBASE.Offset(y, 6) = objShape.Width '
            rBASE.Offset(y, 7) = objShape.Height
            
            'オブジェクトがテキストを持っているか?チェックしてからセット
            If objShape.HasTextFrame = msoTrue Then 'テキストフレームあり
                If objShape.TextFrame.HasText = msoTrue Then 'テキスト範囲あり
                    rBASE.Offset(y, 8) = Left(objShape.TextFrame.TextRange.Text, 10)
                    'テキストを10文字だけ書き込む↑,99文字など好みの文字で
                End If
            End If
            
            '2024/04/04 追加
            'オブジェクトがグラフを持っているか? HasChartをチェックしてからセット
            If objShape.HasChart = True Then
                Debug.Print "チャートみつけたぞ", objShape.Chart.Name
                Dim ppChart As Object 'PowerPoint.Chart
                Set ppChart = objShape.Chart  'シェイプの下にあるChartを変数に代入
                
                y = y + 1  'セットする行を次の行へ
                rBASE.Offset(y, 2) = ".SeriesCollection.Count=" & ppChart.SeriesCollection.Count
                
                '系列の数だけ回す
                For n = 1 To ppChart.SeriesCollection.Count
                
                    Dim ppSeries As Object 'PowerPoint.Series  '系列を処理する
                    Set ppSeries = objShape.Chart.SeriesCollection(n) 'n番目の系列を代入
                    
                    '系列の名前
                    y = y + 1  'セットする行を次の行へ
                    rBASE.Offset(y, 2) = "Series.Name=" & ppSeries.Name
                    
                    'グラフの種類によって、どっちを先にする?キレイな表を作りたかったり。
                     'Series.XValuesを表示
                    y = y + 1  'セットする行を次の行へ
                    rBASE.Offset(y, 1) = "XValues"
                    rBASE.Offset(y, 2) = ppSeries.Name  '系列の名前

                    Dim boxXValues As Variant
                    boxXValues = ppSeries.XValues
                    For x = 1 To UBound(boxXValues)
                        rBASE.Offset(y, 2 + x) = boxXValues(x)
                    Next

                    'Series.Valuesを表示
                    y = y + 1  'セットする行を次の行へ
                    rBASE.Offset(y, 1) = "Values"
                    rBASE.Offset(y, 2) = ppSeries.Name  '系列の名前
                    
                    Dim boxValues As Variant
                    boxValues = ppSeries.Values
                    For x = 1 To UBound(boxValues)
                        rBASE.Offset(y, 2 + x) = boxValues(x)
                    Next
                     
                Next
    
            End If
        
            
            y = y + 1   'セットする行を次へ
            
        Next
        
    Next
    
    MsgBox "処理終了、確認してください"

End Sub



https://youtu.be/RD5ovhJncsY
目次
00:00 あいさつ、やりたいこと
01:19 1.1 実行結果を見せる
06:09 1.2 Excelのリンクを切る
08:40 1.3 ソースコードの貼り付け方
12:01 2.1 先月作成のコードを宣伝紹介 PowerPointのシェイプ情報をExcelへ書き出す
13:43 2.2 昨年23年から積み残しのコード グラフの情報 Values,XValuesを使用します
2.3 今回作成した パワポのグラフから値をExcelシートへ書き込む テストコード
14:35 2.3.1 Shape.HasChart で シェイプがグラフか?判断する
16:04 2.3.2 系列の数 と 名前
17:51 2.3.3 Series.XValuesを表示
19:02 2.3.4 Series.Valuesを表示
20:28 2.3.5 ソースコード全体
24:24 2.4 急に脱線して出力結果の仕様変更を行う
28:06 2.4.1 系列が入れ替わっている場合
33:21 3.問題点・改善点 3.1 Series.Values Series.XValues の表示順や同じ値は一つにしたい
33:54 3.2 正規のリンク貼り付け?に対応していない 貼付け手順によってタイプが違う
35:21 単純な、手順 ショートカットで何も考えないで貼り付ける
36:04 形式を選択して貼付で選ぶ 貼付けパターンが三種類テストしてみます
38:53 元Excelの値を変更して再テスト
42:01 グラフのタイプ Shape.Type を説明する 4.終わりの挨拶
youtu.be

パワポのグラフから値を取り出すソースコード:
24:24 2.4 急に脱線して出力結果の仕様変更を行う
突然、客先で修正を始める、迷惑プログラマーの姿・・・※反省しないとなぁ・・・
説明が飛んでしまい、迷惑をかけます
https://www.youtube.com/watch?v=RD5ovhJncsY&t=1464

Option Explicit

'起動済みの既存 パワーポイントのスライドから
'パワポのシェイプ情報をexcelシートへ書き出す
'ex:新規ブックを追加して、pp:スライドの情報をex:シート単位で貼り付ける
'2024/04/04 シェイプでHasChart = True だったら、グラフの情報を書きだす

Const 基準セル = "B2"

Sub test20240404_01ppスライドをexシートへグラフ情報付きで書き出す()

    Dim ppApp As Object 'As PowerPoint.Application
    
    Set ppApp = Nothing 'エラーチェックのため初期化
    On Error Resume Next  '取得エラー時に次へ行く
    Set ppApp = GetObject(, "PowerPoint.Application")
    On Error GoTo 0  'エラーを元に戻す※これを忘れると、デバッグ時にハマるから注意

    If ppApp Is Nothing Then
        MsgBox "パワポを取得できません。プレゼンスライドを開いてから、再テストしてね"
        Exit Sub
    End If
    
    '新規に貼り付け先のExcelブックを作成したいので
    Dim wbNEW As Workbook
    Set wbNEW = Workbooks.Add  '新規ブックの追加
    
    Dim shNEW As Worksheet '新規のシート用に変数を作成する
    
    Dim p As Integer, y As Integer   'pページ、y行
    Dim objShape As Object  'As PowerPoint.Shape 'パワポのシェイプ、テキスト、図形ほか
    
    Dim n As Integer, x As Integer  '系列のカウンター,セットする列位置
    
    'パワポのスライドをExcelシートに
    For p = 1 To ppApp.ActivePresentation.Slides.Count  'スライド数ループ pページ
        
        '新規シートの追加
        Set shNEW = wbNEW.Sheets.Add(Before:=wbNEW.Worksheets(wbNEW.Worksheets.Count))
        shNEW.Name = "スライド" & p   'シート名をスライド1,2,3..にする
        '新規シートを一番後ろに追加するために↑細工してみた
        
      'ここから、シェイプの情報を書きこむ
        '書き込み開始位置の左上のセルを指定して、offictで対応する
        Dim rBASE As Range   '拠点、書き込みの左上を代入する
        Set rBASE = shNEW.Range(基準セル)

        rBASE.Select
        '0行目に見出しを書き込む
        rBASE.Offset(0, 0) = "Page番号"
        rBASE.Offset(0, 1) = "ID"
        rBASE.Offset(0, 2) = "名前 Shape.Name"
        rBASE.Offset(0, 3) = "種類 .Type"      '※あると便利
        rBASE.Offset(0, 4) = "左位置.Left"     '位置等で絞り込む?時、便利
        rBASE.Offset(0, 5) = "上位置.Top"
        rBASE.Offset(0, 6) = "幅 .Width"    '幅と高さ 24/03/02
        rBASE.Offset(0, 7) = "高さ .Height"
        rBASE.Offset(0, 8) = "テキスト 先頭から10文字"  'テキストがあれば判断時便利かな?
        
        'pページのスライド内のシェイプを探る
        y = 1 '基準の一つ下からセットする
        For Each objShape In ppApp.ActivePresentation.Slides(p).Shapes
            rBASE.Offset(y, 0) = p   'スライド番号(ページ番号)
            rBASE.Offset(y, 1) = objShape.ID    'IDで今回、区別したいので※24/03/02追加
            rBASE.Offset(y, 2) = objShape.Name  'オブジェクトの名前
            rBASE.Offset(y, 3) = objShape.Type  '※種類
         
            rBASE.Offset(y, 4) = objShape.Left  '位置 左上の左 判断材料
            rBASE.Offset(y, 5) = objShape.Top   '位置 左上の縦
         
            rBASE.Offset(y, 6) = objShape.Width '
            rBASE.Offset(y, 7) = objShape.Height
            
            'オブジェクトがテキストを持っているか?チェックしてからセット
            If objShape.HasTextFrame = msoTrue Then 'テキストフレームあり
                If objShape.TextFrame.HasText = msoTrue Then 'テキスト範囲あり
                    rBASE.Offset(y, 8) = Left(objShape.TextFrame.TextRange.Text, 10)
                    'テキストを10文字だけ書き込む↑,99文字など好みの文字で
                End If
            End If
            
            '2024/04/04 追加
            'オブジェクトがグラフを持っているか? HasChartをチェックしてからセット
            If objShape.HasChart = True Then
                Debug.Print "チャートみつけたぞ", objShape.Chart.Name
                Dim ppChart As Object 'PowerPoint.Chart
                Set ppChart = objShape.Chart  'シェイプの下にあるChartを変数に代入
                
                y = y + 1  'セットする行を次の行へ
                rBASE.Offset(y, 2) = ".SeriesCollection.Count=" & ppChart.SeriesCollection.Count
                
                '系列の数だけ回す
                For n = 1 To ppChart.SeriesCollection.Count
                
                    Dim ppSeries As Object 'PowerPoint.Series  '系列を処理する
                    Set ppSeries = objShape.Chart.SeriesCollection(n) 'n番目の系列を代入
                    
                    If n = 1 Then  '初回のみ落とす
                        '系列の名前
                        y = y + 1  'セットする行を次の行へ
                        rBASE.Offset(y, 2) = n
                        
                        'グラフの種類によって、どっちを先にする?キレイな表を作りたかったり。
                        'Series.XValuesを表示
                        'rBASE.Offset(y, 3) = ppSeries.Name  '系列の名前
                    
                        Dim boxXValues As Variant
                        boxXValues = ppSeries.XValues
                        For x = 1 To UBound(boxXValues)
                            rBASE.Offset(y, 3 + x) = boxXValues(x)
                        Next
                    
                    End If

                    'Series.Valuesを表示
                    y = y + 1  'セットする行を次の行へ
                    rBASE.Offset(y, 2) = n
                    rBASE.Offset(y, 3) = ppSeries.Name  '系列の名前
                    
                    Dim boxValues As Variant
                    boxValues = ppSeries.Values
                    For x = 1 To UBound(boxValues)
                        rBASE.Offset(y, 3 + x) = boxValues(x)
                    Next
                     
                Next
    
            End If
        
            
            y = y + 1   'セットする行を次へ
            
        Next
        
    Next
    
    MsgBox "処理終了、画像を確認してください"

End Sub

解説位置:
https://www.youtube.com/watch?v=RD5ovhJncsY&t=1464

パワーポイント リンク切れグラフの値を取り出す PowerPoint マクロ VBA
https://www.youtube.com/playlist?list=PL8vZhsyiiFhuAVnLl4S9tWujchW7rqOUm
再生リスト↑貼り付けたExcelグラフがリンク切れ 値を救いたい 吸い出したい

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


Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。
・[Excel/Access VBA]の解説
・[ASP(Active Server Pages)]の解説。
・[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
・[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
三流君を踏み台にする
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。

三流解説動画の再生リスト
https://www.youtube.com/user/ken3video/playlists

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