[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.085 ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた

ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた


本文(発行内容)


<ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた>

こんにちは、三流プログラマーのKen3です。 前回のASP ADO Excel読み込みの続きで、 .GetRowsメソッドで少し遊べそうだったので、連続発行します。

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

掲示板で下記の質問をもらいました ------ ><ADOでExcelファイル(*.xls)とやっと接続できた(ほっ)>のページ、とって >も役に立ちました! >サーバーにエクセルが入ってないのに、一生懸命 >Set xlApp = Server.CreateObject("Excel.Application") >でつなごうとしてました(^^*) > >で、すみません、初歩的なことを教えてください・・・ >Set xlApp = Server.CreateObject("Excel.Application")では、セルの値を参照 >する時に、 ><% Response.Write xlSht.Range("b3").Value %> >でよかったのですが、このように、ADOを使う場合はどういう指定になるんで >しょうか。。 > >ACCESSのDBなら、 ><%= rs.Fields("test").Value %>ですよね。 ------ と、 b3のセルへのアクセス方法について、質問をもらいました。 に対して、前回解答したのが、 http://www.ken3.org/cgi-bin/test/test084-1.asp で、 Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test084.xls") & ";" strSQL = "select * from [Sheet1$]" Rs.Open strSQL, Con, 0 とExcel接続、シート指定でレコードセットを作成して、 列名無しで接続できるが、先頭行が強引にフィールド名となってしまう。 B3のセルに対して、アクセスするには、 先頭行(A1やB1,C1,D1)がフィールド名となっているので、 Open時のカーソルは、A2,B2,C2と2行目からのスタートなので、 3行目に行くために、.MoveNextで1行空読みして、 Response.Write "Rs.MoveNext<br>" Rs.MoveNext '1行飛ばす Response.Write "Rs.Fields(1)は<big>[" & Rs.Fields(1) & "]</big>です<br>" なんて感じで逃げてました。 なんかなぁ・・・イマイチ(笑)と思いつつ、イロイロと探ってました。

/* * 2.ADO .GetRows を発見 */

http://www.ken3.org/cgi-bin/group/asp_ado_excel.asp に ADO Excel接続関係の情報をまとめてます。 ADOでMDBを使いSQLを発行して遊んでいるサンプルは、 http://www.ken3.org/cgi-bin/group/asp_ado_mdb.asp にまとめてます。 と 宣伝を入れつつ、 いろいろとWeb上で探していたら、 ADOで .GetRows を使用して、 ~~~~~~~~~~~~~~ MDBからデータを一気にメモリに展開しているサンプルを見かけた。 おっ、 ADOは接続が違うだけで、共通で使えると聞いたような、さっそく使ってみました。

/* * 3.サンプルを作ってみた(行列の違いでハマった) */

読み込むテストデータは下記のような感じです。 A列 B列 C列 D列 1: 列の項目名がなかったら? 2: c2どうなるの? 3: b3のセルはここ 4: a4のせるはここ 5: d5に1つ端っこ 6: 名前 三流君 7: 住所 東京都の田舎町 8: 好きな球団 横浜ベイスターズ 9: 10: 名前範囲も付けてません END? ※シート名はデフォルトのよくみかける[Sheet1]に作りました、  ブック名はtest084.xlsで、aspと同じディレクトリにFTPでUPしてあります ↑が作成した表のイメージです。 このtest084.xlsに対して、接続文字を作成して、 シートをテーブル代わりにしてADOでアクセスします。 '接続文字 Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test084.xls") & ";" 'SQL文 Sheet1$として、シートのみ指定してみます strSQL = "select * from [Sheet1$]" '接続文字列、SQLを渡して、レコードセットを開く Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly ここまでは、前回のコピー、 で、やっと 今回説明したい.GetRowsの登場 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 'rs.GetRowsで読み込む dataBOX = Rs.GetRows() 'レコードセットを配列にする あれれ、たった1行? こんな感じで、Rs.GetRows()とすると、 2次元配列でレコードセットの内容を作成してくれます。 あとは、テストで表示してみました。 Response.Write "dataBOX(3,5)=[" & dataBOX(3,5) & "].." あれ?エラーだよ Microsoft VBScript 実行時エラー エラー '800a0009' インデックスが有効範囲にありません。: '[number: 5]' /cgi-bin/test/test085-1.asp, 行 58 なんで? 実は、返された配列のdataBOXの中身は、 変数(列,行)の並びだったんですね。 ~~~~~~~~~~~ ExcelのCells(行,列)と見事に間違えてしまいました。 あと、先頭行は、やはり項目名として使われているので注意が必要です。 それと、 えっ、まだあるの? 配列が0番目から始まるので、やはりExcelのCells(行,列)は1からと混同しないでね。 あとは、まだあるの?えっと(オイオイ) あっ、当たり前の話だけど、全件メモリ上の配列に読み込むので 件数などが少ないデータで使ってね(考えて使ってね) ※件数少なければ、.GetRowsで一気に読むのもありかなぁ。 http://www.ken3.org/cgi-bin/test/test085-1.asp で、テストできます。 ※実行して、Cells(行,列)との違いを見てください。 ソースは、下記のような感じです(test085-1.asp) <%@LANGUAGE=VBScript%> <html> <head> <title>ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた</title> </head> <body> <h1>ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた</h1> test085-1.asp<br> ASPからADOを使用してExcel(*.xls)に接続して、<br> [Sheet1$]でシートにアクセスして、レコードセットを作成後、<br> <strong>rs.GetRows</strong>でレコードセットから配列を作成する<br> <br> <hr> <% 'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん Set rs=Server.CreateObject("ADODB.Recordset") '接続文字 Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test084.xls") & ";" Response.Write "作った、使った接続文字列は<br>" Response.Write "<CODE>Con = <b>" & Con & "</b></CODE><hr>" 'SQL文 Sheet1$として、シートのみ指定してみます strSQL = "select * from [Sheet1$]" Response.Write "作った、使ったSQL文字列は<br>" Response.Write "<CODE>strSQL = <b>" & strSQL & "</b></CODE><hr>" '接続文字列、SQLを渡して、レコードセットを開く Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly Response.Write "<CODE>Rs.Open strSQL, Con, 0</CODE>" Response.Write "で、レコードセットを作成しました<hr>" 'rs.GetRowsで読み込む dataBOX = Rs.GetRows() 'レコードセットを配列にする Response.Write "<CODE>dataBOX = <b>rs.GetRows</b></CODE>" Response.Write "で、レコードセットを配列イメージで読み込む<hr>" Response.Write "配列のイメージを表示する<br>" Response.Write "dataBOX(3,0)=[" & dataBOX(2,0) & "]<br>" Response.Write "dataBOX(1,1)=[" & dataBOX(1,1) & "]<br>" Response.Write "dataBOX(0,2)=[" & dataBOX(0,2) & "]<br>" Response.Write "dataBOX(0,4)=[" & dataBOX(0,4) & "].." Response.Write "dataBOX(1,4)=[" & dataBOX(1,4) & "]<br>" Response.Write "dataBOX(0,5)=[" & dataBOX(0,5) & "].." Response.Write "dataBOX(1,5)=[" & dataBOX(1,5) & "]<br>" Response.Write "dataBOX(0,6)=[" & dataBOX(0,6) & "].." Response.Write "dataBOX(1,6)=[" & dataBOX(1,6) & "]<br>" Response.Write "dataBOX(0,8)=[" & dataBOX(0,8) & "].." Response.Write "dataBOX(3,8)=[" & dataBOX(3,8) & "]<br>" Rs.Close %> こんな感じで、<b>.GetRows</b>で配列に取り込み使用可能<br> </font> <hr> </body> </html> う〜ん、なかなかB3とわかりやすくアクセスする方法って、なさそう・・・・ -【けんぞう!】--------------------------------------------------------- ASPが利用可能なレンタルサーバーをお探しのアナタ、 http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介 『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳) ------------------------------------------------------------------------ 

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

今回は、 ASPでADOを使用して*.xlsと接続して、 .GetRowsで全件メモリ上の配列に取り込んでみました。 なんか、まだ、サクっとxxxx!B3みたいに出来なかったけど、 参考になったかなぁ・・・・ いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。

フィードバック

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

評価・感想

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

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

三流君の主なリンク先

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

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

その他 宣伝広告