質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1125閲覧

パワーポイントのプレゼンテーションに挿入されている表をVBAで処理する場合について

fzrtera

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/10/26 03:21

編集2021/10/26 04:08

お疲れ様です。

powerpointのvbaで表を対象とした処理で結合セルを含んでいても見た目上のセル全てのみについて処理する方法はないでしょうか。

powerpointのvbaで表を対象とした処理を実行する際についてです。

パワーポイントのプレゼンテーションに挿入されている表の各セルの値についてvbaで値の一致、不一致処理を行うと下記のような処理結果となりました。

1 表は結合されているセルの有無に関わらず列×行のセル数として認識される
2 結合されているセルについて値を参照すると見えていない結合前のセル全てに結合後のセルの値が入っている。

上記のような動作結果なので見た目上のセル数とvbaで実行した際のセル数が一致しないのでvbaの実行結果では一致数、不一致数が見た目上よりも多くなってしまいます。
例 列3×行3の表があり、行2の3列が結合されていてもvba上での表のセル数は3×3の9つと認識されている。

表の全てのセルを参照させるのはTable.Rowsのfor eachの中にTable.Columnsのfor eachを入れ子にして実行しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2021/10/26 03:30

質問は何でしょうか。
guest

回答1

0

ベストアンサー

きれいに取得する方法が見つからなかったので、無理やり作ってみました。

VBA

1Function TableCells(tbl As Table) As Collection 2 3 Dim dic 'As New Scripting.Dictionary 4 Set dic = CreateObject("Scripting.Dictionary") 5 6 Set dic("1 1") = tbl.Rows(1).Cells(1) 7 8 Dim i, j, c 9 For i = 1 To tbl.Rows.Count 10 For j = 1 To tbl.Columns.Count 11 c = i & " " & j 12 If tbl.Rows(i).Cells(j).Selected = False Then 13 Set dic(c) = tbl.Rows(i).Cells(j) 14 End If 15 tbl.Rows(i).Cells(j).Select 16 Next j, i 17 18 For j = 1 To tbl.Columns.Count 19 For i = 1 To tbl.Rows.Count 20 c = i & " " & j 21 If dic.Exists(c) And tbl.Rows(i).Cells(j).Selected Then 22 dic.Remove i & " " & j 23 End If 24 tbl.Rows(i).Cells(j).Select 25 Next i, j 26 27 Set TableCells = New Collection 28 For Each c In dic 29 TableCells.Add dic(c), c 30 Next 31 32End Function

VBA

1Sub sample() 2 3 Dim shp As Shape 4 Set shp = ActivePresentation.Slides(1).Shapes(1) 5 Dim tbl As Table 6 Set tbl = shp.Table 7 8 Dim coll As Collection 9 Set coll = TableCells(tbl) 10 11 Debug.Print coll.Count 12 13 Dim c As Cell 14 For Each c In coll 15 Debug.Print c.Shape.TextFrame2.TextRange.Text 16 Next 17 18End Sub

<追記>
Excelから呼び出すのも同じ感じで行けると思います。
ただ、以下はPowerPointが既に起動している前提で書いているので、
そうでない場合はもう一工夫いるのかもしれません。

VBA

1Sub ExcelVBASample() 2 3 Dim ppap As PowerPoint.Application 4 Set ppap = GetObject(, "Powerpoint.Application") 5 6 Dim shp As PowerPoint.Shape 7 Set shp = ppap.ActivePresentation.Slides(1).Shapes(1) 8 9 Dim tbl As PowerPoint.Table 10 Set tbl = shp.Table 11 12 Dim coll As Collection 13 Set coll = TableCells(tbl) 14 15 Debug.Print coll.Count 16 17 Dim c As Cell 18 For Each c In coll 19 Debug.Print c.Shape.TextFrame2.TextRange.Text 20 Next 21 22End Sub 23

投稿2021/10/28 04:38

編集2021/10/29 15:08
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fzrtera

2021/10/28 05:11

ありがとうございます。 動作の仕組み的にはパワポ上でのセル数全てに対してSelected?を調べて有効なセルかどうかを配列に格納、有効なセルが格納された配列を配列数分参照ということでしょうか。 別件ですが問題のあるコードを貼り付けて更新したと思っていたのですが反映されていませんでした。すみませんでした。
jinoji

2021/10/28 06:36

そうですね。 一つ手前のセルをセレクトしてから、次のセルのセレクト状態を確認する。 もし次のセルもSelectedになっているなら、それは前のセルと結合されているからだ、という理屈で 全部のセルを順番にチェックしていく感じです。それを、横方向と縦方向で確認しています。
fzrtera

2021/10/29 10:49

ありがとうございます。 excelからパワーポイントを参照させる処理でも動作させることは難しいでしょうか。 試してみたのですがselectの状態取得がexcelからはうまく行えませんでした。
fzrtera

2021/10/30 12:38

ありがとうございました。 ろExcelでも正しく動作しました。 また、参照設定無しで動作させたかったのでとりあえずエラーとなった宣言を全てobjectにしてみたところExcelでも正しく動作しました。 ご対応いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問