エクセルVBAでセルが結合されているかどうか、またそのセルの数を判定する方法

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルの表をHTML形式のテーブルしてHTMLファイルに出力する方法というのを前回こちらの記事でお伝えしました。

429 Too Many Requests

エクセルの表が行と列で理路整然とおとなしく作られていればいいんですが…

セルの結合がされているときはどうすれば良いでしょうか??

今回はエクセルVBAでセルが結合されているかどうか、またその結合されているセルの数を判定する方法を使って、結合セルがある場合でもHTML形式に出力できるように修正していきたいと思います。

スポンサーリンク

セルの結合を判定するプログラムの概要

エクセルで例えばこんな表を作ってみました。

セル結合を含むエクセル表

この表の各セルについて結合されているかどうか、またその結合されている数を判定するVBAプログラムを作ってみたいと思います。

どのように作れば良いですかね…?

流れとしては

  • 1行目から5行目まで繰り返し
    • A1セルから列方向にE1セルまで繰り返し
      • 今いるセルが結合されているセルであれば
        • その結合数を調べて出力
      • 結合セル分列移動(結合なしであれば1)

という流れでいければと思います。

MergeCellsでセルが結合されているか判定する

特定のセルが結合されているかを判定する場合はMergeCellsプロパティを使います。

Rangeオブジェクト.MergeCells

とします。

Rangeオブジェクトが結合セルに含まれている場合にTrue、そうでない場合はFalseが返ります。

使うときの対象は範囲ではなくて単一セルの場合が多いと思いますけどね。

ワークシートwsの行数i、列数jのセルが結合セルに含まれるかどうかを判定するのであれば

If ws.Cells(i, j).mergeCells Then

    (処理)

End If

とすればセルが結合されているかどうかで処理を分けることができますね。

MergeAreaプロパティで結合セルの範囲を取得

いくつのセルが結合をされているかを調べたいと思います。

その場合は、結合セルの範囲を取得するMergeAreaプロパティを使います。

Rangeオブジェクト.MergeArea

とすれば、Rangeオブジェクトが含まれているセル結合の範囲を取得することができます。

Rangeオブジェクトが単体セルで、かつセル結合もされていない場合は、そのセル自体が返ります。

取得した範囲について、Rows.Countプロパティで列数を取得すれば、いくつのセルが結合されているかを知ることができますね。

例えばワークシートwsの行数i、列数jが含まれる結合セルの列数を取得するのであれば

colSpan = ws.Cells(i, j).MergeArea.Columns.Count

とすればOKです。

この場合、Cells(i,j)が結合されていない単体セルであれば、colSpanには1が返ります。

MergeAreaプロパティを使うと列数以外にも

  • Countプロパティ:セル数
  • Rows.Countプロパティ:行数
  • Addressプロパティ:範囲のアドレス

などが取得できます。

セルの結合を判定するVBAプログラム

以上を使って、与えられたシートの表について結合セルの判定をするプログラムを作ってみました。

'結合セルの調査
Sub mergeCells()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim colSpan As Long

Dim i, j As Long
i = 1
Do While ws.Cells(i, 1).Value <> ""

    j = 1
    Do While ws.Cells(i, j).Value <> ""

        Debug.Print "行:" & i, "列:" & j
        colSpan = 1

        If ws.Cells(i, j).mergeCells Then

            colSpan = ws.Cells(i, j).MergeArea.Columns.Count
            Debug.Print "結合セル数:" & colSpan & vbLf

        End If

        j = j + colSpan

    Loop

    i = i + 1

Loop
End Sub

表のサイズが可変でも動作するように行方向、列方向の繰り返しにはDo While文を使っています。

実行結果

このプログラムの実行結果は

エクセル表のセル結合状態について出力

となります。

セル結合があるセルの位置とその結合数をイミディエイトウィンドウの出力によって知ることができますね。

結合セルを含むエクセル表をHTMLで出力するVBAプログラム

さらにこのプログラムを活用して、結合セルを含むエクセル表をHTMLに変換するVBAプログラムを作ります。

列数が複数の場合のHTML文はtdタグを

とすれば良いですね。

作ったプログラムはこちらです。

Sub convertHTML()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

Dim htmlFile As String
htmlFile = ActiveWorkbook.Path & "table.html"

Open htmlFile For Output As #1

Dim colSpan As Long
Dim i, j As Long
i = 1

Print #1, ""

Do While ws.Cells(i, 1).Value <> ""

    Print #1, vbTab & "";

    j = 1
    Do While ws.Cells(i, j).Value <> ""

        colSpan = 1

        If ws.Cells(i, j).mergeCells Then

            colSpan = ws.Cells(i, j).MergeArea.Columns.Count
            Print #1, "";

        Else

            Print #1, "";

        End If

        j = j + colSpan

    Loop

    Print #1, "" & vbCr;
    i = i + 1

Loop

Print #1, "
" & ws.Cells(i, j).Value & "" & ws.Cells(i, j).Value & "
" Close #1 MsgBox htmlFile & "に書き出しました" End Sub

先のセルの結合を判定するVBAプログラムmergeCellsとほとんど流れとしては変わりませんね。

ちなみに、本プログラムは行方向のセル結合には対応をしていません。

行方向も対応をしようと思うと、プログラムとしてはなかなかに複雑になりそうですよね…機会をみてチャレンジしてみてください。

実行結果

このプログラムを先ほどのエクセル表について実行します。

出力されたHTMLファイルはこちら。

セル結合があるエクセル表を変換したHTML文

このファイルをブラウザーにドラッグすると

セル結合があるエクセル表をHTMLで出力したものをブラウザで表示

このように表示されます。

問題なさそうですね!

まとめ

以上、エクセルVBAでセルが結合されているかどうか、またその数について知る方法について、MergeCellsプロパティとMergeAreaプロパティを使って実現しました。

また、セル結合がエクセル表に含まれている場合にHTMLに変換してファイルに吐き出すプログラムも紹介をしました。

次回ですが、テキストファイル出力の場合に文字コードをUTF-8で出力する方法についてお伝えしたいと思います。

エクセルVBAで文字コードUTF-8のCSVファイルを書き出す方法
エクセルのデータをファイルに書き出す方法シリーズです。今回は、エクセルVBAでADODB.Streamオブジェクトを使ってUTF-8の文字コードのCSVファイルを書き出す方法についてお伝えします。

どうぞお楽しみに。

連載目次:エクセルVBAでCSVや様々なテキストファイルを出力する

多くの企業では様々なデータをエクセル形式で保持しています。そのデータ群をCSVやHTMLなどで有効利用できたら便利ですよね?このシリーズでは、エクセルデータをテキストをはじめ様々な形式のファイルに出力する方法についてお伝えしています。
  1. エクセルVBAでテキストファイルに書き出す最も簡単なプログラム
  2. エクセルVBAでエクセルシート上のデータをCSVファイルに書き出す
  3. エクセルの表をHTMLのtableタグに変換して出力するVBAマクロ
  4. エクセルVBAでセルが結合されているかどうか、またそのセルの数を判定する方法
  5. エクセルVBAで文字コードUTF-8のCSVファイルを書き出す方法
  6. エクセルVBAでBOM無しのUTF-8でCSVファイルなどを出力する方法
タイトルとURLをコピーしました