<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 Access97 VBAの森>なんかいっこ作ってみますか



(1)

MS-AccessでのVBAに関しては「データベースを作ろう」のコースの中に再三登場してます。
ちょっとばかり内容が重複するところもあると思いますけど・・・。

でも楽しくやっていきますんで、よかったらお読みください。


VBAというのは、MS-AccessやExcelなどのアプリケーションソフトの中で扱えるように改良されたVisual Basicのことです。
VBAというのは開発言語そのもののことを指しますんで、Accessの中では、「プロシージャ」と呼びます。
うーん、ちょっと違うかな。「VBAという言語で記述して実行可能になったプログラムのことをプロシージャ」と呼ぶのかな・・。
まあ、そんな感じでしょうか。

プログラムですので、まあ、目的はマクロみたいに処理をある程度自動化させるために作ります。
ほんとはマウスやキーボードを使って、データベースウィンドウから必要なフォームを開いたりレポートを開いたりテーブルにデータを書き込んだり・・・。
マニュアル操作をするところを、あらかじめ手順を書き込んだプログラムを動かして自動処理させようというわけです。

また、更新クエリーや追加クエリーなど、テーブルに対して物理的な処理を行う「アクションクエリー」と同じように、指定したテーブルの中にデータを書き込んだり値を変更したりするプロシージャを作ることもあります。
これは、マクロの中で「更新クエリーを開く」のとまったく同じ動作ですね。

でも、クエリーのようにデータを表示する能力(データシートビュー)は持ってないので、ただ動いて処理をするだけです。
なので、VBA単体で動くことはあんまりないですね。
データを抽出したり表示したりするためには、必ずなにかしらテーブルやフォームを使わなければならないわけで、なんかデータを検索したり抽出したりするなら、クエリーを使う方が256倍くらい便利で、安全で、効率がよいのではないかなぁと、わたしは思います。

「VBA使える=高度」ということじゃないと思うんです。「新宿駅から東京駅まで、山手線で行くか中央線で行くか」って感じじゃないかなと思うんです。
「郵便局に行くのに自転車で行くか原チャリで行くか」とか、「カレー作るときにおたまでかき回すかしゃもじでかき回すか」とか(しつこい?)

とにかく、目的を達成できれば、手段はVBAであろうがマクロであろうが、どっちでもいいんじゃないかなと思うわけです。
まあ、あんまり難しいものでもないんで、楽にして取り組んでみましょう。


1.テーブルを用意します。

(今日、字ばっかりだな・・・)

それでは例によって、無計画にいきなりひとつなにか作ってみましょう。

最初は例題というか、あんまり意味のない処理を作りますが、どうかがっかりなさらないで・・・。
できるだけわかりやすくおもしろくお話していきますんで、どうかしばらくの間お付き合いください。

どんなのを作りますかねぇ・・・。できれば少し手応えのあるやつがいいですよね。ふむ。
まず、なんか適当にテーブルを一個用意しましょう。
わたしはこんなテーブルを作りました。どんなのでもいいです。
でも、どんなテーブル作ったか、しばらくの間記憶しておいて下さいね。

あ、主キーを設定するなら、とりあえずそのフィールドはオートナンバー型にしておいて下さい。
まあ、まだ練習ですから・・・。
わたしはテーブルの名前を「テーブル」にしました。
いま作ったばっかりですから、テーブルの中身は空っぽですよね。


2.プロシージャを新規作成します。

じゃあ・・・このテーブルにレコードを追加するプロシージャを作ってみましょうか。
テーブルはいったん閉じて、データベースウィンドウに戻りましょう。

モジュールを新規作成します。

なんの前触れもなくいきなり真っ白なウィンドウが出てくるだけの味気ない状態になります。
セルフサービスなので、左上のツールボタンの「右側のちっちゃい三角のボタンの方」をクリックして、プロシージャを新規に作成します。

そうすると、なんかダイアログボックスが出てきます。
このモジュールの中に新しいプロシージャを作るけど、なんて名前にする?と聞いてきてるみたいですね。

適当に名前付けましょうか。何でもいいです。漢字やひらがなでもオッケー。
でも、なんて名前付けたかしばらくの間覚えていて下さいね。
と、真っ白な味気ないウィンドウの中に、2行ほどなにか現れます。

Public Function AAA()

End Function

なんじゃ?

わたしはAAAというプロシージャ名にしたのでこうなりました。

間に1行あいてますよね。ここに、AAAというプロシージャの処理内容をVBAで記述するわけです。

プロシージャ名は、違うモジュールの中でも、同じ名前を使うことは避けた方がよいですね。
一度使った名前は、同じデータベース内ではもう使わない。。。方がよいでしょう。
また、DateとかFormatとかCountとか、あらかじめAccessの中に用意されている関数ってありますよね。
これから作成するプロシージャは、請謁ながらあれと同じ扱いになるので、ありがちな名前も使わない方がいいでしょう。

