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

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

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

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

Q&A

解決済

2回答

1745閲覧

【VBA】PowerPointの表でセルの結合状態を調べる方法

tanaka1202

総合スコア14

VBA

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

0グッド

1クリップ

投稿2018/01/17 01:13

###実現したいこと
PowerPointの表内のセルを指定して結合の有無と結合行数とカラム数を取得したい。

###発生している問題
結合の有無と結合行数とカラム数を取得できるプロパティが見当たらない。
対象のプロパティをご教授ください。

###補足情報(言語/FW/ツール等のバージョンなど)
powerpoint 2010

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

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

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

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

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

guest

回答2

0

ベストアンサー

セルは結合状態のプロパティを持っていない

PowerPointの表(Table)にはExcelに似たセルの結合機能があります。
しかしExcelにあるような結合の解除という機能はなく、これに該当するのはセルの分割機能になります。

この分割機能がExcelの結合解除と決定的に違うところは、結合していないセルも分割できるところです。

例えば3x3のテーブルがあり、座標(2,2)のセルを2行・2列に分割すると、見た目上は中央の1セルが2x2に分割された状態になります。

しかしそれは表面的な変化というだけで、実際には2列目の右に3列目が挿入され、2行目の下に3行目が挿入され、全体のテーブルサイズが4x4となっています。
加えて、結合前に2列目だった列のセルは、分割セルである(2,2)~(3,3)を除いて、2列目と3列目で結合されます。
同様に、結合前に2行目だった行のセルは、分割セルである(2,2)~(3,3)を除いて、2行目と3行目で結合されます

結果的に、分割指定したセルを基点として、周辺の列・行が結合された状態ができあがります。

表面上は中央のセルが2x2に分割されただけのように見えますが、表全体として変わっているのはむしろ周辺の行・列の方です。

ここらへんがセル単位に結合状態のプロパティを持てない要因ではないかと(勝手に)思っています。

結合状態の判別方法

結合状態を調べたいセルをSelectすると、結合セルであれば結合しているすべてのセルでSelectedプロパティがTrueになります。
全てのセルでSelectedプロパティがTrueの数を数え、1なら単一セル、2以上なら結合セルと判断できます。

サンプルコード

'メイン処理 Sub Sample() With ActivePresentation.Slides(1).Shapes(1).Table '※とりあえず座標(1,1)をチェック If IsMerged(.Cell(1,1)) Then Msgbox "結合されてます" ElseIf Msgbox "結合されてません" End If End With End Sub '指定されたセルが結合セルか判定する関数 Function IsMerged(vCell As Cell) As Boolean Dim bRet As Boolean bRet = False '調査するセルを選択する vCell.Select '選択状態のセルが複数見つかれば結合セルと判断 If SelCount(vCell.Parent) > 1 Then bRet = True IsMerged = bRet End Function '指定した表で選択されているセルの数を返す関数 Function SelCount(vTbl As Table) As Integer Dim iCnt As Integer iCnt = 0 Dim r As Integer Dim c As Integer '表内の全セルをループ処理 For r = 1 To vTbl.Rows.Count For c = 1 To vTbl.Columns.Count '選択されているセルの数をカウント If vTbl.Cell(r, c).Selected Then iCnt = iCnt + 1 End If Next c Next r SelCount = iCnt End Function

ちょっと力技ではありますが、一つの方法としてご紹介しました。
参考になれば幸いです。

投稿2018/01/17 06:35

編集2018/01/17 07:10
jawa

総合スコア3013

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

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

tanaka1202

2018/01/18 00:42

ご回答ありがとうございます。 今回はこちらで実装しようと思います。
guest

0

Wordでも無く、Table型変数のRows.Count、Columns.Countで
Cells()配列を作成し、
無理やりその中に各セルをセットしていき、
後からNothingの範囲を数えています。

投稿2018/01/17 01:28

ExcelVBAer

総合スコア1175

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

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

tanaka1202

2018/01/17 04:00

ご回答ありがとうございます。 >無理やりその中に各セルをセットしていき、後からNothingの範囲を数えています。 の部分についてもう少し詳細な話をお伺いしたいです。 Dim arr() As String Dim i As Long Dim j As Long With ActivePresentation.Slides(1).Shapes(1).Table  ReDim arr(1 To .Rows.count, 1 To .Columns.count)   For i = 1 To .Rows.count    For j = 1 To .Columns.count     arr(i, j) = .Rows(i).Cells(j).shape.TextFrame.TextRange.Text    Next j  Next i End With みたいなものをイメージしたのですが、 これだと仮に1行目の1カラム目と同行の2カラム目が結合されていた場合に .Rows(1).Cells(1).shape.TextFrame.TextRange.Text .Rows(1).Cells(2).shape.TextFrame.TextRange.Text で同値が入ってきてしまい2カラム目がNothingとならないと思いますが、 どのように実施しているのでしょうか。 よろしくお願いします。
ExcelVBAer

2018/01/17 04:11

下記の感じでCell配列を作成し、 その後で、様々な処理に使ってます。 Dim Cells As Cell() On Error Resume Next Set Cells(i, j) = .Cells(i,j) On Error GoTo 0 ※こちらの環境では「As Cell()」を「As Object()」としてます。  理由は、Word環境+コードが多い場合に、  不明なコンパイルエラーが発生した為です。  なので、Cells(i,j) を Cell型変数に入れて対応してます。
tanaka1202

2018/01/17 04:34

何度もすみません。 Dim arr() As Object Dim i As Long Dim j As Long With ActivePresentation.Slides(1).Shapes(1).Table  ReDim arr(1 To .Rows.count, 1 To .Columns.count)   For i = 1 To .Rows.count    For j = 1 To .Columns.count     Set arr(i, j) = .Cell(i,j)    Next j  Next i End With としましたが、結合しているセルを読込んでも「.Cell(i,j)」がNothingになりません。
ExcelVBAer

2018/01/17 07:35

すみません。Wordとパワポでは仕様が違うようですね。。。
ExcelVBAer

2018/01/17 07:59

力技になってきますが、取り急ぎの案として、 Cell の位置情報(Cell.Shape.Top、.Left)を使って判別するのはどうでしょう? Dictionaryを使い、 Dim Dic As New Scripting.Dictionary Dim Key As String Key = "Top:" & Cell.Top & "," & "Left:" & Cell.Left If Dic.Exist(Key ) = False Then Dic.Item(Key) = Empty Set arr(Row, Col) = .Cell(Row,Col) End If という感じにするのはどうでしょうか?
tanaka1202

2018/01/18 00:41

ご回答ありがとうございます。 確かにセルの位置情報を使えば実現できますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問