三流君ASPで遊ぶ、失敗する

[三流君] Top ken3.orgへ
[ASP解説] ASPの解説TOP
[ASP記事 バックナンバー] 番号順のバックナンバー
[SOHO/在宅プログラマー/派遣] 派遣のお話ほか
[...サイトマップ(総合案内へ)]




分類別ガイド
ADOで[ADO Mdb接続] ,[ADO Excel接続] ,[ADO CSV接続]

[ASP Form データのやりとりPOSTとGET]
[ASPでTextFile操作]
[ASPでVBScriptを使う]
[その他サンプル]

バックナンバー No.50 〜 No.54


No.50 2003/05/06
値を受取り、判断を行う 簡単なじゃんけんゲーム
[ページTOPへ戻る]

<値を受取り、判断を行う 簡単なじゃんけんゲーム>

こんにちは、三流プログラマーのKen3です。 今回は、少し発行感覚が開いたので、 復習兼ねて、乱数を使ったじゃんけんゲームを作成してみます。 拾い読みして、何かの参考となれば幸いです。

/* * 1.やりたいことをまとめる、仕様を書く */

ユーザーから1.グー2.チョキ3.パーを受け取り、 コンピュータは乱数1〜3(グー、チョキ、パー)を発生させる。 勝敗を判断して、画面に表示する。 へぇ〜 で、データはどうやって受け取るの? いつものGETでクエリーに載せて受け取りたいと思います。 入力 ユーザーから1.グー2.チョキ3.パー 処理 乱数を発生させ、コンピュータの手を決める 勝敗の判断 出力 勝敗を出力する エラー処理(チェック処理) ユーザーからの手が1〜3かチェックする

/* * 2.処理を書く */

1グー、2チョキ、3パーの値を受取りコンピュータとジャンケンを行います。 HTMLでフォームのやりとりは、、 <FORM ACTION="XXX"> で行います。 <FORM ACTION="g001.asp" METHOD="GET"> あなたの手は?<br> <INPUT TYPE="RADIO" NAME="DATA" VALUE="1">1.グー<br> <INPUT TYPE="RADIO" NAME="DATA" VALUE="2">2.チョキ<br> <INPUT TYPE="RADIO" NAME="DATA" VALUE="3">3.パー<br> <INPUT TYPE="submit" VALUE="勝負する"><br> </FORM> こんな感じで、ラジオボタンの選択にしてみました。 GETで送信しているので、 D = Request.QueryString("DATA") 'データを代入 とQueryStringで受けます。 あとは、乱数でコンピュータの手1から3を発生させて判断してます。 http://www.ken3.org/cgi-bin/g/g001.asp?DATA=1 グー http://www.ken3.org/cgi-bin/g/g001.asp?DATA=2 チョキ http://www.ken3.org/cgi-bin/g/g001.asp?DATA=3 パー と、アンケートのようにメールのURLクリックしてもOKにします。 <%@LANGUAGE=VBScript%> <html> <head> <title>ジャンケンゲームで遊ぶ</title> </head> <body> <h2>ジャンケンゲームで遊ぶ</h2> 受取ったパラメータは<br>[<%=Request.QueryString("DATA")%>]<hr> <% 'Lenで変数の長さをチェックする D = Request.QueryString("DATA") 'データを代入 If Len(D) = 1 Then 'データあり Call HANTEI(D) '判断用の関数を呼ぶ End If %> <HR> <FORM ACTION="g001.asp" METHOD="GET"> あなたの手は?<br> <INPUT TYPE="RADIO" NAME="DATA" VALUE="1">1.グー<br> <INPUT TYPE="RADIO" NAME="DATA" VALUE="2">2.チョキ<br> <INPUT TYPE="RADIO" NAME="DATA" VALUE="3">3.パー<br> <INPUT TYPE="submit" VALUE="勝負する"><br> </FORM> <br> </body> </html> <% '乱数を発生させて勝負する
Sub HANTEI(strNO)  'ユーザーの手を受取り判断する

    Dim nCON  'コンピュータの手1〜3の数値が入る
    Dim nPC   'ユーザーさんの手
    Dim strTE(3) '(*1)配列変数を宣言

    strTE(1) = "グー"   '(*2)配列にメッセージを代入
    strTE(2) = "チョキ"
    strTE(3) = "パー"

    '入力値の判断、エラーならメッセージを表示させ抜ける
    'If文で1,2,3以外を判断する
    If strNO <> "1" And strNO <> "2" And strNO <> "3" Then
        Response.Write "[" & strNO & "]は不正な入力です"
        Exit Sub  '<--Exit Subを使用してここでプログラムを抜ける
    End If

    'コンピュータの手を決定
    Randomize   ' 乱数発生ルーチンを初期化します。
    nCON = Int((3 * Rnd) + 1)  '1 から 3 までの乱数を発生させます。

    '結果判断と表示
    'ユーザーの手を表示する
    nPC = CInt(strNO) 'CInt関数で数値型に変換する
    Response.Write "あなたの手は" & strTE(nPC) & "です<br>" '(*3)ここでnPC番目を表示

    '(*4)同様にコンピュータの手を表示する
    Response.Write "コンピュータの手は" & strTE(nCON) & "です<br>"

    '結果の判断
    'まず、引き分けを判断
    If nPC = nCON Then Response.Write "引き分けです<br>"

    '次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー
    If nPC = 1 And nCON = 2 Then Response.Write "アナタの勝ちです<br>"
    If nPC = 2 And nCON = 3 Then Response.Write "アナタの勝ちです<br>"
    If nPC = 3 And nCON = 1 Then Response.Write "アナタの勝ちです<br>"

    'コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ
    If nPC = 1 And nCON = 3 Then Response.Write "私(コンピュータ)の勝ちです<br>"
    If nPC = 2 And nCON = 1 Then Response.Write "私(コンピュータ)の勝ちです<br>"
    If nPC = 3 And nCON = 2 Then Response.Write "私(コンピュータ)の勝ちです<br>"

