AB型の変わり者 三流プログラマー 業務の愚痴

[バックナンバー目次] [掲示板] [メルマガ登録・解除] [愚痴系TOPメニュー]

バックナンバー No.165 〜 No.169


[No.165 金の卵さん達へ、あっKen3みたいに腐ったリンゴ君も見てね]
[No.166 劣悪環境が人を育てたりもする?]
[No.167 Ctrl+C + Ctrl+V を使う前に一呼吸置こうよ]
[No.168 Googleの力 と 調子のいい打線はいじらないこと(笑)]
[No.169 労力は少なく 汎用性を持った関数、データの外だし]

広告:


No.165 2003/05/15
金の卵さん達へ、あっKen3みたいに腐ったリンゴ君も見てね
[ページTOPへ戻る]

<金の卵さん達へ、あっKen3みたいに腐ったリンゴ君も見てね>

こんにちは、Ken3です。 どちらかと言えば、まわりからは嫌らわれてるタイプ、 イジメられる要素ありのKen3です。 そんなまわりの同僚から嫌われてた人間できてない私でも、 プログラマーやれてたので(三流だけどね) よし、プログラマーで稼いでみるかって人たちが増えることを願いつつ メルマガ発行してます。 ※毎日発行だと、うざいって、解除が増えるんだよな。  今読者数810人です、ピークの1500人から下降線です(笑) なんて前置きを書きつつ、 今回は、読者より、 体験談もらったので、紹介兼ねて連続発行します。 ~~~~~~ Ken3のフト思った独り言、 メルマガ購読しないで、HPに定期的に見に行ったほうが良くない? 内容一緒だし、、、あっ、解除しないでね(笑)

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

前回、プログラマーを目指している人向けにいろいろと思ったことを書いてました。 それに対して、下記のようなメールをいただきました。 ある読者さんより --- >こんにちは。 >いつも会社で読ませてもらってます。(暇なので) >最近小さな会社のPGになった者です。 > >メールアドレスは公開しないでくださいね。(バレバレなので) > >プログラマーになりたい方へちょっとアドバイス。 >私がプログラマーになるまでの道のりを紹介します。 > >私は大学へ行きたかったけどお金の関係で >行けなかった高卒の19歳なのですが、 >プログラマーになろうと就職活動をした時は >「高卒=もう全然ダメ。馬鹿多すぎ」っていう >イメージがあるようでどの会社も「専門学校卒・大卒以上希望」で >全然とりあってくれませんでした。 > >その時はPGはあきらめていろんな事を手広くやってる会社(自称IT企業)に >入ってコピー機の保守をやってました。 >最近のコピー機ってネットワークで共有してPCにデータをI/Oできるのですが >コピー機保守の部署にはネットワーク&&PC触れる人間がいなくて >入社してすぐ私がコンピュータまわりの担当をする事になり >それから半年たって、コンピュータ関係のスキルが認められて >ネットワーク関係の部署に配属になりました。 >そこではActiveDirectlyでDomainでForest関係をやっていたのですが >私が作業の効率をあげるために自作のユーティリティソフトを作っていたのを >たまたま偉い方が見てソフトウェア開発の部署に配属ということになりました。 > >まさか自分でもここまでうまくいくとは思っていなかったので >開発の部署に来た時は本当に嬉しかったのですが >PGになったらなったでまた別の問題が・・・・ > >学歴がなくたって(小さな会社の)PGになることはできます。 >という報告でした。 > >*VB系しか触れないってどうなんでしょう? >*たしかにAccessの開発工数の短さには驚いたのですが >*どうしても環境がM$に依存しちゃいますよね? >*というわけでVB系しか触れない上司を横目に勉強がてら >*こそこそJSP+Oracleでグループウェア作ってますが・・・ --- いい、成功のストーリーですね。 サルマネでは、うまくいかないけど、みなさんも参考としてみては?

/* * 2.話を強引に広げてみる */

で、終わると、やはり三流君らしくない、 ここは、話を広げて愚痴らないと(笑) ~~~~~~~~~~~~~~~~~~~~~~~~~~ 部分引用の怖さと話の強引な進め方を一緒に読んで楽しんでみてください。 ※わざと違う印象を植え付ける書き方してますが、  過去のメルマガ紹介なので気にしないでくださいね。 >こんにちは。 >いつも会社で読ませてもらってます。(暇なので) >最近小さな会社のPGになった者です。 小さな会社、、小さな会社は短納期が多くて(期間の長いプロジェクトが少ない) ツライって人と、短納期をいっぱいこなす方が好きって人と、いろいろだと思います。 ※私は小さな会社、中堅会社しか経験無いけど。 ヒマなので、この言葉をそのまま受け取ってはいけません。 ~~~~ヒマ=仕事無い、そんな感じの場合もあるかもしれませんが、 仕事できる人は時間の使い方がうまく、ヒマを作れるんですね。 その時間を次の作業の調査や軽めのテストであたり付けに利用したりして、 次もうまく作業が流れたり成功したりするんですね。 -- 悪循環の逆の言葉って?どんな言葉?とフト思った、   ものごとが好転し続けるって意味のことば、、なんだっけ、出てこない(笑)   感覚的にはそんな感じですね。 いつも仕事に追われていると、調査期間が無く、 できるorできないの判断は置いといて、 たぶんできるだろうと思って見切り発車、 しばらく進むと、やはりできない・・と出戻り、違う道を模索・・ なんて最悪パターンはめったにないけど、 三流君の愚痴マガ読むくらいの余裕がほしいよね。 えっ、テメエのマガ読んでもタメにならないって?イタイなぁ。 そんなこと言わないで、 [No.141 これで、「できる」と思えば苦にならない?みたいだけど] http://www.ken3.org/backno/backno_guchi28.html#141 少し違うけど、↑研究熱心な人は成長していって、差がつくって話です。 ※目的地まで歩いて歩き出す人 と 違う方法を探す人を読んでください。 >メールアドレスは公開しないでくださいね。(バレバレなので) 了解です。 Ken3のことわざシリーズ頭隠して尻隠さずだと、 ******@ken3takosuke.co.jp って、頭だけつぶしても、けんぞうタコスケ会社かぁ、どんなとこだろう? www.ken3takosuke.co.jp/ で見てみるか とか なっちゃうもんね。 たまに読者メールの後ろにwwwつけて、在籍会社のHP見てますよ。 クレームくれる一流さんはやはり大きな会社だったり、 私と同様に個人でドメインとって活躍している人とイロイロ居て、 メールアドレスからの情報ってのも面白いですよね。 話を戻して、 >プログラマーになりたい方へちょっとアドバイス。 >私がプログラマーになるまでの道のりを紹介します。 > >私は大学へ行きたかったけどお金の関係で >行けなかった高卒の19歳なのですが、 >プログラマーになろうと就職活動をした時は >「高卒=もう全然ダメ。馬鹿多すぎ」っていう >イメージがあるようでどの会社も「専門学校卒・大卒以上希望」で >全然とりあってくれませんでした。 個人的な意見だけど、 専門学校出て使えないヤツよりは、 高卒ですぐに働くって人のほうがいいような...私の印象はよかったけど。 専門学校、大学でまともに勉強する人も居るんだろうけど、 「高卒=もう全然ダメ。馬鹿多すぎ」 よりは、 「専門学校、意味無し、でもキーボードぐらいは打ててExcelの表は作れるか」 って感じだけど、みなさんの感想は? 軽めの感想は掲示板へ、重たいのは直メールでもOKです。 ※こんなこと書いてるけど、  新卒の就職活動って思ったよりも大変なんだろうなぁ  私のときはバブルだったので。。。誰でも入れたからそんなこと言えるのかも。 >その時はPGはあきらめていろんな事を手広くやってる会社(自称IT企業)に >入ってコピー機の保守をやってました。 >最近のコピー機ってネットワークで共有してPCにデータをI/Oできるのですが >コピー機保守の部署にはネットワーク&&PC触れる人間がいなくて >入社してすぐ私がコンピュータまわりの担当をする事になり >それから半年たって、コンピュータ関係のスキルが認められて >ネットワーク関係の部署に配属になりました。 入社してから、ぼーっと仕事してなくて、、って感じですね。 引き上げてくれた上司も見る目があってよかったですね。 よく聞くパターンだと、念願のコンピュータ会社に入社、 オペレータの運用・保守作業をやる、ただスケジュール通りにリスト出力、運用のみ で、5年たっても何もできません。 (会社固有のシステム運用のプロになったけど、ほかでは..) >そこではActiveDirectlyでDomainでForest関係をやっていたのですが >私が作業の効率をあげるために自作のユーティリティソフトを作っていたのを >たまたま偉い方が見てソフトウェア開発の部署に配属ということになりました。 自分の作業効率を上げるために、 自作のユーティリティ、これだよね。泣かせる話だよね。 システム運用に穴やムダがあったから、改善してみよう。 それが自分の知識やスキルになったみたいで。 もし、使いやすい穴の無いシステム/作業工程表があったら、 タダのロボット作業者のまま?だったかもしれませんね。 ※まぁ、完璧システムは無いので、どこかに改善点があるんだけど、  改善しようって意識が無いと、見逃してしまったり、  わかってても、めんどうだから、そのまま、時間かければ出来るし動いてるし... >まさか自分でもここまでうまくいくとは思っていなかったので >開発の部署に来た時は本当に嬉しかったのですが >PGになったらなったでまた別の問題が・・・・ これからも、サクセスストーリー作り、がんばってください。 私自身の転落ストーリーもなんとかしないと(爆) >学歴がなくたって(小さな会社の)PGになることはできます。 >という報告でした。 皆さんの参考になりましたか? 私の強引な話の進め方は無視して、成功ストーリーを参考にしてみてね。 >*VB系しか触れないってどうなんでしょう? >*たしかにAccessの開発工数の短さには驚いたのですが >*どうしても環境がM$に依存しちゃいますよね? >*というわけでVB系しか触れない上司を横目に勉強がてら >*こそこそJSP+Oracleでグループウェア作ってますが・・・ あっ、これね。 チョツト前に就職ネタで書いたけど、 VBAチョットできるヤツはいくらでも居て、 高級が取れるプログラマーの仕事には就けない。 が、 VBAちょっと出来て、オペレータ、コンピュータ運用できる人は少ない。 MS系のVBAしか知らなくっても、 コンピュータ管理、ヘルプデスク、設定まわりの人員は少ない?ので、 その職種なら転職や就職は比較的楽かなぁ。 入り口はどこでも、あとは、入ってからのはい上がりかたなのかもしれないけど。 本物なら、言語は苦にしないし、関係ないから。。。。

/* * 3.バックナンバーの宣伝 */

新人関係のバックナンバーの宣伝です。(オイオイ、ハヤク終われって) http://www.ken3.org/backno/backno_guchi_mokuji.html が愚痴系の目次です、ほかのタイトルも読んでみてね。 [No.45 Ken3の独り言 がんばれ新人君くたばれ三流リーダー] http://www.ken3.org/backno/backno_guchi10.html#45 1つインパクトのあったやつを引用します In message "Re: [三流PG No.044] Ken3の独り言 お金じゃない何か?を探して...", Date Tue, 23 Mar 2000 23:15:42 +0900 >最近VBAのキーワードで検索登録し購読している***です >4月から新社会人としてソフトハウスで働きます >あなたみたいな先輩が居ないことを願ってます >自分が先輩になった時は、1つ1つ自分のわかることを後輩に教えていきたいと思います >プログラムが少しできるからって、偉そうにしないでください >一人の人間としてあなたのこと嫌いです ---------- なんて感じで、くたばれ系の意見に対して、、、続きはHP見てね(笑) [No.52 Ken3、就職活動中の学生になめられる] http://www.ken3.org/backno/backno_guchi11.html#52 In message "三流さんへ自信つきました", Date Mon, 24 Apr 2000 23:46:41 +0900 ****** さん wrote... >>In message "質問★画像一括回転ソフト★", >>画像(例:800×600)を90度左右に一括変換するPGってありませんか? >>作らないと駄目でしょうか? >> >>知識の広いところで教えて下さい。 > >プログラマーの方々は、BMPの仕組みとか知らないんですか? >僕は今就職活動中ですがKen3より、今の僕の方が実力上だと思います。当然か。 >自信がつきました。だってKen3みたいなのがリーダーなんでしょ小さなソフトハ >ウスって? >アルゴリズムとか知らなくって、三流プログラマーとかよく言ってますね。 >三流の人に失礼じゃないかなぁ? >アルゴリズム知らないKen3でもわかると思う資料を1つ教えます。 >今月のTRY!PC5月(CQ出版社)のP9ページにAccess+Imagingコントロール >で作るスキャニング画像データベースって特集 >これ見れば、あなたでもできるでしょう、やる気があったら勉強してください。 >僕みたいな学生にこれだけ言われてくやしくないですか。 >どんなもの作ってくれるか楽しみにしてます。 >素人読者相手にしていい気になってんじゃないよ。 ------------------------------------------------------ では、就職活動中の学生プログラマーにキツイ一言を貰う。 プログラマーって?三流と一流の違いって? これにたいしては、賛否両論いろいろともりあがった。※続きはHPで見てね [No.93 プログラマー発芽の条件?] http://www.ken3.org/backno/backno_guchi18.html#93 いろいろなキッカケがあって、、、を説明したかったのだけど。 できたら、手っ取り早い発芽の方法をみんなは知りたいんだろうけど。 [No.96 環境かぁ、、ヤッパ?] http://www.ken3.org/backno/backno_guchi19.html#96 成長しないのをまわりのせいにしたり、してませんか・・・ 的なことを書いてました。環境が人を変えるのだが、環境のせいにしないでね。 [No.97 新人さんへ それとも 自分へ?] http://www.ken3.org/backno/backno_guchi19.html#97 ....「やる人」と「やらない人」の違い これは、イタイとこ突かれたなぁ。。。 [No.98 芸術的プログラムと丁寧な仕事?] http://www.ken3.org/backno/backno_guchi19.html#98 手抜き作業、書きなぐりのプログラムについて少し。 新人のうちは丁寧な仕事してね。。。 [No.121 そんなにすぐに結果は出ないって、、、] http://www.ken3.org/backno/backno_guchi24.html#121 昨年の5月病ネタ?これもどうしたらプログラムが組めるようになるのか? といったお決まりのネタでした。 ※ループ、ある周期で来る同じ質問ですね。 [No.128 給料問題発生、1024円に反応できる世界へ(笑)] http://www.ken3.org/backno/backno_guchi25.html#128 給料が上がらない、今の時代?の話。 新人と2・3年の経験者の給料の差が思ったよりも少ないって話です。 [No.133 資格ねぇ、、、昨日の試験、調子は?] http://www.ken3.org/backno/backno_guchi26.html#133 資格は取得できれば一番だけど、その勉強も役に立つよって話。 [No.137 成功や失敗の経験値を貯めよう] http://www.ken3.org/backno/backno_guchi27.html#137 成功例だけじゃなく失敗例も集めようって話、 パターンで失敗は成功の元につなげる。 その他、過去のバックナンバー、 20話に1つは読んでいて面白いかも。 160話出してるので、8話ぐらいは心に残るかも。 何かの参考、キッカケになるとうれしいけど。

/* * 4.終わりの挨拶(次回はアルのか?(爆)) */

よくわからなかったけど、何が今日は言いたかったの? えっと ・読者のサクセスストーリーの紹介 ・過去のバックナンバーの宣伝兼ねて、新人ネタを抜き出した って話でした。 読み直すとあれ?何の話だったのだろう? でも、せっかく書いたから発行しちゃえ(爆) 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 そろそろ派遣かなぁのKen3でした。 ~~~~~~~(↑オイオイ)

No.166 2003/05/19
劣悪環境が人を育てたりもする?
[ページTOPへ戻る]

<劣悪環境が人を育てたりもする?>

こんにちは、三流プログラマーのKen3です。 どちらかと言えば、恵まれた環境で育っているお坊ちゃんかなぁ。 今は珍しくは無いんだろうけど、中学の頃から家のパソコン触れてたしね。 そんな前フリは置いといて、 今回は、劣悪環境が人を育てたりもする?工夫して目的にたどり着く努力?です。 いい環境で自分は育ちたい、後輩はいい環境で育ててみたいが普通だけど、 環境が悪くて得をする?そんな不思議なこじつけ話もあるんだなぁと軽く読んでね。 まぁ、いつもの独り言だけど、聞いてください。

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

