[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.080 Excelのセル範囲をHTMLの表(.html)にしてみる

Excelのセル範囲をHTMLの表(.html)にしてみる

メルマガ発行内容

<Excelのセル範囲をHTMLの表(.html)にしてみる>

どうも、三流プログラマーのKen3です。 今回は、 Excelの表をHTMLの表にしてみたいと思います。 標準であるけど、練習を兼ねて。 http://www.ken3.org/p/lzh/office-015.lzh に今回のサンプル保存されてます。 あわせてみてください。

/* * 1.仕様書、書いてますか? */

まずは、要求をまとめるんだっけ。 セルの範囲を選択させる ファイル ブックのパス\test.htmlでHtmlのテーブルを作成する IEを起動して、test.htmlを表示する。 なんかラフ過ぎない? 仕様書 書く側 と 受取り側(要求仕様書、基本設計書、詳細設計書) http://www.ken3.org/vba/doc.html では、もっと詳細に書いてた気がするけど。

/* * 2.初期捜査、初動捜査 */

セルの範囲を選択するのは、 Dim objHANI As Range '選択されたセルの集合 とオブジェクト変数を宣言してから、 Set objHANI = Application.InputBox(prompt:="セルを選択", Type:=8) .InputBoxを使用して、セルを選択させる ポイントはType:=8で文字列ではなくオブジェクトを返すことです。 Application.InputBox で Rangeを受け取る解説は、 No.11 InputBox関数で簡単な値を受け取る http://www.ken3.org/backno/backno_vba03.html#11 を参照してください。 InputBox関数とApplication.InputBoxメソッドの違いが書いてあります。 選択されたか?をチェックしたいので、 If IsEmpty(objHANI) Then 'キャンセルが押されたかチェックする MsgBox "キャンセルが押されました" End If と IsEmpty関数を使用してチェックしてます。 選択された範囲に対して、 MsgBox objHANI.Rows.Count '行数 MsgBox objHANI.Columns.Count '列数 を取り出すことができます。 No.51 Excel Range オブジェクトを使う http://www.ken3.org/backno/backno_vba11.html#51 で、 objHANI.Rows.Countの行カウントと、 ~~~~~~~~~~~ objHANI.Columns.Count列カウントです。 ~~~~~~~~~~~~~~ Rangeについて、軽く書いてます。 範囲が選択できたら、ファイルの書き込みかぁ、 パターン化になっているけど、 Freeファイルであいているファイル番号を取り出し、 Open Write Close Print #FNO, "XXXXXXX"; とセミコロンを付けると改行されないのもポイントです。 テキストファイル関係は、 ^^^^^^^^^^^^^^^^^^^^^^^^ No.27 テキストファイル処理 ファイルへの書き込み http://www.ken3.org/backno/backno_vba06.html#27 Open Close Print # No.29 テキストファイル処理 ファイルからの読み込み http://www.ken3.org/backno/backno_vba06.html#29 Line Input # Eof関数 No.31 Write #で ””を付けた書き込み http://www.ken3.org/backno/backno_vba07.html#31 Write # No.33 FreeFile関数で空いてるファイル番号を返す方法 http://www.ken3.org/backno/backno_vba07.html#33 FreeFile で、簡単な解説を書いてます。 IEの起動は、 ^^^^^^^^^^^^^^ Dim objIE As Object 'IEオブジェクト参照用 と、オブジェクト変数を定義して、 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") CreateObjectを使用して、IEのオブジェクトを作成。 objIE.Visible = True '見えるようにする(お約束) objIE.Navigate strFNAME '文字列で指定したURLに飛ぶ と、メソッド(動作)を使用して、URLを開きます。 No.50 IE起動 CreateObject("InternetExplorer.application") http://www.ken3.org/backno/backno_vba11.html#50 で、 IEのオブジェクト、起動方法を解説してます。

/* * 3.固定処理で作成するか */

Sub test15_1()

    'Application.InputBoxでセルを選択させる
    Dim objHANI As Range '選択されたセルの集合
    Set objHANI = Application.InputBox(prompt:="セルを選択", Type:=8)
    If IsEmpty(objHANI) Then 'キャンセルが押されたかチェックする
        MsgBox "キャンセルが押されました"
        Exit Sub
    End If

    'ファイルをオープンする
    Dim FNO      As Integer  'ファイル番号
    Dim strFNAME As String   'ファイル名保存用
    FNO = FreeFile '空いてるファイル番号を取出す
    strFNAME = ThisWorkbook.Path & "\test.html" 'ファイル名を作る
    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  '列のループ
            'セルの値を<TD>で囲って出力
            Print #FNO, "<TD>" & objHANI.Cells(y, x).Value & "</TD>";
        Next x
        Print #FNO, "</TR>"  '行の終了タグ
    Next y

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

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

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

    '終わりの挨拶
    MsgBox strFNAME & "を作成しました"

End Sub
なんか、調べたことを縦につなげただけですね。 これだと、エラーが起きたときの切り分けや、汎用性が無い、 そこで、関数分割します。

/* * 4.分割のポイント */

分割のポイントは、 メインの流れを処理するルーチン と 各機能を処理するサブルーチン に分け、変数で値を渡しながら処理します。 関数に汎用性を持たせる、共通に使える関数作り http://www.ken3.org/vba/vba-hanyo.html も合わせて読んでみてください。 まずは、メイン処理のブロックを分けます。 これは、慣れないうちは日本語の箇条書きのイメージで書きます。
Sub Main()
    'セル範囲の選択
    'ファイルを開き、データの書き込み
    'IEの起動、テスト表示
End Sub
と、3つのブロックに分ける予定です。 次は、何を貰って、何をやらせて、何を返すか?と関数の設計です。 セル範囲の選択、 これは、エクセルの.InputBoxを使うので、ユーザー関数は無しで、 ファイルを開き、データの書き込み処理では、 パラメータでファイル名とセルのオブジェクトを受け取ります。 処理は、ファイルを開き、セルの内容を出力します IEの起動、テスト表示部では、 確認したいファイル名を受け取り、 IE起動、URLを開きます。
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 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  '列のループ
            'セルの値を<TD>で囲って出力
            Print #FNO, "<TD>" & objHANI.Cells(y, x).Value & "</TD>";
        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
分割をすると、保守性があがったと思います。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 何をやっているのかが、各関数にわけると、わかりやすいと思います。

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

さて、テストしますか。 まぁ、それなりに動いてます。 が、 いろいろと穴があります。 ^^^^^^^^^^^^^^^^^^^^^^^^ http://www.ken3.org/p/lzh/office-015.lzh に今回のサンプル保存されてます。 あわせてみてください。 数字が左詰になっているよ、、、 バックカラーが変わっていない、、 テストすればするほど、いろいろとでてきます。 要望がまとまってきたら、機能追加ですよね。 次回は問題点のまとめ方と機能追加です。 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってますが、 なかなかうまくは行いかないね。。 拾い読みして、 1つでも何かの参考となれば幸いです。 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系バックナンバー目次へ移動]