End Sub
%>
こんな感じです。

/* * 3.ポイントは? */

まず、頭に<script>タグを書き、 <%@ LANGUAGE=VBScript %> あとは、普通にHTMLを書いて、 サーバー側の処理を記述したい場合は、 <% と   ここの間がサーバーで処理される %> で囲えばいいんだぁ。 <% 〜 %>内に、VBScript(VBAに似てるけど微妙に違う)を記述する。 [No.01 Response.Writeで遊ぶ] ( http://www.ken3.org/backno/backno_asp01.html#1 を参照) で、そんな説明をいきなりしてました(笑) [No.03 乱数を使用して今日の運を表示] ( http://www.ken3.org/backno/backno_asp01.html#3 を参照) では、 Response.Write n は <%=変数%> と書ける方法を紹介、乱数Rnd関数を使ってみました。 今回は、 'コンピュータの手を決定 Randomize ' 乱数発生ルーチンを初期化します。 nCON = Int((3 * Rnd) + 1) '1 から 3 までの乱数を発生させます。 で、使いました。 [No.16 入力、結果表示を1つに、Subで関数分割] ( http://www.ken3.org/backno/backno_asp04.html#16 を参照) で関数を使用して、分割しCallで呼ぶ方法を解説してます 自分自身を呼ぶプログラムを説明しました。 [No.08 URLに付けたパラメータを参照(クエリ情報)] ( http://www.ken3.org/backno/backno_asp02.html#8 を参照) では、 URLに付けた情報 test007-2.asp?ID=123 ?の後ろがパラメーターを取出す Request.QueryString("項目名")をやりました。 GETで送ると、 http://www.ken3.org/cgi-bin/g/g001.asp?DATA=1 グー http://www.ken3.org/cgi-bin/g/g001.asp?DATA=2 チョキ http://www.ken3.org/cgi-bin/g/g001.asp?DATA=3 パー と、アンケートのようにメールのURLクリックしてもOKになることを [No.09 URLに付けたパラメータを参照(クエリ情報)] ( http://www.ken3.org/backno/backno_asp02.html#9 を参照) でフォームの値をURLに載せて、ASPが呼ばれてることを説明しました。

/* * 4.終わりの挨拶 </HTML> */

今回は、軽く過去のメルマガをまとめてみました。 単体じゃなく、そろそろつなげて1本システムもどきを作りたいですね。 そんな話しの続きは(自分のメルマガ宣伝) http://www.ken3.org/backno/backno_guchi28.html#142 で、[トンネルの話、貫通後、横に広げるのは簡単?] といいかげんなこと書いてます。お時間のある人は見て笑ってください。 ファイルやDB関係がからんでいない処理なので、 わかりやすかったと思います。 次は、DB関係をまとめよう。。。といいつつ、また違うネタにしたり(笑) ※次回をお楽しみに。。。 素朴な疑問やリクエストなどがあったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.51 2003/05/12
レンタルサーバーの選び方って難しい?
[ページTOPへ戻る]

<レンタルサーバーの選び方って難しい?>

こんにちは、三流プログラマーのKen3です。 今回は、 レンタルサーバーの選び方・・について、少し書いてみます。 基本は、思い切って問い合わせかなぁ。 拾い読みして、何かの参考となれば幸いです。

/* * 1.ASP使用可能、安いレンタルサーバーを探す */

In message "おたずねします。", 蟻* **さん wrote... >  けんぞうさんお奨めのレンタルサーバ、月額3700円なので私には高すぎます。 > >  貧乏な私でも簡単なASPの勉強ができるレンタルサーバご存知でしょうか? > >  暇に時でいいんで教えてください。お返事待ってます。 --- とメールをもらった。 Ken3が使っているレンタルサーバーの紹介 http://www.ken3.org/asp/server.html ※ASP で Access MDB / SQL Server が使用可能、 Server.CreateObject("ADODB.Connection") (月額少し高いけど安定してますよ) なんて、宣伝しているから来た問い合わせなんだけど。 貧乏な私でも?私も貧乏なんだけと・・なんて書いちゃイケナイなぁ (シャレなので、気にしないでね) 確かに月3700円は、一般ユーザーにとっては高い、どこがお奨めなんだと叱られても (叱られてないけど)不思議じゃないですよね。 せっかく問い合わせが来たんだし、 安いASP動作可能なサーバーを広告の中から探すか ※オイオイ、ここでも手数料稼ごうとしてるの? 生活かかっているので(シャレにならない書き込み(笑))

/* * 2.少し不安になって、業者に問い合わせる */

ASP動作ってことは、ベースがNTServerでIIS稼動、 意外と少ないんだよね、大体がLinuxでCGIはPerl使用可能が多いです。 ですが、月500円でASPが使用可能なレンタルサーバーを見つけました。 http://www.ken3.org/asp/server.html#500 に載せました。DB使えないけど、ASP使用可能で容量は10M、 年払いで6000円、月換算500円です。 さてと、これをこのまま進めてもいいんだけど、 安し悪しだと、まずいしなぁ、、、月500円かぁなんか安過ぎのような気もするし でも、SQL ServerとかDBは別料金、容量も10Mだから、こんなもんかな。 と思いつつ、HPの料金表、機能表を再度確認する。 あれ、ベーシックプラン(500円の)、CGI不可になってるよ? でもASPには○付いてるし、 う〜んとCGI=Parlってことかなぁ...と思いつつも、 あれこれ想像してしまって不安だったので、 思い切って問い合わせのメールを業者に送ってみた。 --- こんにちは。 ベーシックプランで CGI 不可 となってますが、 ASPは使用できますか? --- と問合せをしたところ、 下記のように丁寧に回答いただきました。 In message "RE: ベーシックプランでもASPは使用できますか?", ワイワイホスティングさん wrote... >またベーシックプランは現在はASPが使えますが、来月のプラン内容変更の際に >はASP,PHPともに使用不可能にするよていですので今お申し込みいただくのであ >ればシルバープラン以上をお勧めいたします。 > >ご検討を宜しくお願い致します。 ---- えっ、マジかよ? 年払いで途中から機能が使用できなくなったら、おおごとだと思うけど、、、 まぁ、問い合わせてみて正解だった。 500円の低価格人気で人数多くて、ASP動作が不安定なのかなぁ? 1サーバーあたりの共有人数多いのかなぁ?なんていろいろと思ったけど。 やりたいことがASPのテストなら、500円と安いし、検討する価値はありかなぁ。 http://www.ken3.org/asp/server.html#500 を気になった人は見てください。

/* * 3.使っている人に使用感を聞くのもひとつの手 */

最近は、私もだけど、独自のドメインとって運用してます。 一昔前は、www.プロバイダー/user/~Ken3/などで、 プロバイダーの使用感はHPの書き込みとか プロバイダー満足度ランキングを見ればわかったけど、 共有のホスティングサービス(1つのサーバーを複数のドメインで共有)などは、 なかなか、使っている人の意見を探すのが大変ですよね。 そんなこんな?で来た問い合わせ/質問が下記の質問、 >QA B-ASP - No.0 >返信は、email >読者Aさん <m*******@s****.p****.or.jp > から >はじめまして。リンククラブホスティングサービスを利用している者です。 >ここのサーバーでASPでSqlServerに接続すると処理が異常に遅くなったり止まった >りするのですが、そういうことないでしょうか? >何度も問い合わせをしているのですが、対応が悪くいいかげん腹が立つので解約も >考えているところです。 >ヘンな質問ですみませんが、自分のところだけなのかわからないので質問させてい >ただきました。お返事いただければ幸いです。 >---------------- 検索か何かで私のページがひっかかって、問い合わせてきたと思います。 返信は、 --- 書き込みどうもです。 たまに、10分ぐらい、止まってたりするよね。(ASP動かなかったり) あとは、初期動作(初めのSelect文が遅かったり) 共用のサーバーだからこんなもんか?とも思ったりしてるけど。 あっ、たまにメルマガ読者の人からサンプル動作しなかったと問合せ来てるので、 止まっているかもしれませんね。 チョット回答になってなかったけど、まとめると。 動作遅い時、たしかにある。(が、向こうに言わせるとたぶんアンタの作りがとか ケンカになるかなぁ) 私は、いまのところショッピングシステムとか有料会員のサービスしてないので、 こんなもんか?で済ませてるけど、 もし有料会員のサービス始めるとしたら、解約も少し考えるかなぁ。 ※無料のサービスはここで、有料はもっと安定したところにするとか。 安定動作のところ見つけたら教えてくださいね。 サポートとの戦い、面倒だけどがんばってください。 では。 ---- と正直な感想を送りました。 共有のサーバーだから、ある程度はしかたないなぁと思いつつ、 あまりお奨め、お奨めと書いて宣伝すると、 Ken3のこと信じてサーバー申し込んだのにと言われるかなぁ。。。 疑問に思ったら、あれこれ悩んでないで、質問する度胸も必要かなぁと思った。 あとは、サポートの対応がムカっと来ることもやはりあると思うけど。。。 こりずに宣伝 http://www.ken3.org/asp/server.html で、私が使っているASP使用可能なレンタルサーバーを紹介してます。 実用的には私が使っている分には満足です。 ※検討候補に入れてね(と手数料収入を狙っているだけだったりして(爆))

/* * 4.もう少し様子をみたほうがいいのかも? */

現在のパターンって、Win2000にIIS5.0でASP稼動とかが多いけど、 もう少し待つと、ASP.NET稼動のレンタルサーバーも出てくると思う。 読者からもらったメールですが(情報ですが) > 昨日、ちょっと訳あって.ASP.NETの動くサーバを探していたところ > 下記のURLを見つけました。 > ここなら、VS.netのプロジェクトをボタンひとつでUPできます > ご存知かもしれませんが一応 http://www.bug1ch.net/ です。 ---- VS.Netかぁ、プロジェクトをボタン1つってのがイメージわかないけど、 たぶん、.NET対応のサーバーだと、そんなことができるのかなぁと思った。 そろそろ、.NET対応のレンタルサーバー達が出てきてもおかしくないので、 待てる人は待ちかなぁと思ったり。 http://www.bug1ch.net/ ● ASP.NET対応 ● 10/30MBのサーバースペース ● トライアルアカウント(無料)サービス ● MSXML4.0対応 今、無料のお試し期間みたいなので、興味のある人はのぞいてみては? Ken3の取り扱い広告には、まだ.NET対応のサーバーは現れてない。 現れたら即効で広告出すので、その時はよろしく(笑)

/* * 5.終わりの挨拶 </HTML> */

今回は、 ASPが動作するレンタルサーバーの選び方? 問い合わせは思い切ってしてみよう? そろそろ.NET対応のサーバーがでてくると予想 でした。 みなさんのサーバー選びのコツ、あったら聞かせてください。 素朴な疑問やリクエストなどがあったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.52 2003/05/14
キャラクタコード、Asc関数を使用して文字コードで遊ぶ
[ページTOPへ戻る]

<キャラクタコード、Asc関数を使用して文字コードで遊ぶ>

こんにちは、三流プログラマーのKen3です。 今回は、 Asc関数を使って、文字で遊んでみます。 拾い読みして、何かの参考となれば幸いです。

/* * 1.Asc関数で文字コードの表示、蛇足で16進数表示 */

あまり意識したこと無いのですが、 キャラクタコードを表示してみたいと思います。 いつもの適当な動作仕様は、 フォームで文字列を入力、Getで送信。 受け取ったデータをMid関数で一文字単位で取り出し、 Asc関数で文字コードを表示します、 ついでにHex関数で16進数の文字列にしてみます。 なんだか、よくわからん(笑) さてと、仕様にあわせて作るか。 http://www.ken3.org/cgi-bin/test/test052-1.asp?DATA=012ABCxyz で、テストできます。遊んでみてください。 <%@LANGUAGE=VBScript%> <html> <head> <title>Asc関数でキャラクタコードの表示、Hex関数を使用して16進数で表示</title> </head> <body> <h2>Asc関数でキャラクタコードの表示、Hex関数を使用して16進数で表示</h2> <!-- Ken3 --><!-- #include file="info.inc" --> <% CHK_DATA = Request.QueryString("DATA") 'パラメータの代入 '長さをチェックする If Len(CHK_DATA) <> 0 Then '文字が入っていたら Response.Write "受け取ったデータは[" Response.Write Server.HTMLEncode(CHK_DATA) & "]です<br>" '文字数分ループして、コードを表示 For n = 1 To Len(CHK_DATA) Response.Write n & "文字目は" strWORK = Mid(CHK_DATA, n, 1) 'n番目の文字を取り出す Response.Write "[" & Server.HTMLEncode(strWORK) & "] " Response.Write "をAscで変換すると" & Asc(strWORK) Response.Write " さらにHexで16進数にすると" & Hex(Asc(strWORK)) Response.Write "<BR>" & vbCRLF Next End If %> <HR> <FORM ACTION="test052-1.asp" METHOD="GET"> 調査したい文字列を入力してください。<br> <INPUT TYPE="text" SIZE="30" NAME="DATA" VALUE="<%=CHK_DATA%>"> <INPUT TYPE="submit" VALUE="コード調査開始"><br> ↑いろいろと遊んでみてください↑ </FORM> <br> </body> </html> ポイントを整理すると ~~~~~~~~~~~~~~~~~~~~ '文字数分ループして、コードを表示 For n = 1 To Len(CHK_DATA) Response.Write n & "文字目は" strWORK = Mid(CHK_DATA, n, 1) 'n番目の文字を取り出す Response.Write "[" & Server.HTMLEncode(strWORK) & "] " Response.Write "をAscで変換すると" & Asc(strWORK) Response.Write " さらにHexで16進数にすると" & Hex(Asc(strWORK)) Response.Write "<BR>" & vbCRLF Next のループ部分です。 Len関数で文字数が求められるので、 For文で1から文字数までカウンタnを使ってます。 Mid関数を使用して、n番目の文字を取り出します。 あとは、関数の連発で、 Server.HTMLEncode(strWORK) <>%”などの表示不可文字をエンコードして表示 Asc(strWORK) 取り出した文字の文字コードを表示 Hex(Asc(strWORK)) 文字コードをさらに16進数文字列に変換して表示 http://www.ken3.org/cgi-bin/test/test052-1.asp?DATA=012ABCxyz と実行すると 受け取ったデータは[012ABCxyz]です 1文字目は[0] をAscで変換すると48 さらにHexで16進数にすると30 2文字目は[1] をAscで変換すると49 さらにHexで16進数にすると31 3文字目は[2] をAscで変換すると50 さらにHexで16進数にすると32 4文字目は[A] をAscで変換すると65 さらにHexで16進数にすると41 5文字目は[B] をAscで変換すると66 さらにHexで16進数にすると42 6文字目は[C] をAscで変換すると67 さらにHexで16進数にすると43 7文字目は[x] をAscで変換すると120 さらにHexで16進数にすると78 8文字目は[y] をAscで変換すると121 さらにHexで16進数にすると79 9文字目は[z] をAscで変換すると122 さらにHexで16進数にすると7A と変換されて表示されます。 いろいろと文字を入れて、遊んでみてください。

/* * 2.漢字は?どんな感じ(寒いオヤジギャグだった、、、) */

日本人が気になるのは、漢字だよね。 漢字を入力するとどんな感じになるか?と寒いオヤジギャグをかましつつ、 ASP楽しくをテストしました。 http://www.ken3.org/cgi-bin/test/test052-1.asp?DATA=ASP%8Ay%82%B5%82%AD 受け取ったデータは[ASP楽しく]です 1文字目は[A] をAscで変換すると65 さらにHexで16進数にすると41 2文字目は[S] をAscで変換すると83 さらにHexで16進数にすると53 3文字目は[P] をAscで変換すると80 さらにHexで16進数にすると50 4文字目は[楽] をAscで変換すると-30087 さらにHexで16進数にすると8A79 5文字目は[し] をAscで変換すると-32075 さらにHexで16進数にすると82B5 6文字目は[く] をAscで変換すると-32083 さらにHexで16進数にすると82AD こんな感じで結果が表示されました。 LenやMidは漢字混じりでもOKなんだぁ、 漢字のコードは2バイトXXXXなんですね。

/* * 3.あまり必要ないけど、バイト数を数える関数を作成してみる */

私は、今のところ必要ないんだけど、おまけで、 バイト数を数える関数を作成してみるか。 関数の仕様は、文字列を受け取って、リターン値でバイト数を返すか。
Function Byte_Count(strMOJI)
  bcnt = 0
  '文字数分ループして、コードを表示
  For n = 1 To Len(strMOJI)
    nCODE = Asc(Mid(strMOJI, n, 1))  'n番目の文字コードを求める
    If nCODE >= 0 And nCODE <= 255 Then  'コードが1バイト文字内か?
      bcnt = bcnt + 1
    Else
      bcnt = bcnt + 2
    End If
  Next
  'リターン値をセットする
  Byte_Count = bcnt
End Function
http://www.ken3.org/cgi-bin/test/test052-2.asp?DATA=ASP%8Ay%82%B5%82%AD でテストすると、 受け取ったデータは[ASP楽しく]です バイト数は、9Byteです と半角3バイト+全角6バイト(3文字)の計算が無事できました。

/* * 4.終わりの挨拶 </HTML> */

今回は、 Asc関数で文字コードの表示、 Hex関数で16進数に変換、 試しに半角、全角を判断してバイト数を求める関数を作成しました。 素朴な疑問やリクエストなどがあったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.53 2003/05/15
ADOでExcelファイル(*.xls)とやっと接続できた(ほっ)
[ページTOPへ戻る]

<ADOでExcelファイル(*.xls)とやっと接続できた(ほっ)>

こんにちは、三流プログラマーのKen3です。 今回は、 ASPからWebサーバーに保存されている Excelファイルと軽い気持ちで遊びたいと思ったら、、、ハマッタってお話です。 Excelお嬢へのアタック、ローカルなら簡単なのだが、 場所がネット上になると、、、やられました。 拾い読みして、何かの参考となれば幸いです。

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

メールでいつものようにクレームをもらった 内容は、 ・GoogleでASP Excelで検索して私のHPに来たがサンプルが無い ・ASP Create Excelとかキーワードを変えて検索しても、  アンタのダメなページがHITする まぁ、要約するとこんな感じの苦情メールが届いた。 そんなメール送る時間あるなら他のHP調べなよ と半分逆ギレで言いたかったが、 原因はVBA系のHPで[ASP系へ]とリンクがあるので、 キーワードでASP Excelで拾われてしまうみたいです。 被害者を減らすために、 ASPからExcelファイルの操作、やってみるか。

/* * 2.そんなのCreateObjectで簡単でしょ */

さてと、Excelを参照したいんだったら、 Set oApp = Server.CreateObject("Excel.Application") で、勝負。 あれ? Server オブジェクト エラー 'ASP 0177 : 800401f3' Server.CreateObject に失敗しました /cgi-bin/test/test053-1.asp, 行 13 無効な ProgID。 このメッセージに関する追加情報については、以下のマイクロソフト オンライン サポートのサイトを参照してください: http://www.microsoft.com/contentredirect.asp えっダメなの、、、そっか、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") は、ムリです。

/* * 3.別の方法を検討してみる、アプリの機能を使わないでデータセットだけなら */

ちっ、しょうがねえなぁ。 まぁ、アプリの機能を使わないでデータセットだけなら何か方法あるだろう。 まずは、データの枠だけ作っておくか。 Excel立ち上げて、 ブックの名前はtest053.xls シートの名前はDATA 項目とデータを適当に入れてと A列 B列 C列 USERNAME MEMO WriteTime Ken3 メモメモ 2003/5/15 TEST なぜ?出来ないの? 2003/5/13 -- と表を作成しました ↑作成した表のイメージ 次は、この表を外部から操作するのかぁ。 流行中のADOでxlsと接続してみますか。 Googleの検索で、 ADO Excel 接続 と入れると、星の数ほどサンプルが出てくる。 大体がAccessからADOでExcelと接続のパターンです。 で、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シートが見つからないのかぁ。 あっ、シート名じゃなくて、名前付けした範囲じゃないとダメみたい。 よし、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レコードセットに対しての処理です。

/* * 4.終わりの挨拶 </HTML> */

今回は、ADOでExcelと接続してみるでした。 感覚的には、ADOで接続さえクリアすれば、 あとは、ADOのいつもの感覚で処理可能なので、楽かなぁ。 Set oApp = Server.CreateObject("Excel.Application") みたいにエクセルの操作は出来ないけど、 データの出し入れはできそうです。 http://www.ken3.org/cgi-bin/test/test053-1.asp でテストできてるので、確認してみてください。 データの参照がなんとかOKだったので、 追加・更新・削除にも挑戦したいと思います。 あと、気になっていることで、 名前の範囲なくてA1:F20とかの指定、 名前の範囲を超えたら? 先頭行の見出しが無いとき、、 など、ネタには困らないかも(笑) 素朴な疑問やリクエストなどがあったら、 メール : qaqaqa@ken3.org 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.54 2003/05/20
ADOでSQL Select * INTO文発行でExcel(*.xls)を作成する
[ページTOPへ戻る]

<ADOでSQL Select * INTO文発行でExcel(*.xls)を作成する>

こんにちは、三流プログラマーのKen3です。

今回は、
ADOに目覚めたKen3の続きで(目覚めてないけど(笑))
SQLの Select * INTO文を発行して、Excel(*.xls)を作成してみたいと思います。

これも、意外と簡単に進みました、、、

拾い読みして、何かの参考となれば幸いです。

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

前回、ADOでExcelと接続して、データを取得しました。 調べごとのついでの知識じゃないけど、 Accessで、「Docmd」を使用せずImportする方法が数種類載っていて、 INSERT INTO TABLE FROM [Excel 8.0;Database=Drive:\Path\File].[Sheet] なんて、SQL文を発行すると、出来るみたいです。 ADOでExcel-->Accessの逆、 MDBのテーブルをシートにできないかなぁとフト思い、 いろいろと試行錯誤してみました。

/* * 2.[Excel 8.0;Database=Drive:\Path\File].[Sheet]は使えるかも */

SQL文でテーブルからテーブルのデータのインポート(追加は) SELECT * INTO テーブル FROM テーブル Where 条件 って感じでもOKです。 この方法をテストしてみます。 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("db026.mdb") 'やっとデータベースを開ける db.open ここまでは、お約束?じゃないけど、MDBファイルへの接続を作りました。 次が問題の、 ~~~~~~~~~~~ '送り元のテーブル情報 TESTテーブルからIDの降順 strFROM = " FROM TEST ORDER BY ID DESC" まずは、元テーブルの条件をセットして、 次に、出力先のExcelファイルを指定します。 'Excelファイルの位置とシート名(送り先) strXLS = "[Excel 8.0;database=" & Server.MapPath("a.xls") & "].[DATA]" たんに、 Server.MapPathで今実行中の位置+a.xlsのパスを作成、 シート名は固定でDATAとしました。 普通につなげてSQL文を作成します。 'SQL文の作成 strSQL = "SELECT * INTO " & strXLS & strFROM で、作成したSQL文を発行。 set RET = db.Execute(strSQL) 'SQL文の発行 あれれ、思ったより、すんなり出来た(笑) a.xlsの中身を見ると、DATAシートも出来てるし。 よし、データを追加・変更して再度実行しよう。 おっと、 Microsoft JET Database Engine エラー '80040e14' テーブル 'DATA' は既に存在しています。 /cgi-bin/test/test054-1.asp, 行 32 あらら、同じファイル、同じシート名には、上書きしてくれないのか。。。 a.xlsを消すか、ダブらないシート名にしないと行けないのか。 ファイル名は日付の頭にaをつけて、a20030520.xls シート名は時刻で9時10分15秒ならs091015にします。 これなら同じ秒数にテストしなければ大丈夫かな。 後日削除しやすいようにTEMP\a20030520.xlsとフォルダーも指定して作成します。 ASP,VBScriptでFormat関数使えないんだよなぁ。。。 日付関係の関数を駆使して、文字列を作成するか。 えっと、現在時刻はNow関数でわかるから、 あとはこれを変換すればいいのか。 年 Year() 月 Month() 日 Day() 時 Hour() 分 Minute() 秒 Second() 関数に日付の値を渡すと変換できます。 あとは一桁の時、頭0付けかぁ、 Right("0" & Day(T), 2) と小細工で、0と+してから、右端から2文字取るかな。 T = Now() strMM = Right("0" & Month(T)), 2) strDD = Right("0" & Day(T)), 2) YYYYMMDD = Year(T) & strMM & strDD strH = Right("0" & Hour(T)), 2) strM = Right("0" & Minute(T)), 2) strS = Right("0" & Second(T)), 2) で、ファイル名とシート名を作成しますか。 strFNAME = Server.MapPath("temp\a" & YYYYMMDD & ".xls") strSNAME = "s" & strH & strM & strS こんな感じかな。

/* * 3.調査、テスト結果を合わせて、1つのプログラムを作成 */

ここまでくれば、見通しが明るいので、1つにつなげてみた。 たんに、文字列作成しただけですね(笑) <%@LANGUAGE=VBScript%> <html> <head> <title>ADO Select * INTO [Excel 8.0;Database=Drive:\Path\File].[Sheet]</title> </head> <body> <h1>ADO Select * INTO [Excel 8.0;Database=Drive:\Path\File].[Sheet]</h1> test054-1.asp<br> [Excel 8.0;database=ファイル名.xls].[シート名]<br> を指定して、<br> SELECT * INTO文を発行し、Excelファイルを作成する<br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("db026.mdb") 'やっとデータベースを開ける db.open '送り元のテーブル情報 TESTテーブルからIDの降順 strFROM = " FROM TEST ORDER BY ID DESC" 'Excelファイルの位置とシート名(送り先)を作成する T = Now() '現在時刻を保存 strMM = Right("0" & Month(T), 2) '年月日を作る strDD = Right("0" & Day(T), 2) YYYYMMDD = Year(T) & strMM & strDD strH = Right("0" & Hour(T), 2) '時分秒を作る strM = Right("0" & Minute(T), 2) strS = Right("0" & Second(T), 2) strFNAME = Server.MapPath("temp\a" & YYYYMMDD & ".xls") 'ファイル名 strSNAME = "s" & strH & strM & strS 'シート名 '↓接続用の文字列をファイル名、シート名を使って作成 strXLS = "[Excel 8.0;database=" & strFNAME & "].[" & strSNAME & "]" 'SQL文の作成 strSQL = "SELECT * INTO " & strXLS & strFROM 'テストで作成文字列の表示 Response.Write "作成FILEは<b>" & strFNAME & "</b><br>" Response.Write "シート名は<b>" & strSNAME & "</b><br>" Response.Write "接続文字列<b>" & strXLS & "</b><br>" Response.Write "発行SQL<b>" & strSQL & "</b><br>" set RET = db.Execute(strSQL) 'SQL文の発行 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> 作成終了です。<br> 作成された<A href="temp/a<%=YYYYMMDD%>.xls" Target="_Blank"> a<%=YYYYMMDD%>.xls</a>の確認(保存は右ボタンで、クリックで開きます)<br> <A href="test028-2.asp" Target="_Blank">db026.mdbのデータを見る</a><br> <A href="test027-2.asp" Target="_Blank">db026.mdbへデータを登録する</a><br> </body> </html> http://www.ken3.org/cgi-bin/test/test054-1.asp でテストできてるので、確認してみてください。 うわ、 Microsoft JET Database Engine エラー '80004005' パス 'd:\users\ken3_org\cgi-bin\test\temp\a20030520.xls' は正しくありません。 パス名に間違いがないことと、ファイルが置かれたサーバーに接続していることを 確認してください。 /cgi-bin/test/test054-1.asp, 行 55 えっ、なんで? あっ、tempフォルダ作るの忘れた(笑) 保存先のフォルダも作ったし、OK、なんとか出来ました。

/* * 4.終わりの挨拶 </HTML> */

今回は、 ADOでSQL Select * INTO を使って、Excelファイルを作成してみました。 感覚的には、ADOで接続さえクリアすれば、 あとは、SQLやADOのいつもの感覚で処理可能なので、楽かなぁ。 http://www.ken3.org/cgi-bin/test/test054-1.asp でテストできてるので、遊んでみてください。 素朴な疑問やリクエストなどがあったら、 メール : qaqaqa@ken3.org 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。



ページフッター リンクや広告、質問送信など

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

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。

ニガテな環境設定系など
[Win2003 Server に IIS を Setup]・・・ポイントの無い、ほぼ一本道解説だけど。
[IIS 仮想ディレクトの作成とASP動作TEST]・・・Web拡張でASPを有効にしただけです。

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

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

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



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


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



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]