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でチェック 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で表をセル単位で処理
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