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

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

ただいまの
回答率

90.99%

  • VBA

    1420questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 179

tanaka1202

score 6

実現したいこと

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

発生している問題

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

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

powerpoint 2010

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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/18 09:42

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/17 13: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とならないと思いますが、
    どのように実施しているのでしょうか。
    よろしくお願いします。

    キャンセル

  • 2018/01/17 13: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型変数に入れて対応してます。

    キャンセル

  • 2018/01/17 13: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になりません。

    キャンセル

  • 2018/01/17 16:35

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

    キャンセル

  • 2018/01/17 16: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
    という感じにするのはどうでしょうか?

    キャンセル

  • 2018/01/18 09:41

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

    キャンセル

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1420questions

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