[三流君] −−> [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>

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

今回は、 私の生活習慣病(固定プログラム病) を改善するために、 Ubound(配列,1)とUbound(配列,2)なんて使ってみました。 いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 みなさんは、バランスよく関数使って(偏った関数使わないで汎用的にね) 環境やデータによって、バグの発生しない健康なプログラムを作ってね。 何かの参考となれば幸いです。 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記事 バックナンバー目次]


広告: