[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.098 Excelセルの結合を探る、結合セルをHTML表化する

Excelセルの結合を探る、結合セルをHTML表化する

メルマガ発行内容

<Excelセルの結合を探る、結合セルをHTML表化する>

どうも、三流プログラマーのKen3です。 今回は、 Excelの結合されたセル から HTMLの表を作成してみたいと思います。 結合されたセルの処理やHTMLの表作成で、 何かの参考となれば、幸いです。 ※まだまだ、まともなツールへの道は遠いけどね・・・ http://www.ken3.org/p/f/lzh/office-020.lzh に今回のサンプル保存されてます。 あわせてみてください。 関連項目は、 Excel HTML表作成ツールもどき No.80 Excelのセル範囲をHTMLの表(.html)にしてみる No.81 セルの右寄せ、中央寄せをHTMLの表にしてみる No.82 背景色、フォントカラーをHTMLの表にしてみる No.83 改行LFを<BR>などHtml用にエンコードして書き込む http://www.ken3.org/backno/backno_vba17.html も合わせてみて下さい。

/* * 1.事前調査、セルの結合 */

隣や下のセルをつなげて、1つのセルにする。 そんな表を見たことありますよね。 ↑セルプロパティの設定画面 プロパティを知りたかったので、 いつものマクロ記録で記録してみました。 ^^^^^^^^^^^^^^^^^^ Range("B6:C6").Select With Selection .HorizontalAlignment = xlRight .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = True End With Range("D6:D7").Select With Selection .HorizontalAlignment = xlRight .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = True End With さてと、それらしいのは、 おっ、.MergeCells = Trueってのが怪しそうですね。 .MergeCellsにカーソルを合わせて、 F1(Help)を押して、探ってみます。 MergeCells プロパティ True の場合、セル範囲またはスタイルが結合セルを含みます。 値の取得および設定が可能です。バリアント型 (Variant) の値を使用します。 解説 結合されたセルが含まれるセル範囲を選択すると、指定したセル範囲と実際の セル範囲が異なる場合があります。選択したセル範囲のアドレスを調べるには、 Address プロパティを使用します。 使用例 次の使用例は、セル A3 がある結合セル範囲に値を設定します。 Set ma = Range("a3").MergeArea If Range("a3").MergeCells Then ma.Cells(1, 1).Value = "42" End If なんだか、よくわからないなぁ(笑)。

/* * 2.簡単に確認してみる。 */

Range("B6:C6").Select を結合したので、 ? Range("A6").MergeCells False ? Range("B6").MergeCells True ? Range("C6").MergeCells True と、B6とC6が結合されているのは、わかった。 Dim ma As Range Set ma = Range("b6").MergeArea Debug.Print ma.Address Set ma = Range("c6").MergeArea Debug.Print ma.Address とやると、 $B$6:$C$6 $B$6:$C$6 と同じ値が表示される。 左上の値を(1,1)判断するために、 Dim ma As Range Set ma = Range("b6").MergeArea Debug.Print ma.Address Debug.Print ma.Cells(1, 1).Address とテストすると、 $B$6:$C$6 $B$6 cells(1,1)で左上を判断できるので、(結合されたはじめの位置を知りたいので) 現在のセルが結合されているか?は、 .MergeCellsで判断 .MergeAreaで結合範囲を取り出しcells(1,1).addressで左上判断 これを組み込んでみます。

/* * 3.HTML作成データに組み込む */

Sub Main()

    'Application.InputBoxでセルを選択させる
    Dim objTARGET As Range '選択されたセルの集合
    Set objTARGET = Application.InputBox(prompt:="セルを選択", Type:=8)
    If IsEmpty(objTARGET) Then 'キャンセルが押されたかチェックする
        MsgBox "キャンセルが押されました"
        Exit Sub
    End If
    
    'ファイル名を作成 ファイル名は自分のパス+\test.html
    Dim strFNAME As String   'ファイル名保存用
    strFNAME = ThisWorkbook.Path & "\test.html" 'ファイル名を作る

    'テーブルデータを作成する
    Call MAKE_HTML_TABLE(strFNAME, objTARGET)

    'できたファイルをIEで表示して確認する
    Call IE_OPEN_URL(strFNAME)  'ファイル名を渡す

    '終わりの挨拶
    MsgBox strFNAME & "を作成しました"
    
End Sub
'ファイル名とセルの範囲RANGEを受け取り、 'ファイルを開きHTMLのテーブルを作成する
Sub MAKE_HTML_TABLE(strFNAME As String, objHANI As Range)

    Dim strCOLOR As String
    Dim strR As String
    Dim strG As String
    Dim strB As String
    Dim objMA As Range   'リンクの範囲
    Dim strTD As String

    'ファイルをオープンする
    Dim FNO      As Integer  'ファイル番号
    FNO = FreeFile '空いてるファイル番号を取出す
    Open strFNAME For Output As #FNO  'テキストファイルを新規作成

    'HTMLのヘッダーを書く
    Print #FNO, "<HTML><HEAD><TITLE>"
    Print #FNO, "テーブル作成してみました"
    Print #FNO, "</TITLE></HEAD>"
    Print #FNO, "<BODY>"
    Print #FNO, "<TABLE border=1>"  'テーブルの開始

    '行、列でループを作る
    Dim y As Integer
    Dim x As Integer
    For y = 1 To objHANI.Rows.Count         '行のループ
        Print #FNO, "<TR>"  '行の開始タグ
        For x = 1 To objHANI.Columns.Count  '列のループ
            'ALIGNを調べて書き込む
            Select Case objHANI.Cells(y, x).HorizontalAlignment
                Case xlRight:
                    strTD = "<TD ALIGN='RIGHT'"
                Case xlLeft:
                    strTD = "<TD ALIGN='LEFT'"
                Case xlCenter:
                    strTD = "<TD ALIGN='CENTER'"
                Case Else  'その他設定無しのとき
                    strTD = "<TD"
            End Select
            'バックカラーを調べる
       strCOLOR = Right("000000" & Hex(objHANI.Cells(y, x).Interior.Color), 6)
            If strCOLOR <> "FFFFFF" Then  '白以外の時処理
                strR = Mid(strCOLOR, 5, 2)
                strG = Mid(strCOLOR, 3, 2)
                strB = Mid(strCOLOR, 1, 2)
                strTD = strTD & " BGCOLOR=#" & strR & strG & strB
            End If
            'セルの結合を判断する
            If objHANI.Cells(y, x).MergeCells = True Then '結合セルか?
                Set objMA = objHANI.Cells(y, x).MergeArea 'エリアを取り出す
                If objMA.Cells(1, 1).Address = objHANI.Cells(y, x).Address Then
                    '左上なら
                    If objMA.Columns.Count <> 1 Then
                        strTD = strTD & " COLSPAN=" & objMA.Columns.Count
                    End If
                    If objMA.Rows.Count <> 1 Then
                        strTD = strTD & " ROWSPAN=" & objMA.Rows.Count
                    End If
                    Print #FNO, strTD & ">"; 'タグを閉じ出力
                Else
                    '結合セルでその他なら、データを書かないでOKなら
                    strTD = "" 'タグをクリア(データを出さない)
                End If
            Else
                Print #FNO, strTD & ">"; 'タグを閉じ出力
            End If
            'フォントの色を調べる
            strCOLOR = Right("000000" & Hex(objHANI.Cells(y, x).Font.Color), 6)
            If strCOLOR <> "000000" Then  '黒以外の時処理
                strR = Mid(strCOLOR, 5, 2)
                strG = Mid(strCOLOR, 3, 2)
                strB = Mid(strCOLOR, 1, 2)
                If strTD <> "" Then '出力ありなら
                    Print #FNO, "<Font Color=#" & strR & strG & strB & ">";
                End If
            End If
            If strTD <> "" Then '出力ありなら
                'セルの中身を変換して書き込む*018で追加
                Print #FNO, htmlEnCode(objHANI.Cells(y, x).Value);
                'フォントのタグを閉じる
                If strCOLOR <> "000000" Then  '黒以外の時処理
                    Print #FNO, "</Font>";
                End If
                'タグを閉じる
                Print #FNO, "</TD>";
            End If
        Next x
        Print #FNO, "</TR>"  '行の終了タグ
    Next y

    'HTMLのタグを閉める
    Print #FNO, "</TABLE>"
    Print #FNO, "</BODY></HTML>"

    'ファイルをクローズする
    Close #FNO

End Sub
'URLを受け取り、IEを起動、URLを開く
Sub IE_OPEN_URL(strURL As String)

    'IEを起動して、表示
    Dim objIE    As Object  'IEオブジェクト参照用
    
    'インターネットエクスプローラーのオブジェクトを作る
    Set objIE = CreateObject("InternetExplorer.application")
    
    objIE.Visible = True '見えるようにする(お約束)
    objIE.Navigate strURL  '文字列で指定したURLに飛ぶ

End Sub
'文字列を受け取り、変換結果を返す
Function htmlEnCode(strMOTO As String) As String

    Dim strCHK As String  'チェックする文字
    Dim strSET As String  'セットする文字
    Dim strWORK As String '結果を入れる作業変数
    Dim n As Integer  'カウンター

    '結果をまず初期化する
    strWORK = ""
    
    '文字数分ループする
    For n = 1 To Len(strMOTO)
        strCHK = Mid(strMOTO, n, 1) 'チェックする文字を取り出す
        Select Case Asc(strCHK)  '文字をチェックする
            Case &H20: strSET = "&nbsp;" 'スペース
            Case &H3C: strSET = "&lt;"   '<
            Case &H3E: strSET = "&gt;"   '>
            Case &H26: strSET = "&amp;"  '&
            Case &H22: strSET = "&quot;" '"
            Case &HA: strSET = "<br>"     '改行
            Case Else: strSET = strCHK  'その他の文字はそのままセット
        End Select
        '文字列を作る
        strWORK = strWORK & strSET
    Next n

    '作られた文字列をリターン値としてセットする
    htmlEnCode = strWORK

End Function
ポイントは、 ~~~~~~~~~~~~ 'セルの結合を判断する If objHANI.Cells(y, x).MergeCells = True Then '結合セルか? Set objMA = objHANI.Cells(y, x).MergeArea 'エリアを取り出す If objMA.Cells(1, 1).Address = objHANI.Cells(y, x).Address Then '左上なら If objMA.Columns.Count <> 1 Then strTD = strTD & " COLSPAN=" & objMA.Columns.Count   End If If objMA.Rows.Count <> 1 Then strTD = strTD & " ROWSPAN=" & objMA.Rows.Count End If Print #FNO, strTD & ">"; 'タグを閉じ出力 Else '結合セルでその他なら、データを書かないでOKなら strTD = "" 'タグをクリア(データを出さない) End If Else Print #FNO, strTD & ">"; 'タグを閉じ出力 End If と、結合セルか判断して、 COLSPAN=,ROWSPAN=とTDの結合タグ指定しました。 結合されていれば、その分、COLSPAN=2やROWSPAN=2で、HTMLの結合表を作成してます。 結合セルの初め(左上の1,1)以外は出力しなくていいので、 ※COLSPAN=2やROWSPAN=2で指定されているので、 '結合セルでその他なら、データを書かないでOKなら strTD = "" 'タグをクリア(データを出さない) と変数をクリア。 もし、TDタグの出力が無ければ、値も出さなくていいので、 If strTD <> "" Then '出力ありなら 'セルの中身を変換して書き込む*018で追加 Print #FNO, htmlEnCode(objHANI.Cells(y, x).Value); 'フォントのタグを閉じる If strCOLOR <> "000000" Then '黒以外の時処理 Print #FNO, "</Font>"; End If 'タグを閉じる Print #FNO, "</TD>"; End If と、 データの出力の判断で使用しました。 ↑テスト画面、なんとか動作しました。。。

/* * 4.終わりの挨拶 */

まぁ、それなりに動いたけど、 すごく、長くなりましたね。 http://www.ken3.org/p/f/lzh/office-020.lzh に今回のサンプル保存されてます。 あわせてみてください。 スマートにまとめる方法を考えないと。 使えるルーチンにまとめて、 将来はグラフを選択したら、グラフはgifに選択範囲のデターをHTMLに落とす。 そんなツールを作ってみたいと思います。 でも、まだまだ、ですね。 次回は、もう少しマシなの作りたいですね。 ※できたら、世に出せるくらいのツールになるといいけど、、、 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってます。 よろしくお願いします。 ※ハヤク、効果のあるツール、サンプルを作らないと、、、 Excel/Access大好き、三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]