[No.80 Excelのセル範囲をHTMLの表(.html)にしてみる]
[No.81 セルの右寄せ、中央寄せをHTMLの表にしてみる]
[No.82 背景色、フォントカラーをHTMLの表にしてみる]
[No.83 改行LFを<BR>などHtml用にエンコードして書き込む]
[No.84 Excel UserFormでコンボボックスを使用してみた]

www.ken3.org(サイト内)から Google を利用して、

三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー] [VBA系 TOP] [三流君 TOP]



No.80 2003/06/06
Excelのセル範囲をHTMLの表(.html)にしてみる
[ページTOPへ戻る]

<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でした。

No.81 2003/06/06
セルの右寄せ、中央寄せをHTMLの表にしてみる
[ページTOPへ戻る]

<セルの右寄せ、中央寄せをHTMLの表にしてみる>

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

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

前回、表の基本形を書き込めました。 これを、Excel--HTMLコンバーターと世に出したら、 さぁたいへん(笑) クレームの嵐だった(作り話です) ・セルが全て左によっていて、右寄せ中央寄せができてない ・フォントの色、背景色が変わらない ・セル結合している場所が正しく表にならない   ・   ・ とある中から、 まずは、簡単そうな、 セルの右寄せ中央寄せ、を調べてみたいと思います。

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

セルが右に寄っているか?中央か?どうやって調べましょう。 いつものマクロ記録で、記録してみます。 プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う http://www.ken3.org/vba/excel-help.html も、ヒマな時、のぞいてください。 話を戻してと、 右、中央を記録しただけなのに、 こんなに長いなんて。。。
Sub Macro1()
    Range("D2").Select
    With Selection
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
End Sub
さてと、めげないで、探っていくと、 それっぽいのが .HorizontalAlignment = xlRight .HorizontalAlignment = xlCenter これって、見るからに怪しい感じがします。 カーソルを.HorizontalAlignmentに合わせ、F1キーを押します。 使用例 次の使用例は、シート 1 のセル範囲 A1:A5 の内容の横位置を左詰めに設定します。 Worksheets("Sheet1").Range("A1:A5").HorizontalAlignment = xlLeft おっ、使えそうですね。

/* * 3.関数に組み込む */

前回作成したのが、 'ファイル名とセルの範囲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
HTMLファイルを作成しているサブルーチンで、 'セルの値を<TD>で囲って出力 Print #FNO, "<TD>" & objHANI.Cells(y, x).Value & "</TD>"; と、単純に<TD>で囲っている部分を、 <TD ALIGN='RIGHT'><TD ALIGN='LEFT'><TD ALIGN='CENTER'> セルの位置によって変化させます。 '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 力技で書くと、こんな感じです。

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

さて、テストしますか。 まぁ、それなりに動いてます。 が、 まだまだ、ですね。 プロパティの探り方、なんとなくわかったと思います。 次は、セルの背景色、フォントのカラーを探らないと。 http://www.ken3.org/p/lzh/office-016.lzh に今回のサンプル保存されてます。 あわせてみてください。 次回は、もう少しマシなの作りたいですね。 ※できたら、世に出せるくらいのツールになるといいけど、、、 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってますが、 なかなかうまくは行いかないね。。 拾い読みして、 1つでも何かの参考となれば幸いです。

No.82 2003/06/06
背景色、フォントカラーをHTMLの表にしてみる
[ページTOPへ戻る]

<背景色、フォントカラーをHTMLの表にしてみる>

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

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

前回、表の基本形を書き込めました。 なんとか、右寄せ左寄せ、中央寄せのパターンを書きました。 まだまだ、機能的に足りないだけど、 今回は、 フォントの色、 ^^^^^^^^^^^^ 背景色 ^^^^^^ を変えてみたいと思います。

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

いつものマクロ記録で、フォント関係を記録してみます。 プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う http://www.ken3.org/vba/excel-help.html も、ヒマな時、のぞいてください。 話を戻してと、 フォントを赤にして、背景は黄色。 なんて操作をマクロ記録すると、
Sub Macro1()
    Range("B2:C4").Select
    Selection.Font.ColorIndex = 3
    With Selection.Interior
        .ColorIndex = 6
        .Pattern = xlSolid
    End With
    Range("G6").Select
