[三流君] −−>
[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系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告