エクセルでファイル一覧を作成.��8(インデント)最終更新日:2014-11-11エクセルでファイル一覧を作成.��8(インデント)エクセルでファイル一覧を作成します、サブフォルダ以下も全て取得し、一覧表示します、さて、前回の再帰処理で、サブフォルダも以下も全て取得できましたので、後は、体裁を整えるだけになりました。今回は、サブフォルダ毎に、列をずらして(インデントして)、見やすくします。以下が修正後のプログラムです。Sub太字が修正部分です。'最終列の保存パブリック変数として、開始行、開始列を持ちます。シートモジュールのボタンクリックでも使用できるように。処理中の最終列をどのモジュールからも参照できるようにします。Rows(Cells.SpecialCells(xlCellTypeLastCell).Row)).Clear開始行から、エクセルが保持している最終セルの行までを、一括でクリアしています。strDir退避してある指定フォルダをセルに戻します。cnsCol開始行(指定フォルダの位置)の次からを、表示開始行として、変数に入れます。開始列を変数に入れます。ColMaxは最終列なので、開始時は、開始列を入れておきます。j)モジュールの引数に、列が増えているので追加しています。Long)列を引数に追加します。この引数は、ByValである事に注意して下さい。元のCall元に変数の変化を戻しません。If最終列が増える場合は、サイズ、更新日時の列を後ろにずらします。objFolderSub.Nameフォルダ名を最終列にいれます。1)再帰呼び出しで、現在列を1加算します。ByValなので、戻ってきても値は変化しません。.Nameファィル名を最終列にいれます。.DateLastModifiedサイズ、更新日時を、最終列の隣に入れます。3列幅を全て3に統一します。2)).EntireColumn.AutoFit最終列と、サイズ、更新日時の列をオートフィットで列幅調整します。最終列は、ファィル名が全て見えるようにする為です。これでも、手前の階層で長いファイル名は途中で見えなくなってしまいます。ロジックで、これを全て表示するのは大変なので、適当に列幅を指定するのが良いと思います。列の変数jは、実際には、値を加算していませんので、ByRefでも動作に問題はありません。ByValと宣言することで、プログラムを理解し易くしています。これで、サブフォルダ毎にインデントされ、見易くなりました。列の追加削除がある場合は、ボタンが移動しないようにしておく必要があります。デザインモードで、ボタンを選択し、「コントロールの書式」→「プロパティ」ここで、「セルに合わせて移動やサイズ変更をしない」にチェックを付けます。印刷時に邪魔な場合は、「オブジェクトを印刷しない」にもチェックして下さい。今回は、技術的には何も新しい事はありませんでした。問題は、列のインデントの実現を、いかに簡単に行うかでしょう。1」としている所がポイントでしょう。省略時のByRefについてそもそもVBAでは、省略時が、ByRefと言うのは解せない。VB.NETでは、記述を省略すると、ByValが自動で付加されます。本来は、そうあるべきだと思うのですが、何故ByRefにしているのでしょうかね。昔の負の遺産といったところなんでしょう。値を元に戻す事は、プログラマーが意識して記述する必要があるはずです。無意識に値が戻っていると言うのは、非常に危険なのですが。VBAをやり初めて、ある程度出来るようになってきた時に、必ず戸惑う事になるのではないかと危惧します。いって、初めてVBAをやる人に、ByValを指定するように説明するのは大変です。作成済の過去のプログラムもあるので、省略時は、ByRefのままにしておき、新規作成時に、自動でByValを付加してくれれば良いのではないかと思うのですが。VBAでは、ずっとこのままでしょうね。エクセルでファイル一覧を作成.��8(インデント)このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。