つけられるんですけど、正しく動作しない可能性大です。
どうしてもCountってつけたいなら、アタマになんか頭文字みたいのつけるとか、工夫してみて下さい。
わたしはニキータなので、この手の名前をつけたいときはN_Countっていう風にします。
なんかカッコイイでしょ。


3.変数の宣言をします。

さて、では、さっき作った「テーブル」という名のテーブルに、レコードをなんか1件追加する処理を作ってみようと思います。
まあ、こんな処理は実際には作らないと思いますけど、練習なんで、とにかく挑戦してみて下さい。

やることは追加クエリーみたいなもんですね。
でも、追加クエリーほど気軽に追加させてはくれません。
全部セルフサービスですので、いちいち細かいことを書き込んでおいてやらないとならないです。

まず最初に、「テーブル」という名前をこのプロシージャに教えておいてやらないといけません。
そしてそしてさらに困ったことに、プロシージャというのは、今開いていない他のデータベースの中のテーブルもいじることができちゃうんです。

そこで、「今開いているデータベースの中のテーブルという名のテーブル」と、ずいぶん遠回しな表現をしてやらないと、わかってくれないんです。

たかがテーブル名ひとつ教えるのに、じゅげむじゅげむごこうのすりきれみたいにながーい記述をしなければならなくなってしまって落語のようになってしまうので、手短に記述できるよう、「今開いているデータベースのことはdbと呼んで、その中のテーブルのことはd1と呼ぼう」と、あらかじめ短めの単語で記述できるようルールを設けておきます。

「いや、わたしは記述が少々長くなってもいいです」とか言わないで、同じようにやってください。
まあ、おんなじにやりましょうよ。どうかひとつ(@伊東四郎)お願いします。


まず、dbとかd1とか、短めの単語を決めます。

なんでもいいんですけど、あんまり長いのとか、ありがちな名前は避けた方がよいので、分かりやすい短めのものにした方がいいですね。
わたしは、データベースをdb、テーブルをd1にしました。
と、勝手に「しました」とか言ってるだけじゃだめで、ちゃんと書いておいてやらないといけないんですよね。

こういう「記述が長くなったりややこしくなったりするので、このプロシージャ内で使う仮の共通語」のことを「変数」と呼びます。
今回のこのd1とかdbは、テーブルやデータベースのための変数なので、「オブジェクト変数」なんて呼びます。
と、使いたい変数名は一番最初に「宣言」しておきます。Dimというのを使います。

Public Function AAA()
Dim db As Database
Dim d1 As Recordset


End Function

コンピュータで扱うデータにいろいろ種類があるように、変数にはいろいろな種類がありまして、そこんとこがややっこしいんですけど、「dbとはデータベースのことで、d1とはレコードセットのことです」という意味になります。

レコードセットってのはなんじゃ?とお腹立ちの貴兄もおいでかと思いますが、テーブルやクエリーといったオブジェクトは、「定義(デザイン)」「中に入力されているデータ」と、二通りの角度でみることがあります。定義のことをTableDef、中身のことをクエリーもテーブルもRecordsetと呼びます。これもほぼお決まりパターンなので、覚えてしまわれるとよいのではないかなと思います。

変数の種類など細かいことは、また後でやりましょう。

今回は「中身」にレコードを一件追加したいと思ってるので、d1という変数は、中身のことになります。で、d1 As Recordset。
Asって入力すると、変数の種類の一覧が出ますんで、中からうまいこと選んで下さいね。

うまく選べなくてエラーになっちゃったら、削除してDimから入力し直しましょう。
とにかくこういう編集画面は「慣れ」ですよね。いろいろいじくってみてコツをつかんじゃって下さい。


4.変数の中に、値をセットします。

で、次に、宣言した変数はいったい何なのか、「今開いているデータベース」と「テーブル」であることを教えてやらないといけません。
これはSetというのを使って書きます。

Set db = Currentdb

Set d1 = db.OpenRecordset("テーブル")

大文字小文字は区別しなくても、スペルが正しければちゃんと大文字小文字切り替わります
とにかく半角でさくさく入力してしまいましょう。

これも・・・もしかしたらほとんどお決まりパターンかもしれないですね。
Currentdbというのは「今開いてるデータベース」という意味です。決まり文句。

で、次がちょっと難しいですが、db.OpenRecordsetといのは、db、つまり一行前にセットした「今開いてるデータベース」の中のレコードセットであるぞ、という意味ですね。で、その後ろにかっこ書きで、テーブルの名前を指定します。
ダブルコーテーションで囲むことをお忘れなく。固有名詞ですからね。

ここまでは大概、お決まり構文だと思いますので、意味を把握していただければ丸暗記丸写しでも特に差し障りないと思います。