トップページ ★MSアクセスウエッブカレッジ| サンプル(ダウンロードする)|業務統合4in1|小さな会社用『感嘆!』 |
サブマクロの終わらせ方(2) |
掲示板に「私も、マガジン楽しみにしている一人です。 で、頑張っているんですが、昨日作ったマクロのサブマクロが、思った回数で終わりません。 前回に引き続き、「サブマクロの終わらせ方」について説明します。サブマクロの終わらせ方には、2通りあります。 1 回数で終わらせる 2 WEHERE条件文で終わらせる 今回は、2の「WEHERE条件文で終わらせる」方法について考えます。100人の生徒のレコードの成績を一人当たり合計と平均を計算するサブマクロを例にしてみましょう。 人数が、100人とはっきりしていて、変動がない場合は、回数指定で、いいと思います。条件文で終わらせるということは、レコード数が、変動しても、正しく処理したいときに利用することになります。 その場合、テーマは、「レコードの最後の処理が終わったらサブマクロを終了しメインマクロに戻す」ことになります。ビジアルベーシックなどでは、ROEといって、レコードの最後を取るコマンドがあって最初からレコードの終わりまでの指示でOKなのですが、マクロでは、最後のレコードをとる方法がありません。 (もしかして、簡単に最後までの指示ができる方法を知ってる人いたら教えてください、お願い) 今のところ、見つからないので、原始的な方法をとります。つまり 1 最初に、レコードの最後の生徒番号を、とって「値の代入」しておいて、 処理を行い、処理番号が、先に代入しておいた番号と一致したら、レコードの 最後と判断して、サブマクロを終了する 2 最初に生徒データレコードの最後のレコードに、最終マーク、私は数字の (999)を、いれておく。 最初から処理をしていって、最終マークが、 出たら、サブマクロを終了します。 上記1も2も同じような処理ですが、違うところは、1の方は、生徒データレコードに、最終マークフイルドを持たなくていいことです。2の場合は、最終マークフイールドを数値型でもって、そこに(999)を入れます。 もう一つ違う点は何かわかりますか?これが分かれば上級者かもしれません。これは、問題にしましょう。分かった方は下記にメールください。ただし賞金商品はありません。あしからず。 kotae@mscn.net 2のサブマクロの設計をします。 生徒成績計算サメインマクロ(注意これはメインマクロです) レコードの最初の1件は、メインマクロで処理して2件目からサブマクロになります。 1 エコー設定 そうしないと、画面が動いてしまう 2 生徒レコード(フォームにする)を開く 3 最後のレコードに移動 レコードの移動アクション 4 「値の代入」アクションで、数字999を代入する。 9でも99でも9999でもいいです。知ってる、そうですよね、 でも念のため。「6でもいいかって」…………。「だ、か、ら」 5 最初のレコードに移動 レコードの移動アクション (どうして、最初のレコードに移動するのか、これも考えて見ましょう。 そうです。今までは、準備処理で、ここから、計算処理になります。 最初から最後まで計算するので、レコードを最初に戻します。 最初に戻さないと、最後のレコードのみ計算して終わってしまいます。 6 「値の代入」アクションの実行で合計点数の計算 代入先はアイテム「生徒レコードの合計点数」 計算式は、○○科目点数+○○科目+○○科目…・・ 6「値の代入」アクションの実行で合計点数の平均点計算 代入先はアイテム「生徒レコードの平均点数」 計算式は 式 「生徒レコードの合計点数/科目数」 平均点フイルドは、数値型で、倍精度浮動小数点型で、小数点桁数を 設定してお く、初期値の長整数型では、小数点以下の数字は計算さ れません。 これで、1レコードの計算処理が終わります 7 レコードが一件の場合、サブマクロ起動させない「マクロの中止設定」をします。 [Forms]![生徒データWF]![最終マーク]=999場合「マクロの中止」アクションを設定 します。 レコードが一件の場合、ここで終わります。サブマクロは起動されません。 サブマクロの設計 次にサブマクロの「マクロの実行」を設定します。 1サブマクロを実行する条件を考えます。 「条件文の書き方」 「マクロの実行」のプロパテイでwhere条件設定の説明で、 「評価結果がFalseになったときマクロが中止する式を入力してください」と あります。これがやっかいです。 falseになったら終了。最終マークと999でない場合か、では、 [Forms]![生徒データWF]![最終マーク]<>999 になります。=でないところに注意してください。 実際にやっていくと、これでもうまくいかないことがあります。微妙に条件が食い違う時があるようです。NULLの扱いがアクセスヴァージョンで異なりますので、それも条件に入れなくてはならない場合もあります。 1 レコードの移動で次のレコードを出します。 2 メイン処理と同じ「値の代入」計算アクションを入れます サブマクロはレコードを次に移動して、計算するだけの物です。処理が終わってから、最終レコードか否かのチェックをしています。 実践ではサブマクロはよく利用します。長いプログラムは、読みづらく、間違いも多くなります。テクニック上からもサブマクロはポイントになります。もちろんサブマクロがないと大変な処理になることもあります。有効に活用しましょう。 サブマクロを使った事例が下記にあります。参照してみてください ■現金出納帳作成:残高計算をマクロで行う552KB http://mscn.net/home-ms/dawnroad.htm
「マクロ」 処理1(アクション) 処理2(アクション) 処理3(アクション) サブマクロA 処理1(アクション) 処理2(アクション) サブマクロ終了 処理4(アクション) 処理5(アクション) サブマクロB 処理1(アクション) サブマクロ終了 処理5(アクション) 処理6(アクション) 終了 のようなものもあります。マクロの階層は、5段階くらいできるのかな?ちょっと忘れましたが、上記3階層は問題ありません。 サブマクロ内でも当然、処理1(アクション)等が行われます。このとき、サブマクロは、終了すると、もとのマクロに戻り、マクロの残りの処理を終えて、全てのマクロ終了となります。 今回のテーマ。「サブマクロの終わらせ方」とは、上記のサブマクロ終了のところです。サブマクロは何も指定しないと、1回実行して、主マクロに戻ります。上記利用形態で言うと、2,3,4はこのケースになることが多いので、終わらせ方は余り問題になりません。 一番問題になるのは、1の多いデータを繰り返し処理をする場合でしょう。100人の生徒の成績を合計して平均を出し、そのデータを成績データに複写する場合を考えて見ましょう。 手順1 生徒データは表形式のフォームに作成します。 テーブルのままでは、扱いにくいので表形式のフォームにします。 必要に応じてデータの選択、並び替えのためクエリーを使うことも あるので。 手順2 主マクロの作成 手順3 サブマクロの作成 手順3 サブマクロの終わらせ方の設計と実行 終了 「サブマクロの終わらせ方:エンドレスループに注意」 サブマクロの終了は、回数で終了させる方法と、条件で終わらせる方法がある。回数は、何も問題なく終了させることができるでしょう。又、掲示板の方のように、エンドレスにならないよう、実験段階では,回数で確認することをおすすめします。 エンドレスループに入ると、大変です。メモリが一杯になるまで実行してしまい。思わぬ故障が発生します。もしエンドレスループに入ったと予感したら、どんな方法でもいから、強制終了させてください。 WINDOWS2000.NTなら、タスク終了できます。 (意味がわからない人は気にしないでいいですよ) どうしてエンドレスループになるかといえば、まさに、サブマクロの終わらせる条件設定が、間違っているからです。私も、今まで、多くの上記エラー現象を味わっています。一度は皆さんも味わってください。エンドレスループを故意に作ってみてください。楽しいですよ。 「サブマクロをWFERE条件文で終わらせる」 サブマクロをWEHER条件で終わらせるということは、「データの最後まで処理したら終了する」というようにすることです。従って、考えるポイントは、データの終わり(最後)をどうやってつかむかと言うことになります。これが思いつけば、40%ぐらい解決したといえるかも知れません。 次回は、この方法を明かします。皆さんも実験して、答えがでたら、掲示板に答えてください。 2 サブマクロの回数について (マクロ談話室) サブマクロの終わらせ方(1) ★前回のテーマ |
メール:macro@mscn.net
| トップ|4in1|曙司法書士システム|公益法人|
|弁理士用大丈夫|弁護士用大丈夫|ARA ! |
| マクロ研究会|MSアクセス入門マガジン |マクロ会議室|ダウンロード|