大人気:[花王ヘルシア緑茶の通信販売]←体脂肪が気になる人・毎日1本単位で買うのが面倒な人
Microsoft Officeで作るツールと業務システム
有料メルマガですが、2004/06月で発行中止、廃刊となります。一年続けてみましたが、有料のレベルになっていなく、これといったツール作りまでいかなかったです。読者からの質問メールは励みになりました。無料版で不定期に書いているので、たまには覗きに来て下さい。
サンプルです、読んで判断して下さい
Microsoft Officeで作るツールと業務システム
有料版では、ツール作りの全体からアプローチしてみたいと思います。
月400円(有料)なので損しないように事前判断して下さい
~~~~~~~*相性もあると思うので、、ちなみに私はAB型の変わり者タイプです。(笑)
====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*=
[ Microsoft Officeで作るツールと業務システム No.001 ] 2003/02/01 毎週土曜日
=*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====
Microsoft Officeを使用してツール、業務のシステムを作成します
(手順を解説します)主にシステム全体やExcel -- Accessの連携、VBAの解説です
毎週土曜日発行サンデープログラマーの楽しみ〜プロまで役立つツール
そんなプログラムを1から作りたいと思ってます。
*初心者歓迎です、有料版なので遠慮しないでドンドン質問下さい。
----------------------------------------------------------------------------
<フォルダーを選択してファイルリストを作成する>
どうも、はじめまして、三流プログラマーのKen3です。
このメルマガでは、毎回テーマを決めて、
業務システムで使えるような、簡単なサブルーチンやツール、
を作って行きたいと思います。
発行パターンは、本編を毎週土曜日に、
詳細の補足説明を不定期の連絡発行で行う予定です。
第一回目は、
フォルダーを選択してファイルリストを作成
したいと思います。
今後の要望や疑問点・質問は遠慮無く
qaqaqa@ken3.org
へ送ってください。よろしくお願いします。
今回作成したファイル名の取得、フォルダー選択のテストプログラム
http://www.ken3.org/p/lzh/off001.lzh
に
office-001.xls, office-001.mdb(フォルダー選択のテストだけ)
保存してます。
ダウンロードして、動きをチェックして見てください。
/*
* 1.仕様、やりたいことをハッキリとさせる
*/
プログラムを組む前には、どんなことやりたい?
こんなこと?
など、作りたい最終結果のイメージを思い浮かべます。
まぁ、ここからの仕様の理解度、プログラムへの落し方が
意外と評価をわけたり、腕の見せ所なんだけどね。
納品ファイルの一覧表を作って
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
と言われたら、アナタならどうしますか?
ひとつの方法は、エクスプローラーでファイルを表示させて、
それを入力するか、ハードコピーを撮って貼りつけるか。
←参考画面
プロ?ぽい人は、コマンドプロンプトで、
CD \VBA-TEST (目的のフォルダー)
dir *.* > list.txt (DIRはファイル名を表示するコマンド)
で、list.txtを作ってエディターなどで編集して処理します。
Microsoft(R) Windows 98
(C)Copyright Microsoft Corp 1981-1998.
C:\WINDOWS>d:
D:\BackupDISK\Et-mps_2317>cd \vba-test
D:\VBA-TEST>dir *.* > list.txt
D:\VBA-TEST>
←参考画面
list.txt の 中身は、
ドライブ D: のボリュームラベルは HD07G
ボリュームシリアル番号は 2156-1EFF
ディレクトリは D:\VBA-TEST
. <DIR> 02-11-24 14:29 .
.. <DIR> 02-11-24 14:29 ..
042-5-2 <DIR> 01-04-17 10:25 042-5-2
042-3 <DIR> 01-04-13 5:38 042-3
042-4 <DIR> 01-04-14 10:38 042-4
042-5 <DIR> 01-04-17 6:36 042-5
042-2 <DIR> 01-04-10 5:17 042-2
VBA002 <DIR> 02-11-14 6:42 vba002
VBA006 <DIR> 02-11-20 5:46 vba006
VBA013 <DIR> 02-12-02 23:52 vba013
VBA007 <DIR> 02-11-24 14:30 vba007
VBA015 <DIR> 02-12-05 15:54 vba015
VBA018 <DIR> 02-12-08 16:07 vba018
VBA016 <DIR> 02-12-05 21:10 vba016
VBA019 <DIR> 02-12-09 15:25 vba019
A100 TXT 13 02-12-24 1:01 A100.TXT
TEST02~1 XLS 28,160 02-12-12 21:06 Test020-Book.xls
TEST02~2 XLS 40,448 02-12-12 21:50 Test022-Book.xls
DB023 MDB 81,920 02-12-14 1:25 db023.mdb
TEST02~3 XLS 27,648 02-12-26 11:57 Test025-Book.xls
OUT TXT 220 02-12-19 2:42 out.txt
TEST02~4 XLS 30,720 02-12-17 20:22 Test027-Book.xls
・
・
・
TEST05~3 XLS 37,376 03-01-26 19:40 Test052-Book.xls
TEST05~4 XLS 44,032 03-01-28 19:08 Test053-Book.xls
LIST TXT 0 03-01-31 2:30 list.txt
52 個 1,718,398 バイトのファイルがあります.
15 6,293.68 メガバイトの空きがあります.
---
となっているので、あとは好きに編集できます。
毎回、そんなことやってられないので(やっててもいいんだけど)
フォルダーを選択したらファイル名のリストを作成する処理をやりたいと思います。
/*
* 2.日本語で書くのは簡単だけど、、、
*/
フォルダーを選択したらファイル名のリストを作成するツール作ってよ。
やりたいことは〜〜みたいな感じでさ、簡単でいいからさ。
なんて、言われたら?
さて、どうしましょうかねぇ。
今回のポイントになるのが、
・ファイル名リストの取得方法
・フォルダーの選択方法
ですね。
Microsoft Officeで作るツールと業務システム
なんて、タイトルつけてるしなぁ、何で作ろうかなぁ。
今回はExcelでセルにファイル名を入れてみます。
/*
* 3.ファイルのリストを取るにはDir関数を使う
*/
Excelブックで、Alt+F11を押してVBAの編集画面を出してと、
Sub test_ファイル名を取出す()
'ファイル名を取出して、セルにセットするテストを行う
'A列をクリアする
Range("A1:A9999").Value = "" '1行〜9999行に空文字を代入
' C:\ 内のファイル名を表示します。
Dim strFolder As String 'フォルダー名
Dim strFileName As String 'ファイル名
Dim nYLine As Integer '行カウンタ
strFolder = "c:" '検索するフォルダーを設定します。
strFileName = Dir(strFolder & "\*.*", vbNormal) '最初のファイル名を取る
'ファイルが見つからなくなるまでループしてデータをセットする
nYLine = 1
Do While strFileName <> "" ' ループを開始します。
Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
nYLine = nYLine + 1 ' カウントアップする
strFileName = Dir ' 次のファイル名を返します。
Loop
End Sub |
なんか難しそうだけど、プログラムなんてのは、
制御文(ここでは、Do Whileのループ)で流れつくって、
標準関数(Dir関数でファイル名取得)
で取得した値を、オブジェクト(Excelのセル)
にセットしただけなんですね。
難しいと感じるポイントがあって、
アルゴリズムと呼ばれてるのが、
制御文などの流れを作っている部分。
標準関数の使い方。
オブジェクトの操作。
大きく言うと、このプログラムでは、3点かなぁ。
*補足発行で詳しく説明します
アルゴリズムはひらめき系?の部分が多く、
標準関数やオブジェクトの操作は知識、
情報の探し方(調査能力、ヘルプを見るうまさ)
かなぁ。
/*
* 4.フォルダーの選択
*/
上記のDIRのテスト関数で、
strFolder = "c:" '検索するフォルダーを設定します。
を好きなのに変えてよ、、、
strFolder = "D:\vba-test" '検索するフォルダーを設定します。
とプログラム変更してから実行してね。
おいおい、プログラムを直しながら実行させる、
そんなツール聞いたことないよね。
そうですよね(笑)
フォルダーを選択させるダイアログを探すか。
えっ、ExcelやAccessのVBAだと無いの?
噂のAPIを使うんですか?
初回からそんなことしたくないので、
Shellオブジェクトを使ってみます。
Sub test_フォルダーの選択()
Dim objShell As Object 'Shell
Dim objFolder As Object 'Shell32.Folder
Const strTitle = "フォルダを選択してください。"
'シェルのオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
'フォルダー参照に設定
Const lngRef = &H1
'ルートフォルダーをデスクトップに設定
'5でMy Documents、6でFavoritesなど
Const fldRoot = &H0
Set objFolder = _
objShell.BrowseForFolder(0, _
strTitle, lngRef, fldRoot)
Set objShell = Nothing
'フォルダー名を取出す
Dim strMSG
If objFolder Is Nothing Then 'キャンセルチェック
strMSG = "キャンセル押しやがって、えっキャンセル押されたらのテスト?"
Else
If objFolder.ParentFolder Is Nothing Then
strMSG = "選択されたのは[ルート(デスクトップ)]です"
Else
strMSG = "選択されたのは[" & objFolder.Items.Item.Path & "]です"
End If
End If
MsgBox strMSG
End Sub |
なんとか、出来たみたいですね。
*デスクトップを選択された時、ログインユーザーの場所を求めてないけどね。
システムやツールを作成する時、
標準関数や標準のダイアログで実行できない機能を
外部のオブジェクトを参照して、その機能を借用する(笑)なんてこともあります。
*WindowsAPIを操作する高度な方法もあります。
これも長くなるので、補足発行かなぁ(おいおい、そんなんでいいの?)
/*
* 5.単体でテストしたサブルーチンをつなげる
*/
フォルダーの選択
と
指定したフォルダー内のリストの出力処理
上記2つのテストが完了しました。
さてと、つなげますか。
メインの流れは、
フォルダーを選択させる。
↓
キャンセルだったら、処理を抜ける
↓
選択されたフォルダーを表示関数に渡し、表示する
えっ、そんなものなの?
別に複雑にしたくないので。
プログラム作成になれて無い時は、
日本語の動作を箇条書きで書くといいですよ。
Sub Main()
'フォルダーを選択させる
'キャンセルだったら処理を抜ける
'選択されたフォルダーを表示関数に渡し表示する
End Sub |
みたいに、コメントだけの関数を書いてみる、でいいと思います。
処理のまとめ方にもポイントがあって、
値の受け渡し方法や書き方がプログラムがうまい人とヘタな人の差になるのかなぁ。
Sub Main()
Dim strFolder '選択されたフォルダーを格納
'フォルダーを選択させる
strFolder = getFOLDER() 'フォルダーの選択関数を呼ぶ
'キャンセルだったら処理を抜ける
If strFolder = "キャンセル" Then
Exit Sub
End If
'選択されたフォルダーを表示関数に渡し表示する
Call setFILELIST(strFolder) 'データのセット
End Sub |
と、変数を使って、2つのユーザー関数を制御するMain関数としました。
'フォルダー選択ダイアログを表示して、リターン値で選択場所を返す
'キャンセルの時は文字列キャンセル、
'デスクトップの時は文字列を返す
Function getFOLDER() As String
Dim objShell As Object 'Shell
Dim objFolder As Object 'Shell32.Folder
Const strTitle = "フォルダを選択してください。"
'シェルのオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
'フォルダー参照に設定
Const lngRef = &H1
'ルートフォルダーをデスクトップに設定
'5でMy Documents、6でFavoritesなど
Const fldRoot = &H0
Set objFolder = _
objShell.BrowseForFolder(0, _
strTitle, lngRef, fldRoot)
'フォルダー名を取出し、リターン値をセット
If objFolder Is Nothing Then 'キャンセルチェック
getFOLDER = "キャンセル" 'リターン値にキャンセルをセット
Else
If objFolder.ParentFolder Is Nothing Then
getFOLDER = "デスクトップ"
Else
getFOLDER = objFolder.Items.Item.Path 'パスをセットする
End If
End If
Set objFolder = Nothing
Set objShell = Nothing
End Function |
値を返すユーザー関数
Functionにして、
テストで、メッセージボックスの確認していた部分を、
getFOLDER = "キャンセル" 'リターン値にキャンセルをセット
getFOLDER = "デスクトップ"
getFOLDER = objFolder.Items.Item.Path 'パスをセットする
に変えただけでした。
次の表示部は、
'引数(パラメータ)でフォルダー名をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String)
'A列をクリアする
Range("A1:A9999").Value = "" '1行〜9999行に空文字を代入
Dim strFileName As String 'ファイル名
Dim nYLine As Integer '行カウンタ
'最初のファイル名を取る
strFileName = Dir(strFolder & "\*.*", vbNormal)
'ファイルが見つからなくなるまでループしてデータをセットする
nYLine = 1
Do While strFileName <> "" ' ループを開始します。
Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
nYLine = nYLine + 1 ' カウントアップする
strFileName = Dir ' 次のファイル名を返します。
Loop
End Sub |
と、フォルダーの場所をパラメータで受け取り、データをセットしました。
ツール、プログラム作りとかいってたけど、
標準関数のファイル名を返すDir関数
と
Shellオブジェクトを使用したフォルダーの選択、
たんなる関数やオブジェクトの操作を組み合わせだけなんですね。
/*
* 6.終わりの挨拶
*/
今回作成したファイル名の取得、フォルダー選択のテストプログラム
http://www.ken3.org/p/lzh/off001.lzh
に
office-001.xls, office-001.mdb(フォルダー選択のテストだけ)
保存してます。
ダウンロードして、動きをチェックして見てください。
初回の説明の流れとしては、イマイチかなぁ。
*チョット説明を飛ばし過ぎですね
補足(連絡用マガジン発行)で、細かく説明を発行します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<情報の探し方など、私が知っていること>
どうも、三流プログラマーのKen3です。
今回は、情報の探し方など、私が知っていることを書きます。
*実はまだ、説明し易いテーマを探してたりするんだけど、
そんなこんなで2回も発行回数使ってしまい、すみません。
後半で挽回するのでご勘弁を。。。
/*
* 1.情報の探し方(三流君の方法)
*/
プログラムが組める人、と、組めない人の差っていろいろあるんだけど、
その1つが情報の探し方だと思います。
インターネットになんでもあるなんてことは無いけど、
http://www.google.co.jp/
に
キーワードを入れて検索すると、よくヒットします。
簡単に、ネットで探せよと聞くけど、
探しきれないのも事実です。
~~~~~~~~~~~~~~~~~~~~~~~~
私が探した方法を毎回、書いて行けたらなぁと思ってます。
*実際は、目的地まで誘導してもらって、迷わないで行くよりも、
方向だけ教えてもらい、迷いながら進むほうが道を覚えるんだけど。
そのへんのバランスに注意したいですね。
http://www.ken3.org/vba/select.html
に少し書いてあるので、こっちもヨロシクです。
/*
* 2.プロパティ、メソッドを探る方法
*/
次に、よく聞く言葉が、
ヘルプを見ろ、そこに書いてあるだろ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
なんて、冷たいお言葉を先輩からいただきます。
確かにおっしゃる通りなのですが、あんまりですよね。
もっとF1を押してヘルプを表示させてみたら、、、
とやさしく言ってくれてもいいのにね。
でも、冷たい、優しいなんて、抜きにして、
覚えて自分のものになったもん勝ちですよ。
そんなの気にしないで、どんどん、まわりに聞きまくりましょう。
っと、その前に、やはりヘルプは見たほうが良いので、
http://www.ken3.org/vba/excel-help.html
にヘルプの引き方を少し書いてあるので、ヨロシクです。
/*
* 3.実行時エラーの時、変数の確認方法
*/
エラーが発生すると、
どこで?
どんな値?
変数の中身は?
パラメーターは?
など、いろいろと聞かれると思います。
そんな時は、あわてないで、
http://www.ken3.org/vba/debug.html
実行時エラー発生時、あわてないでデバックを押す方法
と
http://www.ken3.org/vba/iwind.html
イミディエイト ウインドウ と Debug.Print
に
簡単な操作を載せているので、参考にしてみて下さい。
デバックで見る前に、頭の中で流れを整理しろ、、、
と
キツイ一言を先輩からもらったりもするんだけど。
解説って、完成品を見せるのが普通なんだけど、
エラーも載せようと思います。
*単純なスペルミスとか載せないけど、
私が転んだ場所(エラーヶ所)など、恥ずかしいけど載せて行きたいです。
/*
* 4.最後に簡単なサンプル実行方法
*/
http://www.ken3.org/vba/excel97-vba-test.html
に簡単なサンプル実行方法を書いてます。
/*
* 5.終わりの挨拶
*/
今回は、初回に説明してよって感じのネタでした。
(無料版のまとめになってるし、、、有料らしく次回からは、しっかりとやります)
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<データの流れ>
どうも、三流プログラマーのKen3です。
今回はデータの流れについて、偉そうに語ってみます。
今後の要望や疑問点・質問は遠慮無く
qaqaqa@ken3.org
へ送ってください。よろしくお願いします。
今回作成したテストプログラム
http://www.ken3.org/p/lzh/off003.lzh
に
Book-003.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
/*
* 1.データの流れ
*/
システム化する時は、
やりたいことをはっきりさせる
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
のが、まずはポイントなんですが、
その次が、
データの流れをイメージすることです。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教科書的な考え方は、
入力 -- 処理 -- 出力のデータの流れです
^^^^^^^^^^^^^^^^^^^^^^^^
/*
* 2.復習?
*/
初回にフォルダーを選択させ、シートにファイル名を書き込む処理を作りました。
まずメインの制御処理ですが、
フォルダー選択関数から、フォルダー名を受け取る入力があって、
キャンセル判断の処理、
データ表示処理を呼ぶ出力となってます。
*入力が無かったり、処理だけってパターンもあるけど、
これは、処理にはまっているかなぁ。
入力 -- 処理 -- 出力 -- 出力結果によって処理 ...と流れはいろいろあるけど、
基本は、何か入力されて、処理して、結果を出力、、です。
Sub Main()
Dim strFolder As String '選択されたフォルダーを格納
'フォルダーを選択させる
strFolder = getFOLDER() 'フォルダーの選択関数を呼ぶ
'キャンセルだったら処理を抜ける
If strFolder = "キャンセル" Then
Exit Sub
End If
'選択されたフォルダーを表示関数に渡し表示する
Call setFILELIST(strFolder) 'データのセット
End Sub |
strFolderの変数の流れに注目すると、なんとなくわかると思います。
処理の関数側では、
Set objShell = CreateObject("Shell.Application")
オブジェクトから、
objShell.BrowseForFolder
メソッドを使い、フォルダーの選択。(入力)
選択結果を処理して、
結果をリターン値で返してます(出力)
'フォルダー選択ダイアログを表示して、リターン値で選択場所を返す
'キャンセルの時は文字列キャンセル、
'デスクトップの時は文字列を返す
Function getFOLDER() As String
Dim objShell As Object 'Shell
Dim objFolder As Object 'Shell32.Folder
Const strTitle = "フォルダを選択してください。"
'シェルのオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
'フォルダー参照に設定
Const lngRef = &H1
'ルートフォルダーをデスクトップに設定
'5でMy Documents、6でFavoritesなど
Const fldRoot = &H0
Set objFolder = _
objShell.BrowseForFolder(0, _
strTitle, lngRef, fldRoot)
'フォルダー名を取出し、リターン値をセット
If objFolder Is Nothing Then 'キャンセルチェック
getFOLDER = "キャンセル" 'リターン値にキャンセルをセット
Else
If objFolder.ParentFolder Is Nothing Then
getFOLDER = "デスクトップ"
Else
getFOLDER = objFolder.Items.Item.Path 'パスをセットする
End If
End If
Set objFolder = Nothing
Set objShell = Nothing
End Function |
シートにデータをセットする部分では、
パラメーターでフォルダーを受け取り(入力)
ファイル名を見つけ
データをシートにセットしてます。
'引数(パラメータ)でフォルダー名をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String)
'A列をクリアする
Range("A1:A9999").Value = "" '1行〜9999行に空文字を代入
Dim strFileName As String 'ファイル名
Dim nYLine As Integer '行カウンタ
'最初のファイル名を取る
strFileName = Dir(strFolder & "\*.*", vbNormal)
'ファイルが見つからなくなるまでループしてデータをセットする
nYLine = 1
Do While strFileName <> "" ' ループを開始します。
Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
nYLine = nYLine + 1 ' カウントアップする
strFileName = Dir ' 次のファイル名を返します。
Loop
End Sub |
データの流れねぇ、、、なんとなくわかったけど、
だから?なに?って感じだよね。
/*
* 3.水路の水の流れを変えるように....
*/
データの流れを意識して、とか言ってたけど、
わかり易く言うと、水の流れを変えるようにかなぁ。
データをセットしている部分に、
Workbooks.Add '新しいブックを追加
を追加する命令を書くと、
'引数(パラメータ)でフォルダー名をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String)
Workbooks.Add '新しいブックを追加
Dim strFileName As String 'ファイル名
Dim nYLine As Integer '行カウンタ
'最初のファイル名を取る
strFileName = Dir(strFolder & "\*.*", vbNormal)
'ファイルが見つからなくなるまでループしてデータをセットする
nYLine = 1
Do While strFileName <> "" ' ループを開始します。
Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
nYLine = nYLine + 1 ' カウントアップする
strFileName = Dir ' 次のファイル名を返します。
Loop
End Sub |
新規のブックを開いて、データがセットされます。
データのセット先、行き先を変えてあげるだけで、
それなりの動きをします。
/*
* 4.まとめ
*/
プログラムを作る時は、要求事項をまずまとめます。
その次は、
入力 -- 処理 -- 出力を意識して、
データの流れを考えます。
なんて思考すると、
このデータをこんな感じで出力したいけど処理がわからない、
など、質問する時や作る時、イメージが沸きやすいと思います。
そんなカッコイイこといってますが、
作りながら出力イメージ変えたり、いろいろと試行錯誤してたりするんですが。。。
教科書的言葉だと、よいシステムは良い設計から...なんて目にしたことあります。
/*
* 5.終わりの挨拶
*/
今回作成したテストプログラム
http://www.ken3.org/p/lzh/off003.lzh
に
Book-003.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
進みが遅いですよね、、、、
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<関数に汎用性を持たせる>
どうも、三流プログラマーのKen3です。
前回は、プログラムは水の流れのように、、、なんて説明してました。
今回は、関数を分割して汎用性を持たせる案を説明します。
*たいしたことじゃないのですが、、、
今回作成したテストプログラム
http://www.ken3.org/p/lzh/off004.lzh
に
Book-004.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
/*
* 1.汎用性?
*/
プログラムが組めるようになってくると、修正のしやすさ、
流用の効くプログラムの書き方、、、などで差がでてきます。
私もあまり将来流用可能なプログラムを組んでないので、
偉そうなこと言えないんだけど(笑)
前回、フォルダー名を貰い、そのファイル名をセルにセットする。
なんて処理を作りましたよね。
'引数(パラメータ)でフォルダー名をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String)
Workbooks.Add '新しいブックを追加
Dim strFileName As String 'ファイル名
Dim nYLine As Integer '行カウンタ
'最初のファイル名を取る
strFileName = Dir(strFolder & "\*.*", vbNormal)
'ファイルが見つからなくなるまでループしてデータをセットする
nYLine = 1
Do While strFileName <> "" ' ループを開始します。
Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
Cells(nYLine, 2) = strFolder & "\" & strFileName
nYLine = nYLine + 1 ' カウントアップする
strFileName = Dir ' 次のファイル名を返します。
Loop
End Sub |
ざっと見ると、できてるんだけど、変更が来た時流用が効きにくいです。
/*
* 2.1つの考え方、固定処理をパラメーターにする
*/
フォルダーからファイル名を取得して、データをセットしてました。
*.jpg や *.xls とファイルの指定をして取出したくなったら?
1つの考え方は、
'最初のファイル名を取る
strFileName = Dir(strFolder & "\*.*", vbNormal)
この部分を、"\*.*"を"\*.xls"と指定ファイルに変える方法があります
が、
そんなことやってたら、*.bmpがほしい、*.htmlが、、、
と
種類別に関数が増えてしまいます。
そんな時は、フォルダーと一緒にファイルパターンもパラメーターで
貰うようにします。
Call setFILELIST(strFolder, "*.*") 'データのセット
とファイル名とパターンで関数を呼ぶようにします。
'引数(パラメータ)でフォルダー名とファイルの種類をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String, strPattern As String)
Workbooks.Add '新しいブックを追加
Dim strFileName As String 'ファイル名
Dim nYLine As Integer '行カウンタ
'最初のファイル名を取る
strFileName = Dir(strFolder & "\" & strPattern, vbNormal)
'ファイルが見つからなくなるまでループしてデータをセットする
nYLine = 1
Do While strFileName <> "" ' ループを開始します。
Cells(nYLine, 1) = strFileName 'セルにファイル名をセットする
Cells(nYLine, 2) = strFolder & "\" & strFileName
nYLine = nYLine + 1 ' カウントアップする
strFileName = Dir ' 次のファイル名を返します。
Loop
End Sub |
たんに、
Sub setFILELIST(strFolder As String, strPattern As String)
とパラメータが増えて、
strFileName = Dir(strFolder & "\" & strPattern, vbNormal)
で、指定してるだけでした。
/*
* 3.関数の機能を少なくしてシンプルにする
*/
もう一つのアプローチ方法として、
関数の機能を少なくしてシンプルにして汎用性を持たせる方法があります。
なんか回りくどく説明してますが、
余計な機能がついていないほうが、組み合わせで使える幅が増えます。
'引数(パラメータ)でフォルダー名とファイルの種類をもらい、
'データをA列にセットする
Sub setFILELIST(strFolder As String, strPattern As String)
この関数、フォルダー内をパターンで検索して、
ファイル名を新規のブックに保存します。
私、ファイル名だけほしいのに、、、なんて時には、
新規ブックに保存する処理がジャマなんですねとても。
1関数、1機能、なんてシンプルに作ってみると、利用し易い場合があります。
配列にファイル名をセットする関数を作ってみます。
'引数(パラメータ)でフォルダー名とファイルの種類をもらい、
'データを受け取った配列にセットする
Sub setFILELIST(strFNBOX() As String, _
strFolder As String, strPattern As String)
Dim strFileName As String 'ファイル名
Dim n As Integer '配列の要素数
n = 1 '初期化
ReDim strFNBOX(n) '配列の数を動的に変える
'最初のファイル名を取る
strFNBOX(n) = Dir(strFolder & "\" & strPattern, vbNormal)
'ファイルが見つからなくなるまでループしてデータをセットする
Do While strFNBOX(n) <> "" ' ループを開始します。
n = n + 1 ' カウントアップする
ReDim Preserve strFNBOX(n) ' 配列の数を動的に変える
strFNBOX(n) = Dir ' 次のファイル名を返します。
Loop
End Sub |
見なれない書き方ですが、まず配列を受け取ってます。
Sub setFILELIST(strFNBOX() As String, _
strFolder As String, strPattern As String)
strFNBOX()と数を指定しない受け取り方です
*ファイル名がいくつになるか不明なので。
次のポイントが
ReDim strFNBOX(n)
ReDim Preserve strFNBOX(n) ' 配列の数を動的に変える
です、これは、普通はDim A(10)など配列の数を指定するのですが、
動的に好きな数に配列のサイズを取ります。
Preserveのキーワードは、前のデータを残してサイズを拡張する、
今回のような処理の時に使います。
Do While strFNBOX(n) <> "" ' ループを開始します。
n = n + 1 ' カウントアップする
ReDim Preserve strFNBOX(n) ' 配列の数を動的に変える
strFNBOX(n) = Dir ' 次のファイル名を返します。
Loop
と、配列を拡張しながらファイル名をセットします。
分割した表示部は、
'フォルダー名とファイル名配列を受け取り、シートを新規作成
Sub make_data(strFolder As String, strFN() As String)
Dim nYLine As Integer '行カウンタ
Workbooks.Add '新しいブックを追加
For nYLine = 1 To UBound(strFN) 'ファイル名をセットする
Cells(nYLine, 1) = strFolder & "\" & strFN(nYLine)
Next nYLine
End Sub |
と、フォルダー名、ファイル名の配列を受けとって、
新規ブックにファイル名を書き込んでます。
ここで、おっ?と思うのは、
For nYLine = 1 To UBound(strFN) 'ファイル名をセットする
Cells(nYLine, 1) = strFolder & "\" & strFN(nYLine)
Next nYLine
の部分の、UBound(strFN)です。
UBoundに配列を渡すと、インデックス番号の最大値を返してくれるので、
これを利用してループを作ってます。
メインルーチンは、
Sub Main()
Dim strFolder As String '選択されたフォルダーを格納
Dim strBOX() As String 'ファイル名格納用変数
'フォルダーを選択させる
strFolder = getFOLDER() 'フォルダーの選択関数を呼ぶ
'キャンセルだったら処理を抜ける
If strFolder = "キャンセル" Then
Exit Sub
End If
'選択されたフォルダーを表示関数に渡し表示する
Call setFILELIST(strBOX(), strFolder, "*.*") 'データのセット
'新規のシートにデータをセットする
Call make_data(strFolder, strBOX())
End Sub |
と修正しました。
ポイントは、
Dim strBOX() As String 'ファイル名格納用変数
配列のサイズを指定しない定義方法、
と
Call setFILELIST(strBOX(), strFolder, "*.*") 'データのセット
Call make_data(strFolder, strBOX())
の関数の呼び方です。
/*
* 4.終わりの挨拶
*/
機能を分割すると、汎用性のあるプログラムが書けることが、
なんとなくわかったと思います。
Dim FN() As String
Call setFILELIST(FN(), strFolder, "*.jpg") 'データのセット
で、ファイルリストが取りたい時などに使える関数になりました。
(*標準関数に少し肉付しただけなんですが(笑))
今回作成したテストプログラム
http://www.ken3.org/p/lzh/off004.lzh
に
Book-004.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
何かの参考となれば幸いです。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<CreateObjectでアプリケーション操作>
どうも、三流プログラマーのKen3です。
今月は、隣のアプリケーションを利用する、
CreateObjectでアプリケーション操作
をやってみたいと思います。
*たいしたことじゃないのですが、、、
今回作成したテストプログラム
http://www.ken3.org/p/2/lzh/off005.lzh
に
Office-005.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
/*
* 1.オブジェクトの作り方いろいろ
*/
オブジェクトの作り方は、基本的に
CreateObject("Excel.Application")
CreateObject(アプリケーションを文字列で指定)
と簡単です。
Dim oApp As Object とObject型の変数を宣言します
Set oApp = CreateObject("Excel.Application")
Set oApp = CreateObject("Access.Application")
Set oApp = CreateObject("Word.Application")
Set oApp = CreateObject("InternetExplorer.Application")
Set oApp = CreateObject("Outlook.Application")
でオブジェクトを作成します。
*あっ、パワーポイントが抜けてる、、、私インストールしてなくてスミマセン。
メンバー的にスゴイメンバーだなぁ、、、
簡単なテストを下記に書きます。
Sub test_excel()
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
oApp.UserControl = True
End Sub |
Sub test_Access()
Dim oApp As Object
Set oApp = CreateObject("Access.Application")
oApp.Visible = True
oApp.UserControl = True
End Sub |
Sub test_Word()
Dim oApp As Object
Set oApp = CreateObject("Word.Application")
oApp.Visible = True
'oApp.UserControl = True '*ワード97だとエラーになります
End Sub |
Sub test_IE()
Dim oApp As Object
Set oApp = CreateObject("InternetExplorer.Application")
oApp.Visible = True
'oApp.UserControl = True '*エラーになります
End Sub |
Sub test_Outlook()
Dim oApp As Object
Dim myNameSpace As Object
Dim myFolder As Object
Set oApp = CreateObject("Outlook.Application")
Set myNameSpace = oApp.GetNameSpace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
myFolder.Display '表示
End Sub |
/*
* 2.操作の基本
*/
操作の基本なんて書いたけど、
オブジェクト.Font.Bold = False
みたいに、オブジェクトにたいして、プロパティとメソッドの操作をするだけです。
Set oApp = CreateObject("InternetExplorer.Application")
でオブジェクトを作成して、
oApp.Visible = True
と、.Visible プロパティをTrueにしただけです。
今月は、アプリケーションを組み合わせて、
いろいろと遊んでみたいと思います。
/*
* 3.自分のHPをIEで表示させるボタンの作成
*/
Sub test_IE_GO()
Dim objIE As Object 'IEオブジェクト参照用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://www.ken3.org/"
End Sub |
オブジェクト作成後、
.Navigateメソッドを使い、HPを表示しました。
/*
* 4.終わりの挨拶
*/
起動処理は、なんとなくわかったと思います。
それの使い方をハヤク説明しろ?って?
その通りですね。
今回作成したテストプログラム
http://www.ken3.org/p/2/lzh/off005.lzh
に
Office-005.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
今月は、アプリケーションを組み合わせて、
いろいろと遊んでみたいと思います。
何かの参考となれば幸いです。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<Outlookのメール送信操作>
どうも、三流プログラマーのKen3です。
今回は、
CreateObjectでOutlookのメール送信アプリケーション操作
をやってみたいと思います。
*たいしたことじゃないのですが、、、
今回作成したテストプログラム
http://www.ken3.org/p/2/lzh/off006.lzh
に
Office-006.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
/*
* 1.
*/
オブジェクトの作り方は、基本的に
CreateObject("Excel.Application")
CreateObject(アプリケーションを文字列で指定)
と簡単です。
Sub test_Outlook()
Dim oApp As Object
Dim myNameSpace As Object
Dim myFolder As Object
Set oApp = CreateObject("Outlook.Application")
Set myNameSpace = oApp.GetNameSpace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
myFolder.Display '表示
End Sub |
なんて、前回やりました。
まぁ、呪文じゃないけど固定のこんなもん程度でOKかなぁ。
/*
* 2.操作の基本は
*/
操作の基本は
オブジェクト.Font.Bold = False
みたいに、オブジェクトにたいして、プロパティとメソッドの操作をするだけです。
なんて書いてました。
メールを送信するには、
Sub testSEND送信()
Dim oApp As Object 'アプリケーションオブジェクト
Dim objMAIL As Object 'メールのオブジェクト
Dim strMOJI As String '本文
'アプリケーションオブジェクトの作成
Set oApp = CreateObject("Outlook.Application")
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
strMOJI = "こんにちは" & vbCrLf _
& "お金儲けの話、教えまっせ?" & vbCrLf _
& "http://www.ken3.org/ よろしく(笑)"
objMAIL.To = "test@ken3.org" '宛先
objMAIL.Subject = "未承諾広告※(笑)" '件名
objMAIL.Body = strMOJI '本文の代入
objMAIL.Send '直接送信箱行き
'おまけでOutlook表示
Dim myNameSpace As Object
Dim myFolder As Object
Set myNameSpace = oApp.GetNameSpace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
myFolder.Display '表示
End Sub |
まず、
Set oApp = CreateObject("Outlook.Application")
で、アプリケーションの参照用のオブジェクトを作成します。
次に、
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
と、メールアイテムを作成します。
あとは、いつも通り、プロパティをセットしたり、メソッドを実行したりの
objMAIL.To = "test@ken3.org" '宛先
objMAIL.Subject = "未承諾広告※(笑)" '件名
objMAIL.Body = strMOJI '本文の代入
とプロパティにデータをセット
objMAIL.Send
のメソッドで送信箱行きを行っただけです。
/*
* 3.せっかくだから関数を作ってみてよ
*/
CreateObjectだとかCreateItem?
.To .Subject .Body プロパティ?
.Send メソッド?
そんなの知らなくても送りたいよね。
そんな時は、下記のような引数を受けとって作業をする関数を1つ作っておきます。
Public Sub SendOutlookMail(strTO As String, _
strSUBJECT As String, _
strBody As String)
Dim oApp As Object 'アプリケーションオブジェクト
Dim objMAIL As Object 'メールのオブジェクト
'アプリケーションオブジェクトの作成
Set oApp = CreateObject("Outlook.Application")
'メールアイテムの作成
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
'データーをセットする
objMAIL.To = strTO '宛先
objMAIL.Subject = strSUBJECT '件名
objMAIL.Body = strBody '本文の代入
objMAIL.Send '直接送信箱行き
End Sub |
あれ?引数をセットしただけですね(笑)
そうなんですよ、
使い方は簡単で、メールアドレス、件名、本文を文字列で指定すると
outlookのメール送信箱にメールを作成します。
セルを使った簡単なサンプルは、
Sub testmain()
Dim y As Integer '行位置
Dim strBody As String
y = 15 '開始行をセットする
Do While Cells(y, 1) <> "" 'メールアドレスが入っている間
strBody = Cells(y, 2) & " 殿" & vbCrLf & "こんな感じで"
Call SendOutlookMail(Cells(y, 1), "新商品のご案内", strBody)
y = y + 1 '次の行へ
Loop
MsgBox "送信箱にメールを保存しました、確認後送信してください"
End Sub |
とA列に保存されたメールアドレスに対してメールを作ってます。
今回作成したテストプログラム
http://www.ken3.org/p/2/lzh/off006.lzh
に
Office-006.xlsが保存されてます。
ダウンロードして、動きをチェックして見てください。
/*
* 4.終わりの挨拶
*/
操作の基本は、
アプリケーションのオブジェクト作成、プロパティ・メソッドの操作
って感じがなんとなくわかったと思います。
アプリケーションを組み合わせて応用すると、
顧客リストから挨拶メールなど簡単に作れると思います。
その他今月はいろいろと遊んでみたいと思います。
何かの参考となれば幸いです。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<Excel操作 Accessからデータセット>
どうも、三流プログラマーのKen3です。
今回は、
CreateObjectでExcelアプリケーション操作
をやってみたいと思います。
*たいしたことじゃないのですが、、、
/*
* 1.Excelを起動するテスト
*/
オブジェクトの作り方は、基本的に
CreateObject("Excel.Application")
CreateObject(アプリケーションを文字列で指定)
と簡単です。
使い方は、
Sub test_excel()
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
oApp.UserControl = True
End Sub |
で、空のExcelアプリケーションが開きます。
/*
* 2.Accessからデータをセットする
*/
Accessからセルにデータをセットする方法を書きます。
フォームのボタンに起動処理を書きます。
(ってコピーしただけですが(笑))
Private Sub コマンド0_Click()
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
oApp.UserControl = True
End Sub |
実行すると、アプリケーションが起動します。
んっ?これだと、ブックがないのでシートに記述できません。
Workbooks.Add
がブックを追加するVBAです。これを記述します。
Private Sub コマンド0_Click()
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
oApp.UserControl = True
Workbooks.Add 'ブックの追加
End Sub |
コンパイルエラー、変数が定義されてません。
あらら、使い方を解説者本人が、いきなり間違えたよ(笑)
oApp.とCreateで作ったオブジェクトを使わないと。
oApp.Workbooks.Add 'ブックの追加
が正解です。
ブックを追加して、A1に起動時刻をセットしてみます。
Private Sub コマンド0_Click()
Dim oApp As Object
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
oApp.UserControl = True
oApp.Workbooks.Add 'ブックの追加
oApp.Range("A1").Value = Now() & "に起動されました"
oApp.Cells(3, 4).Value = "Cells 3,4 はここです。"
End Sub |
無事に新規のブックに値がセットされたと思います。
フォーマットができているブックを開くには、
oApp.Workbooks.Open FileName:="D:\TEST.xls"
と、Excel VBA の Workbooks.Open を使います。
しつこいよ、、と声が聞こえてきましたね。
なんとなくわかってきましたか?
単に、oApp.Excelのオブジェクト、プロパティとやっているだけなんですよね(笑)
/*
* 3.終わりの挨拶
*/
スイマセン、Access2000のレコード処理でトラぶってて、
今回、罫線付きの表にデータをセットする例を載せる予定だったのですが。
速めにしあげて送ります。
今回で、Excel処理のキッカケとなれば幸いです。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<IE操作 リンク先を取出す>
どうも、三流プログラマーのKen3です。
今回は、
CreateObjectでIEアプリケーション操作
をやり、リンク先を取出したいと思います。
*質問でIEでリンク先を取りたいとあったので、
今回の発行で回答します。
要望などあったら、送ってください。
/*
* 1.まず、参照設定
*/
参照設定で、
InternetExplorer Cont〜を追加する
Dim objIE As InternetExplorer と定義したかったので。
いつもの起動方法は、
Set objIE = CreateObject("InternetExplorer.application")
objIE.GoHome
objIE.Visible = True
Do While objIE.Busy = True '起動まで待つ
DoEvents
Loop
が私の使っているパターンです。
インターネットエクスプローラー起動後、
.GoHomeで初期ページを表示。
.Busyの値を見て、起動までループしてます。(無限ループ)
(初回の起動が時間がかかるので。)
/*
* 2.オブジェクトの中身を探る
*/
デバックで止めて、変数の中身を見ます。
*オブジェクトで使えそうな値を確認する。
ウォッチ式を追加して、確認します。
http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi
? objIE.Document.links(1).outertext
[ 掲示板 ]
? objIE.Document.links(1).outerHTML
<A href="http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi"
target=_blank>[ 掲示板 ]</A>
.href .outertext .outerHTMLが使えそうなので、
~~~~~~~~~~~~~~~~~~~~~~~~~~~
今回使ってみます。
*さらっと書いてるけど、ここまでたどり着くのにかなりかかっている(笑)
/*
* 3.単体テストが完了、作成してみる
*/
単体のオブジェクト、プロパティの確認が終わったので、作成に取りかかります。
Sub ken3_url()
Dim objIE As InternetExplorer
Dim time10 As Date
Dim strURL As String
Dim i As Integer
On Error GoTo EMSG
Rows("13:1000").Select '結果の表示エリアをクリアする
Selection.Delete Shift:=xlUp
Set objIE = CreateObject("InternetExplorer.application")
objIE.GoHome
objIE.Visible = True
Do While objIE.Busy = True '起動まで待つ
DoEvents
Loop
nYLINE = 10 '10行目からチェックスタート
Cells(nYLINE, 1).Select
DoEvents
Cells(nYLINE, 2) = Now() 'テストで時間を代入
strURL = Trim(Cells(nYLINE, 1)) 'URL代入
objIE.Stop '読み込み停止(意味無いけど)
objIE.Navigate "" & strURL 'アドレスを渡し表示する
'読みこみ完了まで待つ
'20秒後を計算して、待つ
time10 = DateAdd("s", 20, Now())
Do While objIE.Busy = True
DoEvents
If time10 < Now() Then
Exit Do
End If
DoEvents
Loop
If objIE.Busy = True Then
Cells(nYLINE, 4) = "読み込みに失敗しました"
MsgBox "読み込みに失敗しました"
End If
'リンクを探す
nYLINE = 13 'セット位置を代入
'リンク数分まわす
For i = 1 To objIE.Document.links.Length - 1
Cells(nYLINE, "A") = "'" & objIE.Document.links(i).outerText
Cells(nYLINE, "B") = "'" & objIE.Document.links(i).href
Cells(nYLINE, "C") = "'" & objIE.Document.links(i).outerHTML
nYLINE = nYLINE + 1 'セット位置を+1する
Next i
objIE.Quit 'IEを閉じる
MsgBox "終了しました"
Exit Sub
EMSG:
Cells(nYLINE, 2) = "ERR"
objIE.Quit '
MsgBox "errが発生しました"
Exit Sub
End Sub |
/*
* 4.終わりの挨拶
*/
今回は、IEのリンク先を見るでした。
読者からの要望は、広告自動クリックソフトだったけど、
そこまでは、実力無かったので(笑)
では、また。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
--------------------------------------------------------------------------
皆さまのご意見・ご感想・投稿、、毒舌、、どんどんお待ちしております。
今後やってほしい要望、説明してほしい関数などあったら、
メールに気軽に書いて qaqaqa@ken3.org へ送ってください。
(メールソフトで返信ボタンを押して送ってください)
指摘メールやご意見メール、
嫌いそうに見えて、実は好き(変わり者)なんで、どんどん、送ってください。
有料版なので、遠慮無く質問下さい。待ってます
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
このメールマガジンの解除は、
http://www.ken3.org/pmagmag/
からできます。(涙)
無料版でVBAの単体解説しているので、こちらも合わせて見てください。
三流君の書いてる無料版メルマガ
http://www.ken3.org/vba/ VBA関係主にExcel/Access関数を少し
http://www.ken3.org/asp/ ASP関係、Web上で少し遊んでます
http://www.ken3.org/24h/ 元コンビニ店長だったので、コンビニの話を少し
http://www.ken3.org/guchi/ 作者の貧しい心の中が見れる愚痴系
上記4つは無料なので試しに登録して見てください。
~~~~~~~~~~~~~~~~~~~~
総合案内のページは、
http://www.ken3.org/
がトップページとなってます。
以上、有料版のお知らせでした
*無料版のバックナンバー見て、文体や内容、作者と相性が良さそうだったら、
ぜひ登録して下さい。待ってます。
_
_
三流君のHP主な飛び先
[Ken3の日記(weblog)]