[三流君] −−>
[ASPで遊ぶ、失敗する] −−>
[バックナンバー一覧]
−−> No.086 Ubound(配列,1)とUbound(配列,2)で遊ぶ
Ubound(配列,1)とUbound(配列,2)で遊ぶ
本文(発行内容)
<Ubound(配列,1)とUbound(配列,2)で遊ぶ>
こんにちは、三流プログラマーのKen3です。
前回のASP ADO .GetRowsメソッドで少し遊んでました。
そこで、(列,行)だとか(行,列)とか騒いでました。
/*
* 1.今回のキッカケ
*/
前回、下記のイメージのExcelテストデータを読み込む処理で、
.GetRowsを使用しました。
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
'rs.GetRowsで読み込む
dataBOX = Rs.GetRows() 'レコードセットを配列にする
こんな感じで、Rs.GetRows()とすると、
2次元配列でレコードセットの内容をdataBOXに作成してくれます。
ここまでは、よかったけど、
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からと混同しないでね。
http://www.ken3.org/cgi-bin/test/test085-1.asp
が、前回作成したサンプルです。
※実行して、Cells(行,列)との違いを見てください。
/*
* 2.本当の原因
*/
dataBOX = Rs.GetRows() 'レコードセットを配列にする
の
戻り値が、(列,行)の配列で、
ExcelのCellsの(行,列)と勘違いしたなんて書いているが、
本当の原因は別のところにあった。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
いつもの自己分析・右脳左脳の小話だと、
※勘違いした・勘違いした
※行,列じゃなくて列,行だった
なんて、アンタ騒いでいるけど、
そんなアホなエラーが発生するのって、
アンタがプログラマーの生活習慣病にかかっているからだろ?
プログラマーの生活習慣病?って何?
テスクワークの肥満?
それもありがちだけど、そうじゃなくて、
普段のプログラムの組み方が、固定で・・って処理が多いんだよ。
フィールドは半永久的に変わらない
や
データは固定でn個
とか、決め付けてプログラム組んでる、
そんな習慣病に陥ってない?
普段から偏ったプログラム組んでると、ダメだよ。
/*
* 3.配列の要素を知るには
*/
配列の要素数を知るには?
Split関数で分割された配列に対して、
UBound関数で要素数を調べて、表示、
http://www.ken3.org/cgi-bin/test/test024-2.asp
が、そんなサンプルでした。
strBOX = Split(strMOTO, " ")
とSplit関数で文字列から配列を作成後、
'ループでデータを表示させる
For i = 0 To UBound(strBOX) 'UBound使用インデックス最大値までループ
とUBound関数で配列の要素数を判断、ループさせてます。
普段から、UBound関数を使っていれば(プログラマーの食生活がよければ)
こんなことにならなかったのにね。
UBound関数っていい食品も取るようにしますか。
農薬まみれの固定処理はやめて・・・
んっ?チョット待てよ、今回調べたいのって2次元配列ですよ?
2次元配列の要素数ってわかるの?
だから、マニュアル読めよ。
ちぇ、適当に食材入れないで、レシピ集をたまには見るか。
Ubound(配列,1)とUbound(配列,2)なんて書き方できるみたいです。
Dim BOX(12,5) と宣言して、
Ubound(BOX, 1)とUbound(BOX, 2)でテストしてみました
Ubound(BOX, 1)が12
Ubound(BOX, 2)が5
をそれぞれ返します。
こんな感じで、Ubound関数を使用可能です
http://www.ken3.org/cgi-bin/test/test086-1.asp
で、テストできます。
/*
* 4..GetRowsと組み合わせて使ってみた
*/
dataBOX = Rs.GetRows()
で読み込んだレコードに対して、
For y = 0 To Ubound(dataBOX, 2)
For x = 0 To Ubound(dataBOX, 1)
でループを作り、表示してみました。
http://www.ken3.org/cgi-bin/test/test086-2.asp
でテスト可能です。
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>ADO .GetRowsで全件読み込み、Uboundで行列チェック</title>
</head>
<body>
<h1>.GetRowsで全件読み込み、Uboundで行列チェック</h1>
test086-2.asp<br>
ASPからADOを使用してExcel(*.xls)に接続して、<br>
[Sheet1$]でシートにアクセスして、レコードセットを作成後、<br>
<strong>rs.GetRows</strong>でレコードセットから配列を作成する<br>
[<a Href="test084.xls" TARGET="_blank">test084.xls</a>]←がファイルです<br>
<br>
<hr>
読み込んだ配列に対して、Ubound関数で、行列の最大値を調べて<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>"
Dim y, x
Response.Write "<Table border=1>" 'テーブルで表示
For y = 0 To Ubound(dataBOX, 2)
Response.Write "<TR>" '行の開始
For x = 0 To Ubound(dataBOX, 1)
Response.Write "<TD>" & dataBOX(x, y) & "<TD>"
Next
Response.Write "</TR>" '行の終わり
Next
Response.Write "</Table>" 'テーブルの終了
Rs.Close
%>
こんな感じで、<b>.GetRows</b>で配列に取り込みUboundで個数を調べることが可能です<br>
※あと、先頭行は、やはり項目名として使われているので注意が必要ですが。<br>
</body>
</html>
-【けんぞう!】---------------------------------------------------------
ASPが利用可能なレンタルサーバーをお探しのアナタ、
http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介
『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳)
------------------------------------------------------------------------
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
私の生活習慣病(固定プログラム病)
を改善するために、
Ubound(配列,1)とUbound(配列,2)なんて使ってみました。
いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、
今後とも、よろしくお願いします。
みなさんは、バランスよく関数使って(偏った関数使わないで汎用的にね)
環境やデータによって、バグの発生しない健康なプログラムを作ってね。
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告