一番人気の無いメルマガ、 ASPで楽しく( http://www.ken3.org/asp/ )で、 下記のようなクレームをもらってしまった。 ※また、クレームをネタにするの(笑) 内容は、 GoogleでASPとExcelをキーワードで検索すると私のHPがみつかる。 だが、サンプルが無い。 ASP Create Excelとかキーワードを変えて検索しても、 アンタのダメなページがHITする。 まぁ、要約するとこんな感じの苦情メールが届いた。 ASPからExcelを操作するにはどうするんですか? と質問メールならまだ、ゆるせるけど、 そんな苦情のメール送る時間あるなら他のHP調べなよ と半分逆ギレで言いたかったが。。。 おっと、クレームは天の声だったっけ。 まぁ、原因はVBA系のHPで[ASP系へ]とリンクがあるので、 CreateObject("Excel.Appliction")の解説ページが、 キーワードでASP Excelで拾われてしまうかぁ。 クレームに怒ってないで、 ASPからExcelファイルの操作、やってみるか。 と軽く思ったのが、ハマる原因だった。。。 結果を先に話すと、 Server.CreateObject("Excel.Application") がエラーで、ADOを使用してExcelのデータを参照してお茶を濁したんだけど。

/* * 2.話を強引に広げてみる */

さてと、Excelを参照したいんだったら、 Set oApp = Server.CreateObject("Excel.Application") で、勝負。 あれ? Server オブジェクト エラー 'ASP 0177 : 800401f3' Server.CreateObject に失敗しました /cgi-bin/test/test053-1.asp, 行 13 無効な ProgID。 このメッセージに関する追加情報については、以下のマイクロソフト オンライン サポートのサイトを参照してください: えっダメなの、、、そっか、WebサーバーにExcelがセットアップされて無いと、 オブジェクトを作成することが出来ないのか。。。 ※あたりまえでしょ。 WebサーバーにExcelがセットされていると、 Set oApp = Server.CreateObject("Excel.Application") とVBAのAccess -- Excel コントロールみたいに比較的簡単です。 余談 レンタルサーバーの痛いところかなぁ。 自社のサーバーだったら、無いものは入れてしまえって出来るけど、 レンタルの共有だと、そんなわけにはいかないか。。。 Server.CreateObject("basp21pro")が使えたので、もしかしてと思ったけど甘かった。 宣伝 私が現在使っているレンタルサーバーの紹介、 http://www.ken3.org/asp/server.html ASP で Access MDB が使用可能 Server.CreateObject("ADODB.Connection")で BASP21Pro でメールが送信可能 Server.CreateObject("basp21pro") が使用可能、 検討してみてね(HPから申し込んで手数料Getさせて(爆)) ※でも、今回の、 Set oApp = Server.CreateObject("Excel.Application") は、ムリです。 レンタルサーバーの環境が整っていないからなぁ 環境が悪いんだよね、環境が・・・ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 環境がそろっていれば、オレ様が活躍できるのに、環境がそろっていれば。 [No.96 環境かぁ、、ヤッパ?] http://www.ken3.org/backno/backno_guchi19.html#96 成長しないのをまわりのせいにしたり、してませんか・・・ 的なことを書いてました。環境が人を変えるのだが、環境のせいにしないでね。 [No.97 新人さんへ それとも 自分へ?] http://www.ken3.org/backno/backno_guchi19.html#97 ....「やる人」と「やらない人」の違い これは、イタイとこ突かれたなぁ。。。 そんなこんなで、 環境のせいにしてあきらめてしまっては、成長しないんですね ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ちっ、しょうがねえなぁ、うちの会社貧乏だからと文句を言いつつ 他の方法もあるかもしれない、調べてみようと思って、行動すると、 違う手法を勉強、取得できて、自分の実力がついたりする(はず) ※自力でがんばんないで、ライブラリを買ったり、  お金かけて環境のほうを整備して対応が正解の時もあるけど。 アプリの機能を使わないでデータセットだけなら何か方法あるだろう。 まずは、データの枠だけ作っておくか。 Excel立ち上げて、 ブックの名前はtest053.xls シートの名前はDATA 項目とデータを適当に入れてと A列 B列 C列 USERNAME MEMO WriteTime Ken3 メモメモ 2003/5/15 TEST なぜ?出来ないの? 2003/5/13 -- と表を作成しました ↑作成した表のイメージ 次は、この表を外部から操作するのかぁ。 流行中のADOでxlsと接続してみますか。 どこかの雑誌の記事で、ADOでExcelデータ参照とか載ってた記憶あるし。 ※何気ない雑誌の記事や、HP、MLなどの記憶が役に立つときもある。  でも、再度その記事を探そうとして見つからない時の悲しさは笑えるよ。 Googleの検索で、 ADO Excel 接続 と入れると、星の数ほどサンプルが出てくる。 大体がAccessからADOでExcelと接続のパターンです。 で、ODBCとかサーバー側の設定をイタズラできないので、 (環境がODBCを設定できる環境なら、ここから先にも進まなかったかも) 情報をしぼっていく、それとヘルプを見ながら何とか作成のメドを立てる。 一番参考になったページは、 ADO Recordset - Database - Excel 97 http://kobobau.com/xls/yama/vba/db.ado1.html です、ここ見てねで終わってもいいくらい、 ADO関係、丁寧な解説でした。私も見習わないと(笑) ※他にもいいページがGooleの検索で出てきますね。 まずは、 'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん Set rs=Server.CreateObject("ADODB.Recordset") と、ADOのレコードセットのオブジェクトを作成します。 次は、接続文字を設定します。 Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test053.xls") & ";" 呪文のように使っているけど、 Driver=で使用するドライバー、 DBQ=で位置を渡しているみたいなので、詳しくヘルプで探って、 Excel以外でも対応可能か?今後見てみたいですね。 次はお約束のSQL文です。 シート名がDATAなので、 strSQL = "select * from DATA" と設定、(※ウソついてます、詳細は続きを見てください) さて、パラメータがそろったから、レコードセットを開きますか。 '接続文字列、SQLを渡して、レコードセットを開く Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly よし、ここまでの簡単なプログラムで実行してみる。 あれ、下記のようなエラーが出た。 Microsoft OLE DB Provider for ODBC Drivers エラー '80040e14' [Microsoft][ODBC Excel Driver] SQL ステートメントが正しくありません。 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、または 'UPDATE' を使用して ください。 Microsoft OLE DB Provider for ODBC Drivers エラー '80040e37' [Microsoft][ODBC Excel Driver] オブジェクト 'DATA' が見つかりませんでした。 オブジェクトが存在していること、名前やパス名が正しいことを確認してください。 う〜ん、なんだろう? DATAシートが見つからないのかぁ。 [No.137 成功や失敗の経験値を貯めよう] http://www.ken3.org/backno/backno_guchi27.html#137 成功例だけじゃなく失敗例も集めようって話、 パターンで失敗は成功の元につなげる。 サンプルのコピーでストレートにできなくて、 試行錯誤したり、調べたりすると、それだけで実力がつく場合がある。 みなさんも、教えられた方法できなかった時は、いきなり先輩に聞かないで、 自分で少しは調べてみると自然と実力が上がると思います。 話を元に戻してと、 あっ、シート名じゃなくて、名前付けした範囲じゃないとダメみたい。 よし、ExcelセルにDATA_RANGEと名前を付けます。 ↑Excelメニューから挿入--名前--定義で名前を設定する。 strSQL = "select * from DATA_RANGE" と今セルに付けた名前の範囲を使用します。 エラー無くやっと終了。 あとは、レコードの中身を表示をプラスして、下記のように作成しました。 http://www.ken3.org/cgi-bin/test/test053-1.asp でテストできます。 <%@LANGUAGE=VBScript%> <html> <head> <title>ASPからADOを使用してExcel(*.xls)に接続してみた</title> </head> <body> <h2>ASPからADOを使用してExcel(*.xls)に接続してみた</h2> test053-1.asp<br> ASPからADOを使用してExcel(*.xls)に接続するテストを行う<br> <hr> <% 'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん Set rs=Server.CreateObject("ADODB.Recordset") strSQL = "select * from DATA_RANGE" Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test053.xls") & ";" Response.Write "作った、使った接続文字列は<br>" & Con & "<hr>" '接続文字列、SQLを渡して、レコードセットを開く Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly strOUT = "" Do While Rs.EOF = False For Each FieA In Rs.Fields strOUT = strOUT & FieA.Name & " -- " & FieA.Value & "<BR>" Next Rs.MoveNext '次のレコードへ移動 Loop Rs.Close Set Rs = Nothing Response.Write strOUT '結果を表示 %> <hr> [<a Href="test053.xls" TARGET="_blank">test053.xlsを開く</a>]<br> </body> </html> ポイントは、 わかってしまえば流れるように進み、簡単なんだけど、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん Set rs=Server.CreateObject("ADODB.Recordset") と、レコードセットのオブジェクトを作成。 strSQL = "select * from DATA_RANGE" Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test053.xls") & ";" SQL文と接続のパラメータを設定。 Driver={Microsoft Excel Driver (*.xls)} と呪文のように(笑) '接続文字列、SQLを渡して、レコードセットを開く Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly と、レコードセットを開きます。 あとは、いつものように Do While Rs.EOF = False For Each FieA In Rs.Fields strOUT = strOUT & FieA.Name & " -- " & FieA.Value & "<BR>" Next Rs.MoveNext '次のレコードへ移動 Loop 得意な?ループ処理とADOレコードセットに対しての処理です。

/* * 3.環境がそろっていなくても、、、(本音はそろっていると楽だけど) */

Server側にExcelがインストールされていない環境だったので CreateObjectが使えなかったので、 たまたま、別の方法を試行錯誤して、ADOでExcelの接続を私が覚えたって話でした。 もし、Excelが使えるレンタルサーバーだったら、 ADOでExcelの接続は調べないで、 いつもの方法、CreateObjectでオブジェクト作成し操作のパターンだったと思います。 サーバー環境の話から職場環境の話に飛ぶけど、 手取り足取りなんでも教えてくれるやさしい先輩、いい環境にタダ座っている人と、 冷たいほったらかしの先輩、自分で調べるしか生き残れない最悪環境、 どっちもどっちだけどね。 あっ、一番いいのは、十分な環境で簡単にやりつつ、 自分にハンデじゃないけど、使いやすい方法を置いといて、 使いにくい方法も空いた時間に試してみる研究心や探究心があるのが、 一番いいのかなぁ。 結局、環境もあるけど、自分の意思で動き回ろうよ、、ってことかな。 この不況の悪環境から育つ方法を私も考えて実践しないとなぁ(笑)

/* * 4.終わりの挨拶(次回はアルのか?(爆)) */

よくわからなかったけど、何が今日は言いたかったの? えっと 環境にめぐまれてないと、必要に迫られて育つ、工夫する って話でした。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 そろそろ派遣かなぁのKen3でした。 ~~~~~~~(↑オイオイ)

No.167 2003/05/23
Ctrl+C + Ctrl+V を使う前に一呼吸置こうよ
[ページTOPへ戻る]

<Ctrl+C + Ctrl+V を使う前に一呼吸置こうよ>

こんにちは、三流プログラマーのKen3です。 どちらかと言えば、芸術的プログラムとは無縁の三流プログラマーです。 えっ、そんなのわかってるって? そんな前フリは置いといて、 今回は、 Ctrl+C + Ctrl+V を使う前に一呼吸置こうよ コピーして編集するプログラムは工夫できる率が高いよ って話です。 まぁ、いつもの独り言だけど、聞いてください。

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

VBA系のメルマガで、And演算子、Not演算子の解説を行ってました。 自己レスじゃないけど、フトお馬鹿なことに気がつく。 ※いつになったら、手前味噌的な自慢系のメルマガに成長できるのだろう(笑)  オレ様のプログラムってキレイだろ、芸術品だよ、、と  いつか自信を持って、言って見たいよね。。。 おっと、挨拶はこれくらいにして、

/* * 2.コピー -->貼り付け で作るプログラムの罠(笑) */

No.76 Access レポート Me.NextRecord = Falseで移動を止める http://www.ken3.org/backno/backno_vba16.html#76 左端ならラベルを表示、レコード移動を止め次に実データを印刷する そんなテストプログラムなのですが、 初めは下記のように、普通に作成してました。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    If (Me![cntA] Mod 3) = 1 Then  '左端なら
        If pFLG = False Then 'まだラベルエリアを印刷してなかったら
            Me.NextRecord = False      'レコードの移動をまず止める
            pFLG = True  '印刷フラグを立てる
               'ここにラベルのOn/Off処理を入れる
            Me![lab01].Visible = True
            Me![lab02].Visible = True
               '実データをOff  <−−−注目(笑)
            Me![ID].Visible = False
            Me![WrietTime].Visible = False
            Me![F_TITLE].Visible = False
            Me![F_MEMO].Visible = False
        Else
               'ここにラベルのOn/Off処理を入れる
            Me![lab01].Visible = False
            Me![lab02].Visible = False
               '実データをOff  <−−−注目(笑)
            Me![ID].Visible = True
            Me![WrietTime].Visible = True
            Me![F_TITLE].Visible = True
            Me![F_MEMO].Visible = True
        End If
    Else
        pFLG = False  'その他の時
    End If

End Sub
よく見ると、同じような処理があって、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'ここにラベルのOn/Off処理を入れる Me![lab01].Visible = True と Else 'ここにラベルのOn/Off処理を入れる Me![lab01].Visible = False みたいな感じでOn/Offが逆なだけでした。 まぁ、処理が 左端ならラベルを表示、実データは非表示、 その他はラベル非表示、実データを表示だから、 True/Falseが違うだけで同じなんですよね。 そっか、それで、キーボードでCtrl+C,Ctrl+Vでコピーして、 True/Falseを逆に書いたんだ。 えっ、なんでCtrl+C,Ctrl+Vでコピーしたってわかったの? だってさ、コメントが直ってないんだよ、アンタのコメントが? えっ、どこどこ? よく見ろよ、 If pFLG = False Then 'まだラベルエリアを印刷してなかったら Me.NextRecord = False 'レコードの移動をまず止める pFLG = True '印刷フラグを立てる 'ここにラベルのOn/Off処理を入れる Me![lab01].Visible = True Me![lab02].Visible = True '実データをOff <−−−注目(笑) Me![ID].Visible = False Me![WrietTime].Visible = False Me![F_TITLE].Visible = False Me![F_MEMO].Visible = False と Else 'ここにラベルのOn/Off処理を入れる Me![lab01].Visible = False Me![lab02].Visible = False '実データをOff <−−−注目(笑) Me![ID].Visible = True Me![WrietTime].Visible = True Me![F_TITLE].Visible = True Me![F_MEMO].Visible = True End If を良く見ると、 '実データをOff ^^^^^^^^^^^^^^^^^ ってコメントが一緒だよ。 Elseの部分のコメントは、実データをon、可視にする ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ が正しいんじゃないの? コピーして作るのもいいけど、直してね、 コメントだから、まだ実害なかったけど、 もし、TrueとFalseを逆にするのを直し忘れてたら? ゾッとするよね。 最近の開発スタイルって、エディターに直打ち、即実行確認、 なんて環境だから、 一呼吸置いて、考えないでコピー、貼り付けって多いと思う。 で、コピーした一部(部分的範囲)を変更する。 修正中にメールや携帯が鳴って、割り込みが入り作業中断、 そしたら、修正忘れがあったり、、なんて変なストーリーあったりしてね。 たまたま、今回は、 VBA系の No.77 Not演算子で細工する、プログラムはパズルのように... http://www.ken3.org/backno/backno_vba16.html#77 で、 Not演算子を使用して下記のようにまとめてみたけど、 何も考えないと、私のように同じ処理が氾濫してたりするよ(笑) 手前味噌、芸術的、ナルシスト的プログラムって言われてもたまには作ってみようよ。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    If (Me![cntA] Mod 3) = 1 Then  '左端なら
        'フラグを使用して可視/不可視をセットする
        Me![lab01].Visible = Not pFLG  'ラベルはフラグの逆をセット
        Me![lab02].Visible = Not pFLG
        '実データ
        Me![ID].Visible = pFLG         '実データにはフラグそのままセット
        Me![WrietTime].Visible = pFLG
        Me![F_TITLE].Visible = pFLG
        Me![F_MEMO].Visible = pFLG
        
        If pFLG = False Then 'まだラベルエリアを印刷してなかったら
            Me.NextRecord = False      'レコードの移動をまず止める
            pFLG = True  '印刷フラグを立てる
        End If
    Else
        pFLG = False  'その他の時
    End If

End Sub
と、Not演算子を使用して、まとめました。 これなら、項目の1つだけTrue/Falseの修正忘れの単純ミスもないし、 項目が増えても、2ヶ所に処理を入れなくてOKです。

/* * 3.プログラムには、ループや配列を使った処理が存在するんだよ(笑) */

画面に1回目、2回目、、4回目とMsgboxで表示してよと言われたら、 簡単なプログラムは、
Sub AAA()
   Msgbox "1回目"
End Sub
って書いてから、いつものCtrl+CでコピーCtrl+Vを3回押してと
Sub AAA()
   Msgbox "1回目"
   Msgbox "1回目"
   Msgbox "1回目"
   Msgbox "1回目"
End Sub
してから、
Sub AAA()
   Msgbox "1回目"
   Msgbox "2回目"
   Msgbox "3回目"
   Msgbox "4回目"
End Sub
と直します(笑) そんなことしないよFor文使うよ ~~~~~~~~~~~~~~~~~~ って、みなさん、心の中で言ったと思います (私が勝手にアナタの心の中を予想しました) ですよね、まぁ、コピー、一部変更プログラム極論でした。 では、チエちゃん好き、ミキちゃん好き、アキちゃん好き、マイちゃん好き と名前を出すときは?
Sub AAA()
   Msgbox "チエちゃん好き"
   Msgbox "ミキちゃん好き"
   Msgbox "アキちゃん好き"
   Msgbox "マイちゃん好き"
End Sub
じゃなくって、
Sub BBB()

    Dim strNAME As Variant
    Dim n As Integer
    '配列を代入
    strNAME = Array("チエ", "ミキ", "アキ", "マイ")
    'データを表示
    For n = 0 To 3
        MsgBox strNAME(n) & "ちゃん好きです"
    Next n

End Sub
と、ループとArrayで配列を作成の知識のある人は作るかな。

/* * 4.配列の要素数を返すUBound関数を使ったりする */

表示させたい、好きな子が増えたら? コピー君は、
Sub AAA()
   Msgbox "チエちゃん好き"
   Msgbox "ミキちゃん好き"
   Msgbox "アキちゃん好き"
   Msgbox "マイちゃん好き"
   Msgbox "アヤちゃん好き"  '午後の紅茶のアヤちゃんは好きじゃないけど(笑)
End Sub
とコピーで作成するのかな。 For君は、
Sub BBB()
    Dim strNAME As Variant
    Dim n As Integer
    '配列を代入
    strNAME = Array("チエ", "ミキ", "アキ", "マイ", "アヤ")
    'データを表示
    For n = 0 To 4 'カウンタも忘れずに増やす
        MsgBox strNAME(n) & "ちゃん好きです"
    Next n
End Sub
とデータとカウンタを増やすのかな。 まぁ、忘れそうなのが、データ増やしてカウンタを増やすことを忘れるパターン。 それを防止する方法?があって、 昔からの古典的手法は データの最後に"END""STOP","99"など、 ストップワードを入れて判断する方法もある。
Sub CCC()
    Dim strNAME As Variant
    Dim n As Integer
    '配列を代入
    strNAME = Array("チエ", "ミキ", "アキ", "マイ", "アヤ", "STOP")
    'stopまでデータを表示
    n = 0 'カウンタ初期化
    While strNAME(n) <> "STOP"  'STOP以外の間ループする
        MsgBox strNAME(n) & "ちゃん好きです"
        n = n + 1  'カウントアップ次の子にする
    Wend
End Sub
これだと、ループの回数は指定しないで、"STOP"までループ可能。 まぁ、今風の書き方だと、配列の最大要素数を求めるUBoundって関数があって、
Sub DDD()
    Dim strNAME As Variant
    Dim n As Integer
    '配列を代入
    strNAME = Array("チエ", "ミキ", "アキ", "マイ", "アヤ")
    'データを表示
    For n = 0 To UBound(strNAME) '配列の最大要素までループ
        MsgBox strNAME(n) & "ちゃん好きです"
    Next n
End Sub
ASPで作った例だけど、Split関数とUBound関数のサンプル http://www.ken3.org/cgi-bin/test/test024-2.asp こっちも参考にしてみてね。

/* * 5.コントロールをループさせる For Each IN を使って */

この流れの解説だと、(話の流れだと) 読者の心の声をまたまた勝手に代弁すると、 ^^^^^^^^^^^^^^ データをプログラム内に持たないで、ファイルなど外部に持つ方法だろ、、 と 普通は来るのですが、疲れたので、今日は辞めます(笑) オイオイ、そりゃないでしょ。 えっと、このメルマガのタイトルに戻って、 タイトル?なんだっけ? 三流君、手前味噌的にプログラムを語る?だったっけ・・・ 違うでしょ、 Ctrl+C + Ctrl+V を使う前に一呼吸置こうよ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ってタイトルです。 下記のプログラムに戻ってと、 実は、ここでもCtrl+C Ctrl+Vでプログラム書いてるんですよね。 Me![ID].Visible = pFLG をコピーして、 Me![F_TITLE].Visible = pFLG Me![F_MEMO].Visible = pFLG なんて、作ってるんですね。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    If (Me![cntA] Mod 3) = 1 Then  '左端なら
        'フラグを使用して可視/不可視をセットする
        Me![lab01].Visible = Not pFLG  'ラベルはフラグの逆をセット
        Me![lab02].Visible = Not pFLG
        '実データ
        Me![ID].Visible = pFLG         '実データにはフラグそのままセット
        Me![WrietTime].Visible = pFLG
        Me![F_TITLE].Visible = pFLG
        Me![F_MEMO].Visible = pFLG
        
        If pFLG = False Then 'まだラベルエリアを印刷してなかったら
            Me.NextRecord = False      'レコードの移動をまず止める
            pFLG = True  '印刷フラグを立てる
        End If
    Else
        pFLG = False  'その他の時
    End If

End Sub
このプログラムでもいいんだけど、 実データの印刷フィールドが追加になったら、(F_TAKOフィールド) Me![F_TAKO].Visible = pFLG と、プログラムの追加が発生します。 フィールドが追加になったから、ショウガナイヨネ、これは。 まぁ、そうなんですが、よく見ると、 Me![lab01]とMe![lab02]のラベル関係 と 実データのMe![F_XXXXX]の実データ関係 そんな2つのグループ分けができてます(IDとwriteなど例外あるけど(笑)) コントロールの名前付けで、 規則性があるなら、ループでまわせよってことで、 ↑~~~~~~~~~~~~~~~~(コントロール名を規則正しく作って) Controlsコレクションでまわしてみます。 Controls?コレクション? コントロールにアクセスする方法は、 Me.Controls!新規データ Me.Controls![新規データ] Me.Controls("新規データ") なんて、名前を指定する方法と、 インデックスでコントロールを参照することもできます。 Me(0) ' コレクションの最初の項目を参照します。 Me.Controls(0) これを利用して、
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    Dim n As Integer
    If (Me![cntA] Mod 3) = 1 Then  '左端なら
        For n = 0 To Me.Controls.Count - 1 'コントロールの数ループする
            If Left(Me.Controls(n).Name, 3) = "lab" Then '名前はラベル
                Me.Controls(n).Visible = Not pFLG
            Else
                Me.Controls(n).Visible = pFLG
            End If
        Next n
        If pFLG = False Then 'まだラベルエリアを印刷してなかったら
            Me.NextRecord = False      'レコードの移動をまず止める
            pFLG = True  '印刷フラグを立てる
        End If
    Else
        pFLG = False  'その他の時
    End If
End Sub
と書いて、 コントロールの名前付けの規則でTrue/False を 切り替える方法も1つの手です。 Me.Controls(n).Visible あっ、これが三流君のうわさのクセね。 ループのカウンタでまわしたがるってヤツね。 VBA系の No.73 オブジェクトのループはFor Each In でループさせる http://www.ken3.org/backno/backno_vba15.html#73 で、 偉そうなこと語ってて、これかよ。 ~~~~~~~~~~~~~~~~~~~~ わかったよ、一般向けにFor Each版に修正するよ。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    Dim objITEM As Object  'コントロールのオブジェクトを入れる変数
    If (Me![cntA] Mod 3) = 1 Then  '左端なら
        For Each objITEM In Me.Controls 'コントロールを取り出しループする
            If Left(objITEM.Name, 3) = "lab" Then '名前はラベル
                objITEM.Visible = Not pFLG
            Else
                objITEM.Visible = pFLG
            End If
        Next

        If pFLG = False Then 'まだラベルエリアを印刷してなかったら
            Me.NextRecord = False      'レコードの移動をまず止める
            pFLG = True  '印刷フラグを立てる
        End If
    Else
        pFLG = False  'その他の時
    End If

End Sub
これなら、ラベルと実データの切り替えも、 コントロール名の規則にしたがって作成すれば、 変更の少ないプログラムで済みますね。

/* * 6.終わりの挨拶(次回はアルのか?(爆)) */

よくわからなかったけど、何が今日は言いたかったの? えっと、 Ctrl+C , Ctrl+V でサクサク?コーディングするんだけど、 ちょっと待てよ、 コピー、貼り付け、一部変更、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ なんてプログラムには、一工夫する余地があるのでは? って話でした。 まぁ、キーボード打つのが早い、エディター使うのが早い そんな若いプログラマーにトータル的に勝つには、 変更が来たとき、キーボード打量を減らす(もしくは打たなくていい) そんなプログラム作りたいよね、 30代のキーボード打ち込み遅いおっさんプログラマーとしては(爆) 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 手前味噌プログラム発表したいよねのKen3でした。 ~~~~~~~(↑オイオイ)

No.168 2003/05/28
Googleの力 と 調子のいい打線はいじらないこと(笑)
[ページTOPへ戻る]

<Googleの力 と 調子のいい打線はいじらないこと(笑)>

こんにちは、三流プログラマーのKen3です。 まだ、つぶされずに生き残ってます(笑) そんな前フリは置いといて、 今回は、 って話です。 まぁ、いつもの独り言だけど、聞いてください。

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

[No.166 劣悪環境が人を育てたりもする?] http://www.ken3.org/backno/backno_guchi33.html#166 で、 >GoogleでASPとExcelをキーワードで検索すると私のHPがみつかる。 >だが、サンプルが無い。 >ASP Create Excelとかキーワードを変えて検索しても、 >アンタのダメなページがHITする。 >まぁ、要約するとこんな感じの苦情メールが届いた。 > >ASPからExcelを操作するにはどうするんですか? >と質問メールならまだ、ゆるせるけど、 >そんな苦情のメール送る時間あるなら他のHP調べなよ >と半分逆ギレで言いたかったが。。。 > >おっと、クレームは天の声だったっけ。 >まぁ、原因はVBA系のHPで[ASP系へ]とリンクがあるので、 >CreateObject("Excel.Appliction")の解説ページが、 >キーワードでASP Excelで拾われてしまうかぁ。 ---- と、ASP Excelで、VBA系の普通のExcel操作が拾われてしまう話をしました。 で、少し悔しくなって、ASPでADO から Excelの操作をしてみました。 ※ASPからADOを使用してExcel(*.xls)に接続してみた http://www.ken3.org/cgi-bin/test/test053-1.asp を見てください。

/* * 2.Googleの力 */

たまたまなんだけど、月に一度のGoogleの更新が行われました。 http://www.google.co.jp/search?q=ASP+Excel&lr=lang_ja で、無事2ページ目 http://www.google.co.jp/search?q=ASP+Create+Excel&lr=lang_ja ASP+Create+Excelだと1ページ目にASPのページが無事表示された。 すごいなぁ、検索のルーチンって? どこが? チョット前までは、 VBA系の解説で Create Excel と 離れたASP系ってリンクで拾っていたのに、 キーワードの近い方を拾ってくるように修正されてるし。 キーワードのマッチング処理って奥が深いなぁと思いつつ、

/* * 3.調子のいい打線はいじらない?ほうがいい */

さてと、調子のいい話のあとは、 自分落としネタを書かないと愚痴マガらしくないので、 調子のいい打線はいじらない?ほうがいいって話です。 ^^^^^^^^^^^^^^^^ 何言ってるのか、よくわからないんだけど? えっとですね。 いつものログ分析で、 http://www.ken3.org/cgi-bin/test/test039-1.asp ↑過去一週間のアクセス数。 これみると、少し前まで、 http://www.ken3.org/cgi-bin/test/test027-2.asp が断然TOPになっていた。 ログからリンク元の検索情報をみると、 不思議とSQL INSERT INTOの条件でTOP3に入っていた。 ※多いときは一日100ページビュー  (テストで実行したりして、実際は100人以下だけど) めちゃくちゃ、調子が良かったんですね。 すると、欲がでてきて、 ~~~~~~~~~~~~~~~~~~~~~~ 来場者が多いんだから、 ここから自分のHPに引き込もう(笑) と思い、リンクを貼りまくった。 ※バックナンバーのページじゃないのに、  下にバックナンバーのタイトル・リンクを全て書き込んだ。 もう、わかりましたよね? せっかく調子が良かったのに(検索結果の上位だったのに) 自分から内容をいじったらさぁ大変、 Google検索処理のルーチンは、余計なキーワードも拾ってしまい、 SQL INSERT INTOの条件が全体量からみると薄くなってしまった。 広告、クリックしてほしいから、ページの頭に広告入れてみたり。。。。 調子のいい打線はいじらない?ほうがいい ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ そんな野球の格言があったかどうかは知らないが、 検索結果、調子のいいページは、ランクが下がるまでは、 自分から動かないほうがいいのかなぁ、、、とフト思った。

/* * 4.キーワードを拾うロジック */

キーワードを拾うロジックって、気になるよね。 自分の意図しないページが拾われることもあるし。 (検索して、意味無いページもたまに上位にあったり) 私の代名詞は三流君だけど、 AB型 プログラマー でも上位にひっかかります。 で、面白いのが、 B型 プログラマー ~~~とABをBにしても、上から5番目ぐらいに引っかかります。 まぁ、人間がみてるんじゃないし、ここまで求めるのは酷かなぁ。 ※逆に言うと人間の解析能力ってすごいんだなぁと思ったり。 なんて思いつつ、 "B型" "プログラマー" で検索すると、おっ、B型のプログラマーのHPが出てくるよ。 なんだぁ、検索条件の指定が甘かったのかぁ(笑) ※キーワードを""で囲うのも、たまにはテストしてみてください。 あとは、キーワードって、普通に書くと全て含む条件です。 VBAのJIS関係のプログラムのサンプルがほしかったら、 値を返すユーザー関数は、Functionですよね、 これを利用して、 VBA JIS Functionで検索します。 http://www.google.co.jp/search?q=VBA+JIS+Function&lr=lang_ja すると、
Function
  ・
 ・
End Function
のサンプルページが表示されます。 ASP系(VBScript)のサンプルがほしかったら、 LANGUAGE=VBScript と入れると探しやすいと思います。 まぁ、普通の使い方でしたね。 ポイントは、必ず入っているであろうキーワードを指定するでした。 あとは、物事には、逆説的考え方があって、 このキーワードは除外したいって時ですよね。 そんな時は検索ルーチンにもよるけど、 −XXXXって感じで、−マイナスを付けると除外できます。 私が良く使うのかキーワードISBN ISBN VBA プログラミング となんて指定すると、書籍を探すことが出来ます。 最近は、ネット書店が多くって便利ですよね。 いつもの宣伝をさりげなく http://www.ken3.org/etc/book.html に、書籍の通信販売関係まとめてます。(書籍探しているときは来てね) 最近のネット書店って、すごく整備されていて、 チョット前までは本のタイトル、価格ぐらいしかわからなかったのに、 いまは、当たり前のように目次や概要が載ってます。 ※立ち読み代わりに目次を読むのも面白いですよ。 話を戻して、そんなページが増えたせいなのか、 自分は本を探していないのに 書籍の目次ページがよくヒットする ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ そんな経験ないですか最近? そんな時に便利なのが、-キーワードを付けた検索です。 VBA プログラミング -ISBN あれ、、拾ってくるページがある、、、 本には値段がついているので、 VBA プログラミング -価格 だと少しはマシになった。 ※書籍を抜かした検索の例をカッコよく載せたかったのに(笑)  ツメが甘くて、三流作者らしいよね。。。

/* * 5.終わりの挨拶(次回はアルのか?(爆)) */

よくわからなかったけど、何が今日は言いたかったの? えっと、 ・ロボット君の動きの参考になれば、、 ・キーワードの指定方法 ・欲を出してHP内容更新したらランクが落ちた って話でした。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?のKen3でした。 ~~~~~~~(↑オイオイ)

No.169 2003/05/29
労力は少なく 汎用性を持った関数、データの外だし
[ページTOPへ戻る]

<労力は少なく 汎用性を持った関数、データの外だし>

こんにちは、三流プログラマーのKen3です。 まだ、つぶされずに生き残ってます(笑) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ そんな前フリは置いといて、 今回は、 汎用性を持った関数 と データは外に出そうよ って話です。 まぁ、いつもの独り言だけど、聞いてください。

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

No.167 Ctrl+C + Ctrl+V を使う前に一呼吸置こうよ http://www.ken3.org/backno/backno_guchi33.html#167 で、 コピー、貼り付けでのプログラムを作る前に、 一呼吸置いて考えましょうよ、、 って感じのことを書きました。 今回は、もう一歩進んで、違う方向から、 労力を減らすために、汎用性を持った関数の作り方 インクルードファイルを使って、変更は一箇所で済ませる方法 など、 いつもの三流プログラマーの語りから、何かをつかんでくれれば幸いです。

/* * 2.サービス?で流行っていない有料版のコピー */

有料版で作成・解説してたサンプルなんだけど、 http://www.ken3.org/p/lzh/off004.lzh に Book-004.xlsが保存されてます。 汎用性? ~~~~~~~~ プログラムが組めるようになってくると、修正のしやすさや(労力をかけたくない)、 流用の効くプログラムの書き方、、、などで差がでてきます。 私もあまり将来流用可能なプログラムを組んでないので、 偉そうなこと言えないんだけど(笑) 前回、フォルダー名を貰い、そのファイル名をセルにセットする。 なんて処理を作りましたよね。 '引数(パラメータ)でフォルダー名をもらい、 'データを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
ざっと見ると、できてるんだけど、 変更が来た時、流用が効きにくいです。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ えっ、どこが? まぁまぁ、これから書くので、あせらないで。 1つの考え方、固定処理をパラメーターにする ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ フォルダーからファイル名を取得して、データをセットしてました。 *.jpg や *.xls とファイルの指定をして取出したくなったら? コピー君の考え方は、 '最初のファイル名を取る strFileName = Dir(strFolder & "\*.*", vbNormal) この部分を、"\*.*""\*.xls"と指定ファイルに変える方法があります が、 そんなことやってたら、*.bmpがほしい、*.htmlが、、、 と 種類別に関数が増えてしまいます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ※まぁ、ボクはコピー操作が得意だし、間違えないから平気だよ  って人は、置いといて、、、 そんな時は、フォルダーと一緒にファイルパターンもパラメーターで 貰うようにします。 Call setFILELIST(strFolder, "*.*") 'データのセット ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ とファイル名とパターンで関数を呼ぶようにします。 ※関係ない話だけど、\*.*←が顔文字に見えたアナタ、重症だよ って書くってことは、Ken3がそんな風に感じたんだよね  ギクっ、、バレたか・・・ '引数(パラメータ)でフォルダー名とファイルの種類をもらい、 'データを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
たんに、 setFILELIST(strFolder As String, strPattern As String) と関数の受け取りのパラメータが増えて、 strFileName = Dir(strFolder & "\" & strPattern, vbNormal) で、指定してるだけなんですね。 関数の機能を少なくしてシンプルにする ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ もう一つのアプローチ方法として、 関数の機能を少なくしてシンプルにして 汎用性を持たせる方法があります。 ^^^^^^ なんか回りくどく説明してますが、 余計な機能がついていないほうが、 組み合わせで使える幅が増えます。 '引数(パラメータ)でフォルダー名とファイルの種類をもらい、 'データをA列にセットする setFILELIST(strFolder As String, strPattern As String) この関数、 ・フォルダー内をパターンで検索して、 ・ファイル名を新規のブックに保存します。 と、検索とデータセット、2つの機能が入ったお得な関数です。 どこが得なんだよ、、 オレは、ファイル名だけほしいのに、、、なんて時ありますよね。 ※セットじゃなくて、単品がほしいんだよ、単品が。 新規ブックに保存する処理がジャマなんですねとても。 その通り、携帯は通話だけできれば十分、えっ写メールは必要だって? まぁ、1つで何でもできるのもいいけど、 プログラムの場合、組み合わせの時、邪魔になるときがあります。 あまり分割し過ぎも、バラバラで組み合わせや管理が大変なのですが、 よく使う共通関数は、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に配列を渡すと、インデックス番号の最大値を返してくれるので、 ^^^^^^これを利用してループを作ってます。 よく、文字列分割の関数 Split関数と組み合わせてUBound関数を使ったりしてます http://www.ken3.org/cgi-bin/test/test024-2.asp ポイントは、実行時に配列の要素数が変化しているので、 その最大値をもらって、処理してます。 メインルーチンは、
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()) の関数の呼び方です。 配列変数に一度ファイル名を全て保存します で、その配列からシートにデータをセットしてます。 一回配列に保管するのがムダな場合もあるが、 機能が分かれていると、 Call setFILELIST(strBOX(), strFolder, "*.CSV") 'データのセット でCSVのファイル名を取得、 For n = 1 To UBound(strFN) 'ファイルをインポート strIN = strFolder & "\" & strFN(nYLine) strINを使用してインポート Next nYLine なんて少し変更した処理も比較的簡単に作成することができます。 シンプルな汎用性のある共通関数作りにもチャレンジしてみてください。 機能を分割すると、汎用性のあるプログラムが書けることが、 なんとなくわかったと思います。 Dim FN() As String Call setFILELIST(FN(), strFolder, "*.jpg") 'データのセット で、ファイルリストが取りたい時などに使える関数になりました。 (*標準関数に少し肉付しただけなんですが(笑)) 何かの参考となれば幸いです。 プログラム作りは簡単で面白いなぁと感じるような 解説/メールマガジンを書きたいと思ってます。

/* * 3.外部ファイルに広告データを持ち、楽に差し替える方法 */

今度は、ASP系で書いたネタ、 テキスト広告のローテーションを作ってみたくて(笑) いろいろと試行錯誤した結果を兼ねて、ASP系のネタにしてみました。 #Include File で、ファイルをインクルードする ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ASPと言っても、通常は、HTML内に<% 〜 %>でスクリプトを埋め込んでます。 a.asp <% ASP の処理A %> <html> <head> </head> <body> ヘッダ部分に目次へのリンクなど 本文 <% ASP の処理B %> フッダ、広告など <% ASP の処理C %> </body> </html> <% ASP の処理D サブルーチンなど %> まぁ、書き方のキレイさ(見易さなど) 位置によっていろいろとあるのですが、 こんな感じです。 大体、HPを作成する時、構成を決めます。 ---- 上部 HPタイトルと目次、掲示板へのリンク、、 本文があって 下部 リンクを書く人や小金稼ぎのバナー広告 ---- まぁ、わかりやすく、こんな構成だとします。 すると、上部のHTMLと下部のHTMLは変わらないんですね。 なので、ひとつの方法は、雛形のHTMLファイルを作っておいて、 それを別名でコピーして修正する、そんな方法です。 ※私も使ってます。 まぁ、コピー君するとしても、コピーしやすく雛形を作っておくんですね。。。 この方法でも良いのですが、 2・3ヶ月たってくると、広告を差し替えたいなぁ、 新しいカテゴリできたので、タイトルにリンクを増やしたい・・・ と共通だったはずのヘッダ、フッダを修正する時があります。 コピー操作が得意な若者だったら、 40ファイルぐらい平気でコピー、貼り付けをして、 確認しないで客先に提出(だってコピーしただけなんで間違えないよオレ様は) コピー忘れや2重コピー(Ctrl+Vを2回押した?)など、 40ファイルもあるとミスします。 ※若くないKen3もたぶんミスするのでしょう。 そんな時に便利な方法が、 #Includeを使ってASPを作る方法です。 ※言語によって、書き方違うのですが、実装可能な言語が多いと思います。 使い方は簡単で、 <!-- #Include File="info.inc" --> と外部から挿入したいファイルを書くだけです。 具体的な使い方は、ASPだと、 <%@LANGUAGE=VBScript%> <html> <head> <title>ASP #Include File="xxxx.inc" でファイルをインクルード</title> </head> <body bgcolor=#ffffff text=#000000> <!-- #Include File="info.inc" --> <!-- ↑ヘッダの共通イメージをインクルード --> <h2>ASP #Include File="xxxx.inc" でファイルをインクルード</h2> test058-1.asp<br> #Include File="xxxx.inc"とファイルをインクルードして、<br> 共通のヘッダ、フッダを使う<br> <hr> [<a Href="info.inc" TARGET="_blank">info.incを開く</a>] ←使用したヘッダファイル<br> [<a Href="inc_mokuji.inc" TARGET="_blank">inc_mokuji.incを開く</a>] ←使用したフッダファイル<br> <!-- #include file="inc_mokuji.inc" --> <!-- ↑フッダの共通イメージをインクルード --> </body> </html> ポイントは、 ~~~~~~~~~~~~ <!-- #Include File="info.inc" --> ↑ヘッダの共通イメージをインクルード <!-- #include file="inc_mokuji.inc" --> ↑フッダの共通イメージをインクルード なんだぁ、一行単純に書いてるだけなのね(笑) この単純に書いた一行の処理にしていると、 ヘッダやフッダのイメージを変えたい時は、 http://www.ken3.org/cgi-bin/test/info.inc http://www.ken3.org/cgi-bin/test/inc_mokuji.inc といったファイルの中身を変更するだけで、 実行時に読み込まれるので、表示内容を変更することが出来ます。 広告用のテキストファイルを用意して、そのファイルを挿入(インクルード)します。 新製品のPCが出たら、広告を差し替える。 効果の無い広告を簡単に差し替える(これが一番使うかな) なんてコトが簡単に出来ます。 http://www.ken3.org/cgi-bin/test/test058-1.asp でテストできます。イメージを確認してください。 ランダムにローテーションバナーを表示させたい ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ さてと、 #Include File を使うと、実行時にファイルを挿入可能なことがわかりました。 一歩進んだ要求だと(そんな要求私だけかもしれないけど) ランダムでバナー広告を切り替えて表示したい。 なんて、思うかもしれません。 乱数かぁ、、、 Randomize '乱数系を初期化 nNO = Int(Rnd * 10) で0〜9までの数を発生させられるので、 インクルードするファイルを http://www.ken3.org/cgi-bin/inc/hed0.inc http://www.ken3.org/cgi-bin/inc/hed1.inc http://www.ken3.org/cgi-bin/inc/hed2.inc   ・   ・ http://www.ken3.org/cgi-bin/inc/hed9.inc とバーナー広告を10種類用意しておいて、 切り替えてインクルードしてみたいです。 <% '頭で乱数の発生 Randomize '乱数系を初期化 nNO = Int(Rnd * 10) '0〜9までの乱数を発生させる strFNAME = "/cgi-bin/inc/hed" & nNO & ".inc" 'ファイル名を作る %> とファイル名を作ってから、 <!-- #include file="<%=strFNAME%>" --> で勝負、、あれれ、 Active Server Pages エラー 'ASP 0126' インクルード ファイルが見つかりません /cgi-bin/test/test058-2.asp, 行 22 インクルード ファイル '<%=strFNAME%>' が見つかりませんでした。 あっ、バカみたい、””で囲って文字列にしてるよ、 よし、””をはずして、 <!-- #include file=<%=strFNAME%> --> Active Server Pages エラー 'ASP 0126' インクルード ファイルが見つかりません /cgi-bin/test/test058-2.asp, 行 22 インクルード ファイル 'strFNAME' が見つかりませんでした。 できないのかなぁ、 まぁ、インクルードファイルが動的に切り替わる、、 なんて用途ないしね。 自分でファイルを開いて読みますか、 <% '自分でファイルを読む ' FileSystemObjectを生成します Set objFS = Server.CreateObject("Scripting.FileSystemObject") ' strFNAMEを読取専用モードで開きデータを読む Set ts = objFS.OpenTextFile(Server.MapPath(strFNAME), 1, True) Do While ts.AtEndOfStream = False 'ファイルの終端になってない間ループ strDATA = ts.ReadLine 'ファイルからデータを一行を読む Response.Write strDATA Response.Write vbCRLF '改行する Loop '使ったファイルは閉じようよ ts.close Set objFS = Nothing %> と素直に、テキストファイルを開いて1行読み込み、出力しました。 http://www.ken3.org/cgi-bin/test/test058-2.asp でテストできます。イメージを確認してください。 ポイントは ~~~~~~~~~~ 乱数の発生前に、 Randomize '乱数系を初期化 で 乱数系の初期化。 nNO = Int(Rnd * 10) strFNAME = "/cgi-bin/inc/hed" & nNO & ".inc" 'ファイル名を作る でファイル名を作ったら、 しかたなく自分でFileSystemObjectを生成して、 .ReadLineで一行読み込む、.AtEndOfStreamでファイルの終端チェック でした。 こんな感じで、 プログラム内に固定の文面を置いておくより、 変更があるデータは、ファイルとして外に置く。 実行時にそのデータファイルを参照する、 修正時はデータファイルのみを変更する。 三流君みたいな、コピー君をみなさんは、卒業してくださいね。

/* * 4.広告のローテーションバナー、あまり意味無いよ */

実は、広告のローテーションバナーって、あまり意味なかったりする。 HPの来客の状態にもよるけど。 私のHPへの来客の多くって、 メルマガ見てくるお客さんよりも(発行数600ぐらい)、 検索でHitして来る一見さんが多い。 検索で来る人って、探し物をして来る人ですよね。 当たり前でしょ(笑) そんな、エラーの原因を探したり、関数を調べている、 急いでいる人は、広告のバナーなんて、見ないんですよね。 同じ広告を見ても押さないだろうから、 広告をローテーションさせれば? と素人HP管理者は考えるけど、 実際は、違う広告を見ても、モトモト広告はクリックしないから、 意味無いんですね。 ところが、唯一意味がある場合があって、 えっ、気になる? どうしようかなぁ・・・たいしたことじゃないので、書いちゃうけど、 インターネットの一括ダウンロードソフトで、 設定に慣れてないのか?それとも光やADSLで気にしないのか? 広告ごと、まるごとHPを落としていく人がたまに居る。 広告をローテーションさせていると、そんな人が居た時に、 違う広告を落として行ってくれて、小金が稼げたりする(これホント) 広告会社、ダウンロードソフトは未チェックなのかなぁ。 ※インターネット忍者とかはダメですね。。。

/* * 5.終わりの挨拶(次回はアルのか?(爆)) */

よくわからなかったけど、何が今日は言いたかったの? えっと、 ・シンプルに汎用性をもった関数を作ってね ・外部にデータを置く、インクルードやファイル読み込みで共通データを読む ・広告のローテーション、あまり意味無いよ って話でした。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?のKen3でした。 ~~~~~~~(↑オイオイ)

ページフッター

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

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

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



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


急ぎで連絡がほしい、そんな時は:[三流君連絡先アドレス]を見て連絡してください。

リンクや広告など

項目別に↓に本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]