<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000--VBAの小屋>横のものを縦にする
   1 2 3



まずは考え方を整理しましょう。

最も大きな問題は、「フィールド名をデータにしたい」というところですね。
今、ただ単にExcelからインポートしてきただけなので、各日付が、そのままフィールド名になってます。
2000/08/01というフィールド名を、「日付」というフィールドの中の値のひとつにしたいわけです。

で、その「2000/08/01」が、メンバーの人数分、つまり、「坂本」「井ノ原」「長野」「岡田」「森田」「三宅」という名前と、彼らの8/1分の収穫数を、それぞれ「名前」「まつたけ」の欄に移していきます。

でもって次に、「2000/08/02」というフィールド名を「日付」フィールドに入れて・・・と、これを一番右端のフィールドまで繰り返します。

で、このテーブルの中に、うまいことデータがたまっていけばいいんですけど・・・。
上のテーブルの中のデータやフィールド名を、どういう順番でどこへいくつ書き出していけばいいか、プログラムのコードとかVBAのどうのとかそういうのはとりあえず置いておいて、じっくり考えてみてください。

だいたい、イメージできました??

そしたら、上の「まつたけテーブル2」みたいな感じのテーブルをひとつ、作っておいてください。
プロシージャの中でテーブル作ってもいいんですけど、今回はあらかじめ作っておくとしましょう。
主キーはとりあえずいいです。主キーなしのテーブルでよいですよ。


そう。
VBAの処理の基本は繰り返しなのです。

上のようなことを、132フィールド分ずーっと書いてたら、VBAのコードが何百行にもなってしまいます。
そこで、まずこういう処理を、紙に書いたりして、上のようにエンピツでぐちゃぐちゃ線を引っ張ったりして段取りを考え、繰り返しにできないもんかその辺を検討します。もちろんこれにはVBAの世界での熟練の技が必要だし、人によって多少書き方考え方が異なるし、何通りかやり方があるので、いきなり細かく考えず、大まかな「処理の流れ、動き」を見ることができるよう訓練していきましょう。

さて、それでは、具体的にどう書けばいいのか・・・。
一例ではありますけど、いっしょにやってみましょうね。

書きながら、今考えたことがどこでどこでどうつながっていくのか、確認していってください。

今回は、新規にモジュールを作成し、その中に新規にひとつプロシージャを作るとしましょう。
汎用的に利用できるパブリックなプロシージャ(笑)を作ります。

先頭の部分は、みなさんもうオッケーですよね。
プロシージャの名前は任せます。




今回は、元のテーブル(まつたけテーブル)と、書き出す先の新しいテーブル(まつたけ2テーブル)のふたつを使いますので、レコードセット名を代入するオブジェクト変数が2つ必要になります。
わたしは、R1R2っていう名前にしました。
変数の名前の付け方はもうばっちり、っていう方は、お好きな変数名に変えて、練習してみてください。

その他に今回、この処理を実現するために、目安となる「値」を入れておく変数が必要になります。
例えば、2000/08/01とかのフィールド名を一時的に入れておく入れ物とか。

で、R1、R2の中に、具体的なテーブル名を代入します。
そのテーブルを、どういう状態で開くのか、ということも明記してやります。





これについては、ヘルプやVBAの入門書などにも解説があると思いますが、もう少しなれたら詳しく見ていくとしましょうね。
今日は上のように書いてみてください。片方は読取専用、もう片方は、編集可能な状態で、テーブルの中身を扱うことができるようにします。



で、最初に宣言しておいた変数を、初期状態にしましょう。
まあ、変数は、数値型なら、だいたい最初は0になってくれてると思うんですけど、相手は気の利かないコンピュータですからね。細かい指示もしておきましょう。





BBBBの方は、以前「プログレスバー」のところでやったように、「今何レコード目を処理中なのか」を代入しておくための変数として使います。つまり、1ずつ足していくわけですね。
問題はCCCCの方ですけど・・・なんか、妙な式が入ってますね。

R1っていうのは、この時点では事前に「まつたけテーブル」というテーブルが代入されてますよね。Fieldsっていうのは、そのテーブルのフィールドのことを表します。その後ろにCountっていうのがありますよね。で、それぞれピリオドでつながってます。

ピリオドでつながってるということは、「〜の」という意味になります。
つまり、まつたけテーブルの.フィールドの.数という意味です。
これで、このテーブルの中で、



まつたけテーブル」の1列目のフィールド名を「まつたけテーブル2」の「日付」フィールドに代入して
  その列の1行目のメンバー名とまつたけ数を「まつたけテーブル2」の「名前」と「まつたけ」のフィールドの中に代入して
まつたけテーブル」の1列目のフィールド名を「まつたけテーブル2」の「日付」フィールドに代入して
  その列の2行目のメンバー名とまつたけ数を「まつたけテーブル2」の「名前」と「まつたけ」のフィールドの中に代入して
まつたけテーブル」の1列目のフィールド名を「まつたけテーブル2」の「日付」フィールドに代入して
  その列の3行目のメンバー名とまつたけ数を「まつたけテーブル2」の「名前」と「まつたけ」のフィールドの中に代入して
まつたけテーブル」の1列目のフィールド名を「まつたけテーブル2」の「日付」フィールドに代入して
  その列の4行目のメンバー名とまつたけ数を「まつたけテーブル2」の「名前」と「まつたけ」のフィールドの中に代入して
