[三流君] −−> [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とかの指定、 名前の範囲を超えたら? 先頭行の見出しが無いとき、、 など、ネタには困らないかも(笑) 素朴な疑問やリクエストなどがあったら、 メール : qaqaqa@ken3.org 掲示板 : http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi に気軽に書き込んでください。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

フィードバック

ASP系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.053を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [広告・副収入系] [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告