[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.053 ADOでExcelファイル(*.xls)とやっと接続できた(ほっ)

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



本文(発行内容)


<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とかの指定、 名前の範囲を超えたら? 先頭行の見出しが無いとき、、 など、ネタには困らないかも(笑) ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

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


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

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

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

広告:



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

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



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


広告: