三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー]
[VBA系 TOP]
[三流君 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でした。
<セルの右寄せ、中央寄せを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つでも何かの参考となれば幸いです。
<背景色、フォントカラーを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つでも何かの参考となれば幸いです。
<改行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>に直します。
スペースは、
また、下記の4つの文字もHTMLへそのまま出力すると、
問題があるのでエンコードします。
< <
> >
& &
" "
※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 = " " 'スペース
Case &H3C: strSET = "<" '<
Case &H3E: strSET = ">" '>
Case &H26: strSET = "&" '&
Case &H22: strSET = """ '"
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 = " " 'スペース
Case &H3C: strSET = "<" '<
Case &H3E: strSET = ">" '>
Case &H26: strSET = "&" '&
Case &H22: strSET = """ '"
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でした。
<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でした。
検索して目的の情報を探す。
目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。
ページフッター
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
質問や要望など メッセージを送る(三流君に連絡する)
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
|
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
|
急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。
リンクや広告など
項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多い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系バックナンバー目次へ移動]