まつたけテーブル」の1列目のフィールド名を「まつたけテーブル2」の「日付」フィールドに代入して
  その列の5行目のメンバー名とまつたけ数を「まつたけテーブル2」の「名前」と「まつたけ」のフィールドの中に代入して
まつたけテーブル」の1列目のフィールド名を「まつたけテーブル2」の「日付」フィールドに代入して
  その列の6行目のメンバー名とまつたけ数を「まつたけテーブル2」の「名前」と「まつたけ」のフィールドの中に代入して



という処理を、一体何回繰り返すべきなのか、ということを把握するための大切な数になります。
つまり・・・132列あったら、↑これを132回、繰り返すことになるわけですね。

というわけで、Do Loop という繰り返し処理の中で、BBBBに1ずつ加算していくので、BBBBがCCCCと同じになったら、そのテーブルの一番最後の列の処理に取り掛かってる、ってことになります。

こういうことは、Accessのクエリとかマクロとかのオブジェクトとはちょっと異なる考え方を持たないと生まれてこない考え方だと思います。
今、こういう処理が思いつけなくても、これはゆっくり訓練が必要なトコです(もちろんすぐできるようになっちゃう人もいると思いますけど)
ただ、上の解説を見てもぜんぜんちんぷんかんぷん、だと、この先かなり厳しいですから、データがどこからどこに動いて、それを何回繰り返すのか、その「何回」をどこで知るのか・・・その辺、見失わないようにしてくださいね。

VBAを使うってことは、自分で段取りを考える、っていうことですもんね。


では、具体的な処理の内容に入りましょう。
上の処理内容がだいたい把握できていれば、そんなに難しいことはありませんよ。



まず、ループの最初と終わりを書いちゃいましょう
↑こんな感じでしょうか。
BBBBがCCCCと同じになるまで、処理を繰り返せ、っていう意味になります。
ここがおかしいと、処理が永久に止まらないプロシージャになっちゃうんでしたよね。怖いですねぇ。気をつけましょう。

では、そのDo Loopの中身について見ていきましょう。
以下の文は、Do Loopの内側に書いていきます。あたりまえのことですけど、Loopの次の行に書くんじゃないですよ。

まず、↑BBBBに1足します。BBBB=1 じゃないですからね。気をつけてくださいよ。
1を代入してるだけじゃ、永久ループですよ。いつまでたってもCCCCとBBBBが同じにならない。

んでもって、AAAAという変数の中に、フィールド名をとります。
フィールド名の取り方なんですけど・・・。

わたしたちがいつも「フィールド」と読んでいるのは、フィールド名そのもののことじゃないんです。
なので、考え方としては、

テーブルの.何列目のフィールドの.名前

ということになります。
で、何列目の、というとこがミソなんですけど、

Fields(ナンバー)

ということになります。
ナンバーの部分に入るのは数値で、左から何列目か、が入ります。

一番左の列が、ゼロです。つまり、2列目(2000/08/01は2列目ですよね)は、Fields(1)  ということになりますね。

でも、この()の中身は、常に同じとは限らないですよね。・・・っていうか、2列目だけでいいのかというとそうではなくて、3列目も、4列目も、・・・132列目まで見ないといけません。ここのナンバーの部分が次々に変わっていかないと、2列目の、8/1の分しか書き出されないことになっちゃいます。

いい値があるじゃありませんか。1から始まって、2、3、4、・・・とどんどん加算されていった数字が入る変数が・・・BBBBです。
これを、列数として使いましょう。

これで、変数AAAAに、BBBB列のフィールド名が代入されることになります。


すでに頭が混乱してきちゃった・・・って方、いらっしゃいます?
もう一度じっくり読み返してみてください。
ここでは、同じコードを書くことが目的ではなくて、考え方、処理の組み立て方のパターンをいろいろ見ていくのが目的ですから。
「なんで、BBBBが列数になるの???」なんていう疑問を解消するには、もう、じっくり処理を見ていくしかないですもんね。

次です。
フィールド名をゲットできたら、その日、収穫されたまつたけの数と、それを収穫した人の名前をひろっていかないとイケマセンね。
ええと、メンバーが常に6人固定で、いつも同じ名前だったら問題ないんですが、もしかして名前が変わったりメンバーが変わったり、人数に変動があったら・・・。
それに、例え短い処理だったとしても、6人いたらVBAのコードは6倍になっちゃいます。
あとで読みにくいし・・・。

そこで、上のように、さらに内側にひとつDo Loopを作ります。
6人いるなら、まつたけテーブルの最終行まで、名前とマツタケ数を書き出す処理を繰り返す、っていうことになりますよね。

つまり、下の赤い部分の処理、ってことになります。

これを↓こうしたいのですから、「日付」には2000/08/01を6回(メンバー数分)、同じ値が入ってこなくちゃなりません。
で、上のテーブルの、最後のレコードになるまで、「名前」と「まつたけ」の書き出しを繰り返すのです。

実際のVBAのコードとつながりました???

下のように、外側のループと、内側のループと、ループが2つできました。

スペルミスや記号の使い方ももちろんですけど、Do と Loop は必ず対にならなければならないし、処理の順番にもそれぞれちゃんと意味があります。VBAのコードとして覚えようとせず、実際のテーブルの中身や処理の段取りとうまく結びつけながら理解を深めていってください。


で、最後に閉じるものは閉じて・・・。
Close、Nothing等々の書き方については、そのレコードセットをどういうふうに開いたか、によって多少変わるようです(読取専用で開いてる場合は、とか)。とりあえず今回は下のように書いて進めてください。この辺は後日詳しく見ていきましょう。