<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > テーブルへレコード追加
  1 2



テーブルへレコード追加

そしたら、この仕組みをちょっと応用して、フォームのテキストボックスに入力した値を代入するようにしてみましょうか。

そしたらですねぇ。
テーブルと全然関連してないフォームをひとつ作ってください。

テーブルを新規作成するとき、単に「デザインビュー」を選べば、無地のフォームができますよね。
ここに、これまた非連結のテキストボックスをふたつと、コマンドボタンを作ります。

で、フォームに何か適当な名前を付けて保存しておいてください。わたしは[フォーム1]でいいや。
さらに、テキストボックスの名前を確認しましょう。
わたしのは、[テキスト0][テキスト2]という名前になってました。
フォーム名、テキストボックス名が間違ってるとどうしようもありませんからね。
もし、このフォームのテキストボックスに入力した値を、テーブルに追加したいのであれば、

構文はこうなります。↑どこがどう変わったか、じっくり観察してみてください。
だいたい流れがつかめたら、VBEのウィンドウに戻って、AddNewの部分を上の図のように書き換えましょう。
え?どうやってVBEのウィンドウに戻るのかって?
んもー、こういう操作には早いとこ慣れてくださいよ。タスクバーに残ってません?閉じちゃってます?
閉じているのであれば、データベースウィンドウの「モジュール」の中からModule1を開きましょう。
VBEのウィンドウが開いてくると思います。

あるいは、ツールバーの「コード」というボタンをクリックできる状態なら、これクリックするだけでもVBEのウィンドウが開いて出てきます。

VBEのウィンドウが開いて出てきても、コードが表示されていない場合は、画面左上の「プロジェクトエクスプローラ」からModule1をダブルクリックしましょう。

コードの内容としては、とりあえずこんな感じでしょうか。

では、フォームの方にもどりまして・・・。
コマンドボタンを作りましたよね。これをクリックしたとき、Publicプロシージャを実行させようと思うんですけどね。
その場合は、コマンドボタンのクリック時のイベントに、

こんなふうにすれば、Publicプロシージャを呼び出すことができます。
Callっていう命令文で、rensyu1というプロシージャ名を呼び出します。モジュール名じゃないですよ。プロシージャ名です。



さて、どうかな・・・。
フォームを保存し、フォームビューで開いてください。

ふたつのテキストボックスに何か入れます。
値段のほうは数値フィールドですから、間違っても全角文字を入れないように気をつけてくださいよ。
それから、値段を入れた後、Enterキーを押して、ちゃんと入力を確定することも忘れずに。
Enterキーを押すと、コマンドボタンが選択された(ボタン名がちょっと点線で囲まれたりして)状態になると思います。
そしたら、ボタンをクリックします。

表面上は何にも起こってないですけれど、テーブルにはちゃんと追加されているはずですよ。



さて・・・。
ふつう、こういうことは、「テーブルをレコードソースにしたフォーム」ならば、全然何も考えなくてもできることですよね。
「レコードソース」って考え方、MS-Accessのメリットでもあるんですけど・・・。
まあ、あえてそれを無視して、「非連結のフォームから、VBAでテーブルにレコードを追加する処理」を作ってるわけです。
そうなると、細かいとこまで気をつけてやらないと、予期せぬエラーが出る可能性大、ですよね。
んじゃ、こまごまとその辺の配慮について、見て行きましょうか。

まず・・・この場合、テキストボックスが空っぽのままだと、空っぽのレコードがガンガンできてしまいます。
なので、コマンドボタンをクリックしたとき、テキストボックスの中身が空っぽかどうかチェックしておく必要がありそうです。
例えば、コマンドボタンのクリック時のイベントで、

ふたつのテキストボックスのうち、どちらか一方でも空っぽだったら、エラーメッセージを出し、クリック時のイベントは中断する、という意味ですね。中断、は、Exit Subと書きます。
これで、「このSubプロシージャは、ここでおわり」という意味になります。

ついでに、メッセージボックス出した後に、カーソルが「テキスト0」のところにきているようにするとか。
これは、マクロの「コントロールの移動」アクションを使ってやるといいと思います。

こんな感じかな。

それと・・・[テキスト2]の方は、数値が入るようにしたいんですけどね。
このままだと、英字とかひらがなとか、入力できちゃうじゃないですか。追加先は「数値型」フィールドなので、エラーになっちゃいますよね。
VBAでチェックする方法も無きにしも非ずですが、テキストボックスのプロパティを活用してみてはどうでしょう。
定型入力に999999みたいな感じで、半角の9をいくつか入れとくと、半角の数字だけ入力できるようになります。

定型入力って案外便利なので、どんな制限をつけることができるかヘルプで調べておくといいと思いますよ。
もちろん、VBAの中でチェックすることもできますけれど、こういったプロパティをシッカリ利用するのも大切なことだと思います。

いちいちフォームを作るのとかめんどう・・・それほどのこともないんだけど・・・という場合は・・・。
んじゃ、InputBoxを活用してみましょうか。

こうしておくと、2回InputBoxが表示されて、それぞれに入力した値が、AddNewの対象となります。

これもけっこういけそうな感じしますね。

ここまでいかがでしょう。ちょっと面倒な感じしますけど、書き方に慣れれば、そんなに難しそうでもないですよね。
AddNewとUpdateの間で、ちゃんと各フィールドにしかるべき値が代入できていれば、あとは特に問題ないと思いますよ。
あんまり焦らずに、小さなテーブルと小さなプロシージャを繰り返し作ってみて、慣れていって下さいね。



最後に、ちょっとだけ余談です。
非連結のフォームの中に入力した値を代入するなら、Privateプロシージャとして作ったほうがいいかもしれないですね。
今回は練習なので、Publicプロシージャを作りましたけども。
フォームの、コマンドボタンのクリック時のイベントで、この処理を動かしたい場合は、こんな感じになると思います。

どこが違うかは・・・じっくり観察してみてください。
Publicに作るのでも、別にどっちでもいいと思いますよ。
もし、最初から、フォームから値に入力をすることが分かっていたら・・・コッチの方が手軽かもしれないですね。