三流君 ken3のmemo置き場

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

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

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

PowerPoint VBA 表:TABLE 行:Row 列:Column セル:Cell を探る データ取得とセット

PowerPointの表をVBAから操作するコードを探ってみます
ActivePresentation.Slides(2).Shapes("表 2").Table.Cell(3,2).Shape.TextFrame.TextRange.Text = "文字列"
一行紹介の動画でOKなのに無駄に長く、
型宣言して型にハメながら ステップ実行してみます。
※見捨てないで最後まで視聴していただけるとありがたいです。。。
※※急ぎの人は 12:23 から視聴してください。
youtu.be
https://youtu.be/wHjsfRG5HHo
目次
00:00 パワポ 表(TABLE)を探る
01:00 .HasTableでシェイプが表かチェック
02:17 As PowerPoint.Tableでテーブルを探る
03:43 As PowerPoint.Cellで表をセル単位で処理
05:42 表をループで取り出す
06:49 As PowerPoint.Row 行処理
10:23 ページ、表の名前、行、列を指定してデータをセットする
12:23 イミディエイトの連結を外してテストしてみた

1.HasTableでシェイプが表かチェック

シェイプオブジェクトが表・TABLEか判断するには、
.HasTable = True/Falseで判断します。

HasTableで判断する
    'シェイプが表か?チェックするには.HasTableでチェック
    Debug.Print "ppShp.HasTable=" & ppShp.HasTable
    If ppShp.HasTable = msoFalse Then  'テーブルじゃなかったら
        MsgBox "Shape 表を選択してね", vbExclamation
        Exit Sub
    End If

2.As PowerPoint.Tableでテーブルを探る

    'テストなので、表のオブジェクトに再代入
    Dim ppTable As PowerPoint.Table
    Set ppTable = ppShp.Table

    '↑テーブルは行と列を持ってます
    Debug.Print "行 ppTable.Rows.Count=" & ppTable.Rows.Count
    Debug.Print "列 ppTable.Columns.Count=" & ppTable.Columns.Count


3.As PowerPoint.Cellで表をセル単位で処理

いつもの TABLEオブジェクト と Cellメソッド
    Dim ppCell As PowerPoint.Cell
    Set ppCell = ppTable.Cell(1, 1) '.Cell(行,列)メソッドで取り出す
    Debug.Print "ppCell.Shape.TextFrame.TextRange.Text=" & ppCell.Shape.TextFrame.TextRange.Text
    '↑.Textまでが、長いね・・・
    'もちろん、Set ppCellにわざわざ、入れないで
    'ppTable.Cell(1, 1).Shape.TextFrame.TextRange.Text でいいんですよ。

4.表をループで取り出す

    '表をループで取り出す、パターン1
    Dim x As Integer, y As Integer
    Dim strWORK As String
    
    Debug.Print "表をループで取り出す、パターン1"
    Debug.Print "行、列がわかるなら、Cell(y,x)のループで回す"
    Debug.Print "カンマ区切りでデバッグ表示"
    For y = 1 To ppTable.Rows.Count '行数分ループ
        strWORK = y & "行目:"
        For x = 1 To ppTable.Columns.Count '列数のループ
            Set ppCell = ppTable.Cell(y, x) '.Cell(行,列)メソッドで取り出す
            strWORK = strWORK & ppCell.Shape.TextFrame.TextRange.Text & ","
            '↑テキストを追記して、カンマ区切り(最後の,は気にしないでね)
        Next x
        Debug.Print strWORK  '↑で作った文字列を表示
    Next y

