<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--Excelのワークシートを全部使ってみる。2/2
  1  2



(よい子はマネしてはいけません#2)

前のページの続き。さて、では、Accessではどうなんでしょう。



もちろん。やりますよ。ヒマだもん。ひまだもーん。

Access2000で新規にデータベースをひとつ作り、その中にテーブルをひとつ設けました。
もちろん、フィールドが255あるテーブルです。

先のExcelのワークシートをインポートしようと思ったのですが、列数が256あるからすでにAccessのテーブルのスペックをオーバーしているし、インポート機能内で監視しきれる範囲を超えているらしくインポートエラーになるので(笑)、似たような構造のテーブルを手作りしました。

意味ないですけど、フィールドの数が1少ない分、レコード数を増やして、約20万レコード作りました。意味のない単語や数値をランダムに書き込んだだけですけど・・・。

縦に201388行、横に255列の大きな表になりました。2秒ほどでデータシートビューが完全に開きます。
レコード移動ボタンを使ってEOF(えんどおぶふぁいる)まで移動するのも一瞬ですね。20万レコード格納しているという感覚はほとんど感じられないですね。

まあ、このデータシートビューを直接使うというよりは、Accessなら入力/照会用のフォームをこしらえることになると思うんですけど、

適当なフォームを作って(ちょっと255個テキストボックスを並べるわけにも行かないんで・・・ラベルやコマンドボタン作れなくなっちゃう)、そこでレコード移動をしてみても、すぐ表示されます。とりあえず「またされる」ということはないですね。

1つのフィールド内の値の桁数が少ないですけど、いちおう255フィールドあるテーブルで、20万レコードあります。テーブルそのもののサイズってどこで調べたらいいかわかんなかったんで、このテーブルとこのフォームだけの状態でmdbファイルのファイルサイズを見てみました。833MBでした。ほぇ〜。こんなデータ久しぶりに作ったっちゃ。

もちろん、Accessのテーブルは、インデックス(クエリーやフィルタで並べ替え/抽出をすばやく行うために、あらかじめテーブルに設定しておく並べ替え目印みたいなもの)を設定すると、その分テーブルのサイズが大きくなりますから、このファイルサイズは最低ラインってとこでしょう。

あ、念のために・・・。Accessに限らず、RDB(リレーショナル・データベース)というものは、縦に伸び縮みする構造を思い描くもんです。なので、必然的にフィールド数は少なければ少ないほどよいとされてます。パフォーマンス、安全性、負荷、すべてにおいて・・・。だからこそ、マスターテーブルを設けてテーブルを小分けしてりレーションシップを結んだりするわけですね。
といっても、「じゃあいくつくらいまで大丈夫なんですか?」っていうのはわかんないですが・・・。ひとつのテーブルに収めなきゃならないようならしょうがないですけども、よく見れば正規化できそうなテーブルって、ありそうですよね。

んでもって、これはあくまでもわたしの興味本位&ヒマつぶしの実験ですので・・・。
「意味わかんない」っていう人もいますよね。べつに、Excelのワークシート使いつぶすのが最終目的ってワケじゃないんですよ。件数多くてもExcelでも使えるには使えますけど、Excelは完全に全部開かないとならない、それに対してAccessの場合は、テーブル自体を開く必要はないのです。クエリやフォームを使って、必要なレコードだけ表示するような仕組みを作っておけば・・・。

その違いを理解いただければ、こんなあほな実験をした甲斐があった、という気がしてまいります・・・。




MDBのファイルサイズそのものよりも、ここで注目したいのが、「Accessはレコード単位で処理をする」ってところです。
Excelは「ファイル単位」で処理します。だから、見たいのは401行目だけなの〜と思っても、えっちらおっちら全データをメモリ内に読み込んで画面に表示させて、はいどうぞ、って状態にするわけです。ふつうのパソコンソフトはみんなこういう考え方ですよね。専用のソフトでファイルを開いて、仕事はそれからです。

先の65536行、256列のシートを持つブックを、1時間近くかけて開いて、仕事はそれから。開いてしまえばまあ比較的スムーズに動きますけど、見たいデータがたった1行だったとしても5行だったとしても全体だったとしても、まずはシートを全部画面に呼び出して開かないとなりません。内容を変更したのがたった1個のセルだったとしても、上書き保存はファイル全体に対して行われます。じわーじわーと40分くらいかけて・・・。

Accessはレコード単位です(厳密にはページ単位というのでしょうが)。なので、とりあえずMDBファイルを開いてメニューとかデータベースウィンドウ開いてるときは、ばかでかいテーブルがあったとしてもそいつは開いてることにはなってないんですね。で、フォーム開いたり、クエリーでデータ抽出したりしたとき、初めて必要なレコードだけテーブルから取り出されて提供されるわけなので、そういう意味での「軽さ」と「安全性」は望めると思います。

Excelのブック、開こうとしている間に停電とか電源障害とか起きてパソコン飛んじゃったら、そのファイルどうなっちゃうかわかんないですしね。

う〜ん、しかし、パソコンが速くなると、いいもんだなぁ。
前のPentium133Mhzの時は、20万件のテストテーブル作るのに40分くらいかかってたけど、今回はカラムが255あるにもかかわらず、2分くらいで作れちゃったぞ。
AccessとかOracleとか使って、大量データを処理するようなアプリを作る計画がおありでしたら、ソフトの構築のほかにも、定期的にマシンのグレードアップをしていくような長期計画も、少し立てて置かれるとよいのかもしれないですね。なかなかそうはいかないですけれども・・・。




本来、コンピュータの世界の「データベース開発」って、データとプログラムの組み合わせなわけです。こりゃ改めて言うまでもないですけど・・・。

データが収まってる表を作って、そこから該当するデータを取り出す道と、取り出したデータを表示する画面や印刷物をそれぞれ個々に作って、何かのコンピュータ言語でコントロールするようにして、初めてひとつのアプリケーションと呼ばれる仕組みができるわけですね。

普通はそうなんですけど、そんなの難しいし、手間も時間もかかるし、でもコンピュータで集計とか計算とかしたい・・・という人のために、データとプログラムの隔てがなくて、用意された画面と機能を使ってデータ入力ができるExcelみたいなソフトがどんどん登場してきたわけです。
こいつらにはプログラムとデータの区別はありません。そのかわり、Excelで作った表を開くには、ただ見るだけであったとしてもExcelが必要。で、ファイル単位で行動させるわけです。

会社の中で、棚に顧客台帳ファイルをしまっておいたとしますね。みんながこれを棚から取り出して、書き込んだり書き足したりして、また棚に戻す。誰かが棚から持ち出している間は、他の人はそのファイルに対して書き込んだり書き足したりはできないんです。

これが、1ページずつばらばらにできるタイプのファイルで、みんなは必要なページだけファイルからはずして持ち出し、書き込んだり書き足したりしたらまた元の位置に戻す。こういう形式がAccessなのですね。

わたしは決して「AccessとExcelとどっちが便利か」ということを述べてるつもりはないんです。Excelは便利ですよ。ほんとすごいです。ただ、Excelの便利さは、フラットにデータを眺めながら操作したい場合に限ります。グラフ作ったり、数値を変更してシュミレーションしてみたり、罫線や文字色を変更して報告書などの印刷物として活用したり。こういう手軽さに、多少のデータ管理機能が活用できる、くらいな感じで捕らえて使うと、ものすごく便利です。

でも、「データを蓄積する」ためのツールとしては、やっぱりちょっと弱いと思うんです。弱いって言うと御幣がありますけど、要するに「開かないと始まらない」ですからね・・・。

「1年分の実績データを蓄積して、集計して・・・」なんていう処理は、データ1件1件をフラットに見渡すよりもまず、安全に高速に必要な情報だけほいほいっと取り出せる、って点がポイントになると思うんですね。開くたんびにいちいち1年分のデータ、全部見渡す必要あります?あ、あるなら、Excelが便利です。が、とにかくデータを蓄積していくことに重点を置くなら、Accessを活用していくべきじゃないかな、と思うわけです。

え?オチがない?え、えー・・・。




と、Excelと比較するような記事をいくつか出しておきながらなんですが、やっぱりExcelとAccessを比較するのはナンセンスです。
よく、「Excelでいうところの○○関数は、Accessにはないんですか?」という人がいるんですが、あるものはあるしないものはない。
根本的にデータの持ち方考え方がぜんぜん違うのですから、両方のソフトの特性を活かして、うまく使い分けていく必要があるのです。

Excelは「表計算ソフト」です。表のような形を作って、その中で縦横に計算式を組んで使うための機能が用意されているソフトです。
考え方の単位はセル。何列目、何行目のセルに入ってる値をどうこうする、という考え方です。

例えば、下の図はExcelの画面です。適当な表を作ってみました。

一番右端に平均と合計をそれぞれAverage関数、Sum関数を使って出しています。
この場合は、それぞれのセルに「E、F、G列」というセル範囲を指定して計算式を作るのが一般的です。
で、まあ、ときと場合によっては一番下のセルに集計結果を出してみたりします。
件数はCount関数を使って、値の入ってるセルの数を数えたい範囲を指定します。

何から何までセル単位で考えます。織田さんの2月10日のデータAの値を知りたい、と思ったら、画面の中探してE15のセルの中の2.69っていう値をマウスかなんかでカチッとクリックすればいいですよね。
これがいわゆる表計算ソフトというもののデータの考え方です。



反してAccessなどの「データベースソフト」と呼ばれるものは、レコード単位でデータを考えます。

下の図は、Accessのテーブルをデータシートビューで開いたところです。

一見Excelと同じように見えますけれど、これはセルではありません。それに、本当にこういう状態でレコードが保存されているわけでもないので、「前のレコード」「次のレコード」という考え方は基本的にないのです。主キー、インデックスといった指定がなされていれば、それに基づいてレコードは整列しますが、開いてないときはばらばらです。なので、「4行目」といっても、必ずしも2月12日の山田さんのデータが出てくるというわけではないのです。

合計、平均といった値を、一つのフィールドとして持たせる考え方も、テーブルにはありません。ここで[平均]、[合計]といったフィールドをテーブルの中に固定で持ってしまうと、途中で[データA]の値が書き換わったときどうなるでしょう。

そこで、テーブルではなくて、クエリーで計算させます。「わたしはクエリーは使わない、VBAでいつもやってる」という方はそれでも結構。アゲアシですね。それは。でも、クエリー使わないでなんでAccessなの?って、わたしは思いますけども。

こんな感じで、テーブルを元にしたクエリーを作ります。クエリーの中で計算式作れますよね。やり方は「Access97超入門部屋」でご紹介してますのでそちらも見ていただけるとありがたいです。

で、これ開くとこうなります。これなら、データA,B,Cの値が書き換わってもすぐに再計算して結果を得ることができるわけです。端数の処理をしてないので下の図ではえらい数になってますけどね。こういうのはだいたい、「書式プロパティ」で調節しますから、ここではこれでいいんですよ。

で、じゃあ、縦の集計も・・・と思っても、ひとつのクエリーでは無理です。あくまでもレコード単位でデータを考えますからね。ひとつのクエリー、ひとつのテーブルの中で、明細行と集計行が混在することなどありえないのです。
そこで、お薦めなのはレポートを活用した方法ですね。

上のクエリーを元に下のようなレポートを作っておけば、このレポートを出力するときに縦計算をして集計してくれます。ページヘッダーではSum関数は使えないので、レポートフッターを利用します。なんでページフッターが使えないかって?だって、レポート開くまで、1ページに何レコード印刷できるかわからないじゃないですか。ページフッターを開くときにはまだ、Sum関数で結果を得られないんですよ。



と、ここまで考えてみて、Accessってすごく不便で、Excelの方が使いやすそうだな・・・と思った方は、Excelを使っていればよいと思います。
なんかよくわからないですけど、Excelの上級編がAccess、と思ってる人がいるみたいですよね。絶対違いますからね。
誰がそんなこといってるんでしょう。いい迷惑ですよ。ほんと。

形態のあわない処理を無理やりAccessでやる必要はありません。
Excelでの処理の方がイメージしやすいなら、作りやすいソフトを使って作ればいいはずです。



はっきり言って、Excelは表計算ソフトであって、データベースではありません。
データベースっぽく使えば、それなりに集計したり並べ替えしたりする能力は持ってますけどね。
でも、ファイル単位で保存・呼び出しし、ひとつの列に数値や文字やNullが混在できてしまうなんて、何の整合性も取れなくなります。

データベースとは、データを手軽にいじれることではなくて、安全に正しく保存しなくてはなりません。
Accessを利用するということは、一時的な手軽さを追及することではないのです。

それでも、手軽に罫線を引いたり、好きなところに平均値や合計値を印刷したり、一行あけて見栄えをよくしたり、ということに重点をおきたいなら、Excelの方が絶対便利です。というか、Accessにはそんな考え方ありません。その点だけ掲げて「Accessは不便だ」などと言ってしまうのは、少々無理があるのではないかなぁと思うんです。

どっちもパソコンソフトなんですから、決まった使い方をするのではなくて、道具としてうまく利用していくべきでしょう。両方をうまく比較し、仕事によって使い分けていってくださいね。「おなじことに使う」のはよいですが「おなじように使う」のは間違い、だと、わたしは思うのです。