End Sub
と記録されました。 う〜ん、、、.ColorIndex = 色番号かぁ。 これだと、色番号を3を赤とか変換するの? それは、大変だなぁ。 ヘルプでColorIndex プロパティをみる。 で、 ポイントがあって(たまたま、見つけたんだけど) 関連項目を押します。 すると、Color プロパティが見つかり(ホントたまたま) Font フォントの色。 Interior 影付きのセルの影の色、または描画オブジェクトの塗りつぶしの色。 使用例 次の使用例は、グラフ 1 の数値軸の目盛ラベルの色を設定します。 Charts("Chart1").Axes(xlValue).TickLabels.Font.Color = _ RGB(0, 255, 0) .Color = RGB(〜 これ、使えそうですよね。 Debug.Print "フォントの色" & Hex(Range("B2").Font.Color) Debug.Print "背景色" & Hex(Range("B2").Interior.Color) と確認すると、 フォントの色FF (赤色) 背景色FFFF (黄色) あれ、RGBは赤緑青だよな、サンプルを青のデータにしてみよう。 フォントの色FF0000 が青だ。 背景色FF00が緑 で、赤がFF ってことは、ブルー、グリーン、レッドの順かぁ、なんかウソくさいけど(笑) よし、これを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 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
            'セルの中身を書き込む
            Print #FNO, 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
ポイントは、 HTMLの表のバックカラー BGCOLOR=#FFFFFFと フォントカラー <FONT COLOR=#FFFFFF を使用して、 .Font.Color のフォントカラーを変更、 .Interior.Color の背景色をそれぞれ変更してます。 RIGHT("000000" & HEX としてるのは、 Hexで16進数に変換して頭に0を足す(埋めて) その後、左からデータを取って、6桁の16進文字列にしてます。 あとは、簡単な文字列の分解処理で、 strR = Mid(strCOLOR, 5, 2) strG = Mid(strCOLOR, 3, 2) strB = Mid(strCOLOR, 1, 2) と、色の値を取り出します。 それを、強引に組み合わせて、書き込んでます。 ※なんか、ソースが長くなってきたので、分割しないとね。

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

さて、テストしますか。 まぁ、それなりに動いてます。 が、 まだまだ、ですね。 プロパティの探り方、なんとなくわかったと思います。 次は、難しそうな結合されたセルの取り扱いですね。。。難しそう(笑) http://www.ken3.org/p/lzh/office-017.lzh に今回のサンプル保存されてます。 あわせてみてください。 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってますが、 なかなかうまくは行いかないね。。 拾い読みして、 1つでも何かの参考となれば幸いです。

No.83 2003/06/06
改行LFを<BR>などHtml用にエンコードして書き込む
[ページTOPへ戻る]

<改行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でした。

No.84 2003/06/08
Excel UserFormでコンボボックスを使用してみた
[ページTOPへ戻る]

<Excel UserFormでコンボボックスを使用してみた>

どうも、三流プログラマーのKen3です。 今回は、 Excel UserFormでコンボボックスを使用してみた そんなお話です。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba084.lzh にvba084.xlsが保存されています。

/* * 1.今回のキッカケ */

http://www.ken3.org/vba/excel-form.html に設置してた、感想質問受付で、下記の質問が来ました。 --------------- >Excelのフォームで、コンボボックスを使用したいのですが、 >Accessで作るコンボボックスのような、リストの設定方法を教えてください。 > >Private Sub ComboBox1_Change() > > >End Sub --------------- ExcelのUserFormでコンボボックスを使うのかぁ。 Accessだと、クエリーやコントロールソースを使用して、 簡単に作れるのにね。 (もしかしてExcelにも私が知らないだけであったりして・・・)

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

コンボボックスを作り、いつものように、 me.ComboBox1. と入力すると、プロパティやメソッドが表示される。 探りを入れると、 .AddItem なんて、アイテムを追加するそれっぽいのが存在する。 サンプルを見ながら、 フォームのオープン時のイベントで、 2つのコンボボックスに値をセットしてみた。 1つ目は 固定値で、クー・チョキ・パーと順番にセット。 2つ目は、 シートの値からコンボボックスを作成してみた。 A列コード B列商品名 C列単価 の複数列のデータをコンボボックスにセットしてみた。 シートのイメージは、 ↑複数列のデータをセットしたイメージ

/* * 3.作成したサンプル */

フォームを開くイベントで、 コンボボックスにデータをセットした。
Private Sub UserForm_Initialize()
    '----------------------
    'コンボボックス1の設定
    '----------------------
    'Accessで言うと連結列かな 0のインデックス番号
    Me.ComboBox1.BoundColumn = 0

    'フォームの初期化でコンボボックスに値を代入する
    Me.ComboBox1.AddItem "グー"
    Me.ComboBox1.AddItem "チョキ"
    Me.ComboBox1.AddItem "パー"
    
    '----------------------
    'コンボボックス2の設定
    '----------------------
    Me.ComboBox2.BoundColumn = 2 '連結はB列の商品名
    Me.ComboBox2.ColumnCount = 3 '列数は3
    Dim YLINE As Integer
    Dim setY As Integer
    YLINE = 2 '2行目からデータセット
    setY = 0  'コンボボックスは0からなので
    While Len(Sheets("MST").Cells(YLINE, "A")) <> 0 'A列のデータで有無をチェック
        '.Additemで行を追加
        Me.ComboBox2.AddItem Sheets("MST").Cells(YLINE, "A")
        '.Listで該当列にデータをセット
        Me.ComboBox2.List(setY, 1) = Sheets("MST").Cells(YLINE, "B")
        Me.ComboBox2.List(setY, 2) = Sheets("MST").Cells(YLINE, "C")
        YLINE = YLINE + 1
        setY = setY + 1
    Wend

End Sub
ポイントは、 ~~~~~~~~~~~~ ComboBox.AddItem で、行が追加されます。 ComboBox.ColumnCount = で、列数を設定でき、 ComboBox.List(行, 列)で、データをセットすることが出来ます。 データが作成できたら、取り出しのテストですね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Private Sub CommandButton1_Click()
    MsgBox "ComboBox1.text=" & Me.ComboBox1.Text  'グーなどのテキスト文字
    MsgBox "ComboBox1.value=" & Me.ComboBox1.Value  '値
End Sub
普通に、.Text .Valueで取り出してみました。 ComboBox.BoundColumn でAccessで言うと連結列を設定できます。 この辺も遊んでみてください。 複数列のデータは、 ^^^^^^^^^^^^^^^^^^
Private Sub CommandButton2_Click()
    MsgBox "ComboBox2.text=" & Me.ComboBox2.Text    'テキスト文字
    MsgBox "ComboBox2.value=" & Me.ComboBox2.Value  '値
    MsgBox "ComboBox2.Column(0)=" & Me.ComboBox2.Column(0)
    MsgBox "ComboBox2.Column(1)=" & Me.ComboBox2.Column(1)
    MsgBox "ComboBox2.Column(2)=" & Me.ComboBox2.Column(2)
End Sub
と ComboBox.Column(列番号)で、列を指定して、値を取り出すことができます。 テストはボタンのクリックイベントでしたが、 質問にあった、 >Private Sub ComboBox1_Change() > > >End Sub で、値が変わった時に処理も可能です。

/* * 4.まだまだ、探りが足りないんだけど */

Accessにある、 各項目の列幅の指定 項目名の表示(一行目に表示する/しない) コントロールソースの指定 など、探らないといけない項目はいろいろとあります。 ヘルプを見ながら、プロパティを探り、 遊んでみてください。

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

ExcelのUserForm で コンボボックスを使用したテストでした。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。


検索して目的の情報を探す。

目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。

カスタム検索
三流君(site:www.ken3.org) 内を Googleを利用してキーワード する

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

リンクや広告など

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

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

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

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

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

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

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



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