いっきに作成9 > いっきに作成9 制作秘話
*********************************************************************************************** いっきに作成9 制作秘話 Copyright(C) 2017 by しげるがもげる *********************************************************************************************** ◆はじめに このドキュメントには、制作に関わっての作者の思いや苦労が書いてあります。 技術的な細かいことに興味のない方は、読み飛ばしてください。 エクセルでマクロを組んでみようかなと思われる方は、読むと参考になる部分があるかもしれません。 ◆制作秘話 「階層構造を含んだフォルダを作るソフトが欲しい」と思って作ったのが最初です。 その後,仕事で使っているうちに,「なんて便利なんだ!(自画自賛 ^_^;)」と思うようになり,改良を重ねてきました。 当時と違って扱うフォルダの数が多くなってきたことから,フォルダの書き出しで膨大な時間がかかるようになりました。 そこで,必要な部分だけ書き出すようにと,階層に「深さ制限」をつけられるようにしました。 ◆工夫や苦労など <階層構造の書き出し> サブフォルダを全部書き出すために,「再帰呼び出し」という方法を使っています。「サブフォルダを書き出すプロシージャ」が さらに自分自身(プロシージャ)を呼び出すことで,サブフォルダの中のサブフォルダを探し出します。 <一覧表の形> 作成する一覧と,書き出した一覧の形式を同じにしました。 このことで,【フォルダ構造の書き出し】で作った一覧表を整形して,すぐに【新規フォルダの作成】ができるようになりました。
<配列変数を使ってワークシートに書き込む>
処理を高速に進めるために,配列を使うようにしました。
セルに1つ1つ書き込むと時間がかかるため,一度配列に読み込んで,その中で処理をし,あとで配列をいっきにワークシートに書き込みます。
<中断処理>
サブフォルダの数が多いと,処理に時間がかかります。そうなると,中断したい時も出てきます。 そこで,処理中に中断できるようにしました。 Pubulic でブール型変数を宣言し,それをフラッグとして使います。 プロシージャを実行させるたびに,値をNotで反転させ,連続で2回実行したら中断するようにしました。 また,処理中もエクセルで操作ができるよう,DoEvents関数を使って,処理を一時的にOSに渡すようにしました。
<ユーザーが安心できるよう,進捗状況を表示>
処理に長い時間かかっていると,「ハングアップしているのではないか?」と心配になってきます。 ウィンドウをスクロールしてみると,次々に書き込み処理をしていることがわかるのですが,それだけでは心もとないです。
そこで,ステータスバーに,処理がどれくらい進んでいるか表示させるようにしました。 このことで,「けっこうたくさんの数を処理しているんだな。」と安心して見ていられます。
<使用禁止文字のチェック> フォルダ名を付ける時に,使ってはいけない文字があります。 それをチェックして,存在する場合には,エラーメッセージを返すようにしました。 <親フォルダやサブフォルダの作成処理> 初期に作ったものは,存在する親フォルダの中でしか,サブフォルダを作成することができませんでした。 しかし,実際に使っていくと,親フォルダの中に1つサブフォルダを作って,その中に一覧表のフォルダを作りたいことが多々でてきました。 そこで,親フォルダがない時は,親フォルダを新規に作成する仕様にしようと考えました。 親フォルダが存在するかどうか調べるために,Dir関数を使うことにしました。 しかし,やっていくうちに,いくつかの問題点があがってきました。 1つめは,ドライブのルート上に何かファイルかフォルダが存在するときはいいのですが,何も無い時にはエラーになってしまうことです。 2つめは,NAS上で処理をするとき,親フォルダに共有フォルダを指定すると,エラーになってしまうのです。 それで,ファイルシステムオブジェクトも使うことにしました。 これもいろいろやってみましたが,フォルダの有無をきちんと調べる機能が見つかりませんでした。 いろいろな場合分けをして,そのときそのときで判断して処理を分岐させることも考えましたが, ただ,そうするとすごく煩雑になり,あとで見返した時,わかりにくくて仕方がありません。 それで最終的に出した結論は,「取りあえずフォルダの作成をして,エラーが起きた時に対応しよう」ということでした。 On Error Resume Next を使えば,作成に失敗しても処理が次へ進んでいきます。 しかし,作成したフォルダ数をカウントしようと思うと,どうやってカウントしたらいいのやら。 最初は,On Error GoTo 〜 を使って・・・と思っていましたが,実際にやってみるとエラーで止まってしまいました。 となると,処理を続けるには,On Error Resume Next を使うしか方法がありません。 だとしたら,どうやってエラー時の処理をしていくんだ? 調べてみたら,IF文とErr.Numberを組み合わせて判断させる方法が見つかりました。 エラーを起こすと,Errにエラーナンバーが格納されます。何も格納されていなければ,Err.Numberは0なので,それを利用するのです。 こうして,処理した結果と表示とが一致させることができました。 <オプション:階層の深さ制限> あるとき,昨年のフォルダ構造を書き出したら,全部でおよそ6000個ありました。書き出すのに要した時間は約10分。 「末端の細かいところまでは必要なくて,せいぜい3つくらいまであれば事足りるのに・・・。」と思いました。 そこで作ったオプションが,「階層の深さ制限」です。デフォルトの0なら制限なし。あとは入力した数字の深さまで書き出します。 (制限なしとは書いてありますが,実際は100で設定しています。) <空白行や空白列の削除> 最初は,ユーザーに禁止事項として,「空白行や空白列を作らないでください。」としていました。 空白行や空白列があると,そこで処理が終わってしまうからです。 そのことが原因で途中までしかフォルダが作成できてなかったら,その原因となる行を見つけるのに結構な時間がかかります。 そこで,フォルダ作成処理の前に,強制的に空白行や空白列は削除するようにしました。 また,整形するときにも使えると便利なので,単体でも使えるように右クリックのメニューに追加しました。
◆最後に
ここまで、熱心に読んでくださってありがとうございました。
プログラムを組んだことのない方には、わかりにくい内容だと思いますが、これを機会にエクセルの
マクロに興味を持っていただければ、と思っています。
エクセルは、本当に楽しいツールです。自分の思いや考えが表現できます。
そんなエクセルに、日々、感謝です。