先日の問題 の問1の回答

------------------------------------

問1 ブックの開き方/閉じ方

1. 印刷対象のブックを印刷前にすべて開く。印刷がすべて終了したときにすべて閉じる。

2. 印刷対象のブックを印刷直前に開き、印刷後に閉じる。これをブック数回繰り返す。

3. 印刷対象のブックを印刷直前に開き、印刷後は開いたままにする。印刷がすべて終了したときにすべて閉じる。

------------------------------------

 

考慮すべきことは何だろう?

一般ユーザーであれば、「確実に印刷されること」が重要だろう。その次に「速いこと」かと。

 

1997年か1998年のことだ。COBOLのプログラムのコンパイルリストを印刷するのではなくデータとして大型汎用機からダウンロードし、2000年問題で影響しそうなところをピックアップするための処理をVBAで作成した。

定義とその利用箇所をVBAで関連付けし、年月日に関するところを抜き出し、その中でも桁数の足りないところを色付けして影響調査をプリントアウトする処理だった。本数は800本くらいだったか。

 

その時、最初に行ったやり方が 上記の3. であった。しかし、夜10時ごろ、実行してすぐ帰ったのだが、翌朝10時で終わっていなかったのだ。

検証したところ、10ブック目を開いたあたりから急激に速度が落ちていたのだ。

そこで、上記2.の措置を取ったところ、問題は解消された。

 

つまり、正解は 2.となる。

1.はおそらく、全部OPENするまでに相当な時間を要するか、途中でエラーになるだろう。

 

PCのリソースは有限であること。不必要なメモリは解放してやること、が大量の処理が行われる場合には必要である。

先日、gmailを今一つと書いたが(http://ameblo.jp/tech-note/entry-12210404841.html)、おそらくはメーラーを使うのがいけないのかと思う。

 

そもそもpop3とimap4とで、同じように考えてはいけないのではないか。

 

pop3はローカルにメールを取り込むもの。基本はサーバーから削除する。一通一通がそれこそ「手紙」のイメージだろうか。振り分けるにしても、その振り分け先にある、という状態になるメーラーがほとんどだし、それに慣れているから違和感は感じなかった。

 

imap4はサーバーにメールを置くもの。gmailを使うまではこのプロトコルを使ったことはなかったので、正しい説明になっているかわからないが、メーラーが追いついていない、という気がしている。

 

裏を返せばgmailは「サーバー上にある」というメリットを最大限に活かしているようにも思う。

・googleだからからだろう、メールの振り分け、というよりは必要に応じて検索を使えば事足りる。

・もちろん振り分けもできるが、タグ(複数つけられる)先にどこでも振り分け可能。ただ、物理的に分けているのではないので、例えばメールを削除するとどの振り分け先からも削除される。

・処理が終わったメールはアーカイブに突っ込めばよし。アーカイブ後も検索はできる。

 

他のメールサービスではそこまでは難しいのではないか。

 

たまには趣向を変えて、問題なんぞ作ってみました。

 

問題

 

大量のExcel(ブック数は2,000程度、各ブックのシート数は1~5枚程度、1ブックのものをすべて印刷しても10ページ程度、すべてのシートを印刷、印刷レイアウトは調整済み)を開いて印刷する、というVBAの処理を作成する場合、次のうち適切なものに近い設計はどれか

ただし、記載されていない条件はすべて平等であるものとする。また、実行するExcel VBAのブックは印刷ではない。ブックのリストはすでにあり、実行に問題はないものとする。

 

問1 ブックの開き方/閉じ方

 1. 印刷対象のブックを印刷前にすべて開く。印刷がすべて終了したときにすべて閉じる。

 2. 印刷対象のブックを印刷直前に開き、印刷後に閉じる。これをブック数回繰り返す。

 3. 印刷対象のブックを印刷直前に開き、印刷後は開いたままにする。印刷がすべて終了したときにすべて閉じる。

 

問2 印刷のタイミング

 1. 印刷対象のブックを選択したらシート毎に順次印刷を行う。印刷処理が終わったらすぐに、次のブックを選択する。

 2. 印刷対象のブックを選択したらそのブックのシートをすべて選択し一度に印刷を行う。印刷処理が終わったらすぐに、次のブックを選択する。

 3. 印刷対象のブックを選択したらシート毎に順次印刷を行う。印刷後に待ち時間を設ける。待ち時間は15秒程度とする。

 

解答はそのうちアップする。