<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000--VBAの小屋>ADOとはなんや
   1 2 3 4



まず最初に、「どのデータベースの、どのオブジェクトを、何のつもりで使うのか」ということを書いてやらないといけません。

いわゆる「このテーブル使うぞ宣言」をするわけなんですが、これはどうやって書いたらいいのか・・・。
今回処理の対象となっているテーブルやクエリの中身・・・いわゆるデータそのもののことを「レコードセット」と呼びます。まず、レコードセットをテーブルやクエリから取り出してきて机の上に並べるんですね。そんでもって、そのレコードセットは、書き換えたり削除したりしてもいい状態で開くのか、読むだけでいじらないのか、その辺もついでに言っておきます。
多分、何も言わないと、「読取専用」ってことになると思います。
今回は、ただレコード件数を数えるだけなんで、それでもオッケーですけどね。

さっきヘルプで「DAOをADOに変換する」っていうとこ見たんですけど・・・そこの記述によると、「レコードセットを開く」という記述は

Dim 変数名 as New ADODB.Recordset

となるようです。

ここで「変数」というものが登場してきました!

ほんとは、どこのデータベースの中のなんという名前のテーブル、ってことをだらだらと書かなくちゃいけないんですが、それじゃ処理もままならないので、ここはひとつ、「dddといったら」「どこのデータベースの中のなんとかという名前のテーブルのこと」見たいな感じで、短めでわかりやすくて覚えやすい変わりの名前を付けて、このプロシージャの中ではそう呼ぼう、と決めておくのです。
たとえば

Dim Hebo as New ADODB.Recordset

と書いたとしたら、Heboという変数を使わせてください。このプロシージャ内で利用するレコードセットを入れる器として使います。という意味になります。

Dimとは、変数そのものと変数の種類を書き表すときに使う構文です。
たいてい、一番最初に書きます。この行から下じゃないと、Heboって打っても「なんですかそれ」って言われちゃいますからね。
変数については、また別の機会にいろいろお話できたら・・・と思います。


そしたら次に、Heboってのはいったい何なのか、ということを書きます。これもヘルプからパクってきた書き方なんですが・・・。

Hebo.Open "テーブル", CurrentProject.Connection

これで、Heboっていったら、このプロシージャの中では「テーブル」っていうテーブルの中身のことをいうってことになります。
うーん、CurrentProjectとかConnectionとか、なんかよくわからない単語が並んでますけど・・・。こういうのを正しく知っておかないと、テーブルを扱うプロシージャを正しく書くことはできないんだと思うんですよね。

こういう書き方が、ADO独特なんですよね。ここは後でゆっくり調べていくとしましょう。
ふう。たった2行ですけど・・・なんだかとっても緊張しますね。



さて、どうやってレコード件数を数えるか、ですが、どうしましょう。
みなさんはどうやって数えます?
7件くらいなら迷うことはないですけど、だいたい、上から1,2,3・・・って1行ずつ数えるんじゃないでしょうか。
VBAも同じです。
1行ずつ数えましょう。

まず、数えた数を入れておく器を用意します。
テーブルの中の1件目に到着したら、器に1を足します。
次のレコードに移ります。
で、また器に1を足します。
これを、テーブルの中の最後になるまで繰り返します。
器の中の数が、レコード件数です。


そう、繰り返し処理・・・いわゆるループってやつです。Basicの三大要素(わたしが勝手に言ってるだけ)のひとつです。

〜になるまで繰り返せ、という命令文を作るための構文はいろいろあるんですけど・・・。
「テーブルの最後になるまで繰り返せ」って感じなら、Do Untilっていうのはどうでしょう。ADOでも使えると思うんですけど・・・。

Do Until ○×
処理
Loop

これで、○×になるまで処理を繰り返せっていう意味になります。
気をつけないと、永久ループにはまっちゃいます。
ちゃんと、○×になったら処理を抜けるように作らないといけません。

まず・・・。
「テーブルの最後」
「次のレコードに移動」
「器」
「器に1を足す」
この4つの処理をVBAで具体的に書くとするとどうなるか・・・というと、

「テーブルの最後」→Hebo.EOF
Heboのエンド・オブ・ファイルです。
「次のレコードに移動」→Hebo.MoveNext
Heboの次のレコードです。
「器」→なんか適当な変数を作るとしましょうか。そうですねぇ・・・Cntとか、どうでしょう。AAAでもZZZでもいいですよ。
「器に1を足す」→Cnt = Cnt + 1
ついでに、「テーブルの一番最初に移動しておく」というのは → Hebo.MoveFirst

こういうのは多分、ADOだからといって特別なことじゃないと思いますので、わたしが知っているステートメントで書き綴ってみますね。

そうすると・・・。

変数Cntを宣言。数値が入る。何桁になるかわからないけど・・・長整数型(Long)にしよう。
Heboの1レコード目に移動しておく。←こういうのはこまごま気を使ってやらないとならないんですよ。

Do Until Hebo.EOF
Cnt = Cnt + 1
Hebo.MoveNext ←これやらないと永久ループよー。
Loop

1件目見終わったら、当然2件目の処理に入ってくれてもよさそうなもんですが、わざわざ「次」という指示をしてやらないと、いつまでたっても1件目から移動しません。そういうものなんですコンピュータなんて。だから、ずっとエンド・オブ・ファイルにならず、何時間も何時間も1件目を数えつづけます。7件しかないのに1件目をずっと数えつづけて6億件とかになっちゃったりして、さらにそのうち変数Cntが桁あふれしてぶっ飛んだりします。
もし・・・ループしちゃったら・・・。キーボードのCtrlを押しながらBreakキーを押して、プロシージャを強制的に止めてください。止まることは止まりますが、こんなプロシージャ動かすこと自体、ご法度ですぞ。

はっきりいって、めっちゃめちゃ気を使って目いっぱい配慮してやらないと、まともな処理をするプロシージャにはなりませんのです。
で、最初にHeboって名前で「テーブル」の中身を開いてるんで、最後に閉じます。

Hebo.Close

こんな感じかなぁ。

これで、変数Cntの中には、このテーブルの件数が入ってるはずなんですけど・・・。
とりあえずメッセージボックスにでも出してみるか。


処理の中身は、徐々に慣れていただくとして、今回は「いろいろ書かないとダメなのね」ってトコを理解してください。
もちろん、レコード件数をカウントするなんて処理は、わざわざこんなコード書かなくたってDcount関数とか便利な関数とか機能がいろいろあります。件数を数えるための処理を理解することが目的じゃないですからね。あくまでも、VBAのコードを書くっていうことの雰囲気をつかむのが目的ですので・・・。