<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 Access97 VBAの森>ゲームでも作ってみるか



(1)

ちょっと小休止して・・・。
なんかおもしろいもんに挑戦してみようと思います。

みなさん、子供の頃、「いつだれがどこでどうした」みたいな言葉遊び、しませんでした?
え、知らないです??言葉を細かく切って、シャッフルして入れ替えて意味不明な文章作るゲームみたいな奴です。
あれをね、ちょっと作ってみようかなと・・・。何のためにって、別に意味はないですけども・・・。

まあ、ちょっとやってみましょうよ。そんなに時間はかからないですし、何気に変数の練習にもなりますから。


まず、こんな感じのテーブルを用意します。

[ID][誰が][どこで][誰と][何をして][どうした]という6つのフィールドを持つテーブルです。

テーブル名を[マスター]といいます。
あ、テーブル名もフィールド名も自由につけていただいて結構ですよ。
ただ、わけわかんなくなっちゃわないようにしてくださいね。

[ID]はオートナンバー型でもいいし、数値型にしてご自身で入力していただいても結構です。
ただし、必ず連番であること。
オートナンバー型のフィールドはレコードを削除すると虫食いになりますよね。
なので、とりあえずレコードの削除をせず、入力しなおすようにしてくださいね。

で、なんか適当に文章を入力しておいてください。
レコード数は多ければ多いほどおもしろいと思いますが、ここで脳みそを使いきってしまわないように・・・・。
まあ、20レコードくらい、がんばって作ってみてください。


さて、そしたらモジュールを新規に作成します。
モジュールの名前はモジュール1でもサルでもいのししでもなんでもオッケーです。頃合いを見て保存してください。

で、このモジュールの中に、新規にプロシージャを作ります。作り方???もー。忘れちゃったんですか???ヒドイ。
一番左上のツールボタンのちっちゃい三角をクリックして、プロシージャを選んで、出てきたダイアログにプロシージャ名を入力するんです。

あたしはPuっていうプロシージャ名にしました。え?意味なんかありませんよ。

そうすると、Puっていうファンクションを作るよ、と言ってますね。

で、まあ、下のやつは前にもお話してると思いますが、テーブルやクエリーなどのいわゆるレコードセットってやつを使ってなんか処理するときはお決まりのコーディングですよね。

Public Function Pu( )
Dim db As Database, d1 As Recordset
Set db = CurrentDb
Set d1 = db.OpenRecordset("マスター")


End Function

これはみなさんオッケーですよね。これで、このプロシージャの中では、上で作ったテーブル[マスター]は、d1という短い名前で扱うことができるわけですね。

では、本当にちゃんと扱えるようになっているのかどうか、テストです。

Puという関数の実行結果に、d1、つまり[マスター]の[誰が]というフィールドの値を返すように作ってみましょう。

Pu = d1![誰が]

なんでカギカッコで囲んでるか、ってのは、みなさんもうオッケーですよね。

[ ]で囲んでるのはフィールド名とかフォーム名とかオブジェクト名やコントロール名である印。
""で囲むのは、任意の文字列。
囲んでないのは、数値とか変数名とかVBAのコマンドとか演算記号とか、とにかくAccessにわかるもの。

ですよね。

[ ]がなくても、正しくフィールド名であることを認識してくれる場合も多々ありますが、なるべく囲んで書く癖をつけた方がいいでしょう。

そんで、デバッグウィンドウを使ってテストです。ツールボタンの中に、デバッグウィンドウを出すボタンがありましたよね。

?Pu( )

で、Enterキーを押します。
そうすると、デバッグウィンドウの中でプロシージャPuが実行されて、答えが返ってきます。

ふつう、だいたい、プロシージャが見に行くのは指定されたレコードセット(テーブルの中身かクエリーの実行結果・・・データシートビュー開いた状態をイメージしてください)の1レコード目。つまり、1レコード目の[誰が]の中身が出てくるはずなんですけども、出ます?

・・・ここまでで既に意味が分からないとなると、先々つらいもんがあるんですけども・・・。いかがですか?

ええと、で、このままだといつまでたっても1行目しか見ないんで、なんか工夫しないといけないんですけども、例えば「5行目を見ろ」という指示を出したいときはというと、レコードセットの中を検索するための命令文を使います。

DLookup関数でもいいんですけどね。何もここで出来合いの関数に頼らなくてもいいかなーと思いますんで・・・・。

で、メジャーなものにFindというものとSeekというものがあります。

今日はSeekを使ってみましょうかね。

Seek、一度ヘルプ引いておいてくださいね。え?わかりにくいからいやだ??

だめです。

ヘルプを読みたくないという人は、VBA使おうとか思っちゃいけません。
読みにくくてもわかりにくくてもどうでも絶対読まなきゃだめです。

なぜなら、できあいの関数や、クエリーやマクロを使うのと違って、VBAでコードを書いてプロシージャ作るってことは、全部自分で何とかしなきゃならないものだからです。気をつけなくちゃいけないこととか、考慮すべきこととかあるわけで、命令文ひとつとっても、単なる通り一遍の使い方パターンだけ覚えたのでは、危険な場合もあるからです。


さて、どうやらこのSeekというのは、インデックスというものを設定し、その内容にそって検索する命令語のようです。

書き方はこうです。

テーブル名の入った変数.index = "検索に使いたいフィールド名"

テーブル名の入った変数.Seek " = " , "検索のためのキーワード"

今回は、キーワードに[ID]、で、IDが5のレコードを探してきましょうか。

d1.Index = "ID"

d1.Seek "=", "5"

ダブルコーテーションで囲むものと囲まないもの、区別しておいてくださいね。
Seekの場合、直接=を入力するのではなく、文字列として受け取って、後でカンマの後ろに入力されてるキーワードと組み合わせて処理してるようですね。これはSeekの構文ですんで、このまま覚えておくとしましょう。

すると、この時点でプロシージャPuは、[マスター]の5レコード目にたどり着きます。

で、その次の行に、[誰が]の中身を持ってこいと命令が書いてあるので、そのように実行します。

と、5レコード目の[誰が]が出ます?

これで、Seekのキーワード部分をうまく工夫すれば、[マスター]の中からいろいろな[誰が]を拾ってこれそうですよね。