5.As PowerPoint.Row 行処理

    '次はRowsで行単位に処理してみたり
    '2行目のデータをTESTで取り出し、表示してみる
    strWORK = "単体、2行目テスト:"
    Dim ppRow As PowerPoint.Row  '※Row単体、行です、Rowsは行の集合なので
    Set ppRow = ppTable.Rows(2)  'Rows(2)で2行目のデータ
    For Each ppCell In ppRow.Cells  '行Rowに含まれるCellsを1つ1つ取り出し、変数セルに
        strWORK = strWORK & ppCell.Shape.TextFrame.TextRange.Text & ","
        '↑テキストを追記して、カンマ区切り(最後の,は気にしないでね)
    Next
    Debug.Print strWORK
    
    '↑みたいに、Rowsから取り出すループもよく見かけます
    Debug.Print "---"
    Debug.Print "Rowsから1行単位で取り出し、Cellのループで回す"
    Debug.Print "カンマ区切りでデバッグ表示"
    
    y = 0  '変数yで行カウンタ管理をするなら、いまいち?
    For Each ppRow In ppTable.Rows  'TableのRowsに含まれる行Rowを1つ1つ取り出し処理
        y = y + 1
        strWORK = y & "行 Row:"
        For Each ppCell In ppRow.Cells  '行Rowに含まれるCellsを1つ1つ取り出し、変数セルに
            strWORK = strWORK & ppCell.Shape.TextFrame.TextRange.Text & ","
            '↑テキストを追記して、カンマ区切り(最後の,は気にしないでね)
        Next
        Debug.Print strWORK
    Next

6.ページ、表の名前、行、列を指定してデータをセットする

ActivePresentation.Slides(2).Shapes("表 2").Table.Cell(3,2).Shape.TextFrame.TextRange.Text = "ABCD"

https://youtu.be/wHjsfRG5HHo?t=743
※急ぎの人は↑ 12:23 から視聴してください。

ActivePresentation.Slides(2).Shapes("表 2").Table.Cell(3,2).Shape.TextFrame.TextRange.Text = "文字列"

一行紹介の動画でOKなのに無駄に長く、
型宣言して型にハメながら ステップ実行してみます。
※見捨てないで最後まで視聴していただけるとありがたいです。。。


Option Explicit

Sub test20221028ppシェイプが表なのかチェックするには()

    '念のためチェック
    If ActiveWindow.Selection.Type <> ppSelectionShapes Then
        MsgBox "Shape 表、図形やテキストボックスを選択してから実行してね"
        Exit Sub
    End If
    
    'テストなので、一番目だけ代入(複数選択は無視)
    Dim ppShp As PowerPoint.Shape
    Set ppShp = ActiveWindow.Selection.ShapeRange(1)
    Debug.Print "ppShp.Name=" & ppShp.Name

    'シェイプが表か?チェックするには.HasTableでチェック
    Debug.Print "ppShp.HasTable=" & ppShp.HasTable
    If ppShp.HasTable = msoFalse Then  'テーブルじゃなかったら
        MsgBox "Shape 表を選択してね", vbExclamation
        Exit Sub
    End If

    'テストなので、表のオブジェクトに再代入
    Dim ppTable As PowerPoint.Table
    Set ppTable = ppShp.Table

    '↑テーブルは行と列を持ってます
    Debug.Print "行 ppTable.Rows.Count=" & ppTable.Rows.Count
    Debug.Print "列 ppTable.Columns.Count=" & ppTable.Columns.Count
    
    '↑ってことは、セル?もあるんでしょ?
    Dim ppCell As PowerPoint.Cell
    Set ppCell = ppTable.Cell(1, 1) '.Cell(行,列)メソッドで取り出す
    Debug.Print "ppCell.Shape.TextFrame.TextRange.Text=" & ppCell.Shape.TextFrame.TextRange.Text
    '↑.Textまでが、長いね・・・
    'もちろん、Set ppCellにわざわざ、入れないで
    'ppTable.Cell(1, 1).Shape.TextFrame.TextRange.Text でいいんですよ。

    '表をループで取り出す、パターン1
    Dim x As Integer, y As Integer
    Dim strWORK As String
    
    Debug.Print "表をループで取り出す、パターン1"
    Debug.Print "行、列がわかるなら、Cell(y,x)のループで回す"
    Debug.Print "カンマ区切りでデバッグ表示"
    For y = 1 To ppTable.Rows.Count '行数分ループ
        strWORK = y & "行目:"
        For x = 1 To ppTable.Columns.Count '列数のループ
            Set ppCell = ppTable.Cell(y, x) '.Cell(行,列)メソッドで取り出す
            strWORK = strWORK & ppCell.Shape.TextFrame.TextRange.Text & ","
            '↑テキストを追記して、カンマ区切り(最後の,は気にしないでね)
        Next x
        Debug.Print strWORK  '↑で作った文字列を表示
    Next y

  Debug.Print "---"
  Debug.Print "表をRowsからループで取り出す、パターン2"

    '次はRowsで行単位に処理してみたり
    '2行目のデータをTESTで取り出し、表示してみる
    strWORK = "単体、2行目テスト:"
    Dim ppRow As PowerPoint.Row  '※Row単体、行です、Rowsは行の集合なので
    Set ppRow = ppTable.Rows(2)  'Rows(2)で2行目のデータ
    For Each ppCell In ppRow.Cells  '行Rowに含まれるCellsを1つ1つ取り出し、変数セルに
        strWORK = strWORK & ppCell.Shape.TextFrame.TextRange.Text & ","
        '↑テキストを追記して、カンマ区切り(最後の,は気にしないでね)
    Next
    Debug.Print strWORK
    
    '↑みたいに、Rowsから取り出すループもよく見かけます
    Debug.Print "---"
    Debug.Print "Rowsから1行単位で取り出し、Cellのループで回す"
    Debug.Print "カンマ区切りでデバッグ表示"
    
    y = 0  '変数yで行カウンタ管理をするなら、いまいち?
    For Each ppRow In ppTable.Rows  'TableのRowsに含まれる行Rowを1つ1つ取り出し処理
        y = y + 1
        strWORK = y & "行 Row:"
        For Each ppCell In ppRow.Cells  '行Rowに含まれるCellsを1つ1つ取り出し、変数セルに
            strWORK = strWORK & ppCell.Shape.TextFrame.TextRange.Text & ","
            '↑テキストを追記して、カンマ区切り(最後の,は気にしないでね)
        Next
        Debug.Print strWORK
    Next

End Sub

'もちろん、
'ページ数
'表の名前がわかっているなら、直接書く
Sub test20221028pp表にデータをセットする()

    Dim p As Integer  'テスト用のスライドページと表の名前
    Dim str表の名前 As String
    p = 4
    str表の名前 = "表 3"  '表の名前がわかっている場合が多いかな

    Dim ppSlide As PowerPoint.Slide  'スライド
    Set ppSlide = ActivePresentation.Slides(p)

    'テストなので、表のオブジェクトに代入
    Dim ppTable As PowerPoint.Table
    Set ppTable = ppSlide.Shapes(str表の名前).Table

    'あとは、いつものCellなどで表の位置を指定してセットする
    '↑ってことは、セル?もあるんでしょ?
    Dim ppCell As PowerPoint.Cell
    Set ppCell = ppTable.Cell(1, 1) '.Cell(行,列)メソッドで取り出す
    
    ppCell.Shape.TextFrame.TextRange.Text = "こんな感じでセット"

    '↑分割したけど、下記のように頭からセットできます
    ActivePresentation.Slides(4).Shapes("表 3").Table.Cell(5, 5) _
                .Shape.TextFrame.TextRange.Text = "長いけど"
    
End Sub



こちらも参考に
ken3memo.hatenablog.com
また、 #PowerPointVBA 関係の再生リストは下記
VBA PowerPoint パワポのマクロやイベント処理ほか - YouTube
https://www.youtube.com/playlist?list=PL0A71039FF3AB25D5

Ken3 ホームページ 目次

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

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



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