[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.083 改行LFを<BR>などHtml用にエンコードして書き込む

改行LFを<BR>などHtml用にエンコードして書き込む

メルマガ発行内容

<改行LFを<BR>などHtml用にエンコードして書き込む>

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

/* * 1.追加機能や足りない機能、使っていっての要望をまとめる */

前回、表の基本形を書き込めました。 なんとか、 ・右寄せ左寄せ、中央寄せのパターン ・背景色、フォントの色に対応 を書きました。 まだまだ、機能的に足りないだけど、 今回は、 HTMLで無視されてしまうスペース、改行 や <>%”を変更してみたいと思います。

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

セルへの入力で、Alt+リターンでセル内で改行することが出来ます。 AAA BBB みたいに2行で書くことが出来ます。 A1列にテストでAAA(Alt+Return)BBBと入力します。 中に入っている文字コードを表示してみます。
Sub codetest()

    Dim strMOJI As String
    Dim n As Integer
    
    For n = 1 To Len(Range("A1").Value)
        strMOJI = Mid(Range("A1").Value, n, 1)
        Debug.Print "[" & strMOJI & "]code=" & Hex(Asc(strMOJI))
    Next n

End Sub
実行結果は、 [A]code=41 [A]code=41 [A]code=41 [ ]code=A [B]code=42 [B]code=42 [B]code=42 となります。 &h0A(LF)が改行コードです。 これをHTMLの<BR>に直します。 スペースは、&nbsp; また、下記の4つの文字もHTMLへそのまま出力すると、 問題があるのでエンコードします。 < &lt; > &gt; & &amp; " &quot; ※htmlで表現できない文字と、改行に対応してみたいと思います。

/* * 3.HTMLEnCode関数の作成 */

一文字単位で文字列を調べて、変換してみたいと思います。 文字のループは、 For n = 1 To Len(Range("A1").Value) strMOJI = Mid(Range("A1").Value, n, 1) Debug.Print "[" & strMOJI & "]code=" & Hex(Asc(strMOJI)) Next n みたいに、Lenで文字数を求めて、Mid関数で1文字単位に取り出して、 特殊文字を判断して変換してみます。 単純に作ると、 '文字列を受け取り、変換結果を返す
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
のように、コードを見て、それに対応する文字をセットしてます。 コメントが出てるけど、なんだかよくわからないよね。 次回のネタができたかな、文字コードとソースの書き方(笑) なんとか、組み込んで動きました。 ※長くなってきたから、そろそろまた、関数分けて、まとめないと。
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 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:
                    Print #FNO, "<TD ALIGN='RIGHT'";
                Case xlLeft:
                    Print #FNO, "<TD ALIGN='LEFT'";
                Case xlCenter:
                    Print #FNO, "<TD ALIGN='CENTER'";
                Case Else  'その他設定無しのとき
                    Print #FNO, "<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)
                Print #FNO, " BGCOLOR=#" & strR & strG & strB;
            End If
            Print #FNO, ">"; 'タグを閉じる
            'フォントの色を調べる
            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)
                Print #FNO, "<Font Color=#" & strR & strG & strB & ">";
            End If
            'セルの中身を変換して書き込む*018で追加
            Print #FNO, htmlEnCode(objHANI.Cells(y, x).Value);
            'フォントのタグを閉じる
            If strCOLOR <> "000000" Then  '黒以外の時処理
                Print #FNO, "</Font>";
            End If
            'タグを閉じる
            Print #FNO, "</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
'文字列を受け取り、変換結果を返す
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

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

さて、テストしますか。 まぁ、それなりに動いてます。 が、 まだまだ、ですね。 あとは、セルの結合の処理と、タグのまとめなどです。 文字コードの変換などで役に立てばいいのですが。 ※Alt+Returnで改行されたデータをCSVにする時など、、の参考となれば。 改行文字をスペースに変換したり_とアンダーバーにしたりして、  テキスト出力途中で改行されないようにする時など、使ってみてください。 http://www.ken3.org/p/lzh/office-018.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系バックナンバー目次へ移動]