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



(3)

んじゃあ今度は、数量を140から250に変えてみましょうか。
え、なんで250にするのかって?別に意味はないですけど・・・。
他の数字でもいいですよ。数字なら。

変更箇所は2個所です。

今のはAddNewとしているので、新規にレコードを追加しましたけど、もう入力されているレコードを編集するのにはEditという文章に変ります。

で、140を250に。下のようになりますね。

Public Function AAA()
Dim db As Database
Dim d1 As Recordset
Set db = CurrentDb
Set d1 = db.OpenRecordset("テーブル")
d1.Edit
d1![名前] = "あやのこうじ"
d1![数量] = 250
d1![日付] = "99/03/25"
d1.Update
End Function

いちおうコンパイルして、デバッグウィンドウをもう一度出しましょう。
コンパイルとデバッグウィンドウの出し方は、ぜひぜひ覚えちゃって下さいね。効率あがると思いますよ。

一度入力したプロシージャ名はデバッグウィンドウ上に残ってるので、このまま()の右側にカーソルを置いてEnterキーを押せばよいです。
で、なんかカーソルが移動してぴかぴかしてるのを確認したら、再びテーブルを開いてみてみましょう。

数量、250に変ってます?

確認できたらテーブルは閉じましょう。


7.フォームから数量を入力したいです。

んでは、これを一歩進めて、「フォームで指定した数量に変更」としてみましょうか。
まあー・・・多分こんな処理作らないと思いますけど・・ふつうは。
でも今日は練習なので、だまされたと思って挑戦してみてください。

適当な無地フォームを作りましょう。

で、フォームの中に適当な大きさのテキストボックスを作ります。で、フォームになんか名前をつけて保存して下さい。
そして、テキストボックスのプロパティを出して、このテキストボックスの「名前」を確認しておきましょう。

わたしは、フォームの名前を[フォーム]、テキストボックスの名前は[テキスト0]になってますので、そんな感じでお話していきますね。

そうしたら、こんどはさっきのプロシージャに戻って、[数量]の代入部分を書き換えます。

d1![数量] = Forms![フォーム]![テキスト0]

Forms!.....という書き方もお決まりです。これも変数の一種かな・・・。

140とか250とか、プロシージャを作るときに代入する数値が決まってればいいんですけど、そういうことってほとんどないですよね。
多分、あとあと値は変ってくると思うし、どんなケースにも対応できるようにしたい・・・。
そのうちのひとつが「フォームのテキストボックスの値」を代入するっていうケースだと思います。

では、コンパイルしましょう。問題なさそうですか?


じゃ、まずフォームをフォームビューで開いて、半角の数字でなんか数値を入力します。

え、何をって?何でもいいですよ。1でも15でも37814でも。

入力したらEnterキーを押して下さい。
カーソルが一番右端にある状態だと、まだ入力途中かなーとAccessが勘違いしちゃいますので、Enterキーを押して「4桁で入力は終りなの!」と強い意志を持って断言しましょう。
数値全体が黒く反転表示したら、Accessが「わかった」と言っている証拠です。

で、そっとプロシージャの方に戻って、デバッグウィンドウを出します。
で、再びプロシージャ名()の右側にカーソルを置いてEnterキーを押しましょう。

フォームがちゃんと開いていれば、特に問題なく処理は終了するはずです。

フォーム閉じてたら、エラーになりますよそりゃ。「フォームのテキスト0の中の値を数量に入れろ」って命令してんのに、フォームが開いてなかったらお話にならないですよね。
こういうのはVBA以前の問題。ないそではふれません。

どうでしょう。フォームで指定した値に、データが書き換わります?


8.コマンドボタンのクリック時のイベントを使います。

ここまで来ると、デバッグウィンドウから実行するのがうっとうしいですね。じゃ、さっきのフォームにコマンドボタンでも作りましょうか。

プロシージャのウィンドウと、デバッグウィンドウを閉じましょう。閉じるとき、「モジュールを保存しますか?」と聞いてきます。
「モジュール1」という名前でよいので、保存しながら閉じて下さい。

で、フォームに適当なコマンドボタンを作りましょう。標題や大きさ、位置はお任せします。
書き加えるのは「イベントプロパティ:クリック時」です。ここに、先ほどのプロシージャ名を直接入力します。

=AAA( )

わかりにくいですがゼロじゃなくて、カッコカッコ閉じです。

で、コマンドボタンをクリックすると、プロシージャが実行されて、数量が書き換わるわけですね。
いろいろ入力して試してみて下さい。


9.もしテキストボックスの中身が空っぽだったらどうする?

でも、このままだと、「テキストボックスの中身が空っぽの状態でボタンをクリックすると、数量が空っぽになってしまう」んですよね。
試してみて下さい。

うーん、こういうのは実行してみて初めて気づくことなんですけど、マクロやプロシージャを使って処理を自動化するときって、ある程度「うっかりミス」に備えていかないとならないんです。

データ書き換わっちゃいますからね。

どうしましょうかねぇ。
じゃ、とりあえず「テキストボックスの中が空っぽだったら、メッセージボックスを出す」という具合にしてみましょうか。

「テキストボックスの中身が空だったら」というチェックは結構難しいんですけど、今回のような場合なら、Nullという考え方でチェックできそうです。
Nullとは「まだ誰も何にもいじってないので空の状態」という意味で使われます。
そして、「テキストボックスの中身が空だったら」と「そうじゃなかったら」との2通りの処理が考えられるので、IF THEN ELSE というのを使って処理を分岐させます。

さっきのプロシージャに一工夫です。
「モジュール1をデザイン画面で開く」でもよいし、コマンドボタンの「イベントプロパティ:クリック時」欄から、ビルドボタン(ピリオド3つボタン)をクリックしても、さっきのプロシージャ入力画面が出てきます。

Public Function AAA()
Dim db As Database
Dim d1 As Recordset
Set db = CurrentDb
Set d1 = db.OpenRecordset("テーブル")
If IsNull(Forms![フォーム]![テキスト0]) Then
MsgBox "数値を入力して下さい"
Else
d1.Edit
d1![名前] = "あやのこうじ"
d1![数量] = Forms![フォーム]![テキスト0]
d1![日付] = "99/03/25"
d1.Update
End If
End Function

書き足す個所、ワカリマスか?
よければいちおうコンパイルして、閉じましょう。
フォームもいったん閉じましょうか。

再びフォームを開くと、テキストボックスの中身は空っぽですよね。非連結ですからね。
まずこのままの状態でコマンドボタンをクリックしましょう。
と、メッセージボックス出てきます?

これで、うっかりミスを多少防ぐことができますよね。


さてさて、VBAなんて言ったって、こんなもんです。

なんか、ものすごく高度な技術で、これさえ使えばなんでもできるみたいな解釈をしている人もいるみたいなんですけどね。
みなさんの周りにもいらっしゃいませんか?
実際のところ、通常の処理は、マクロやアクションクエリーを工夫して作り込んでいった方が、安全で開発効率がいいと思うんです。
まあ、ケースバイケースですが・・・。

でも、いろいろ突き詰めていくと、「マクロやクエリーではそうとう困難な処理」というのもあるにはあるんです。
うまく使い分けていくことができるといいですね。

さてさて、ここまで書けるようになると、いろいろやってみたい処理って見えてくるんじゃないですかね。
次はどんなプロシージャを作りますか・・・。

いろいろ挑戦していきましょう。