あのブック、どこにあったっけ・・・

仕事でよくあるのが、「この前見た資料、どこに置いてあったっけ・・・」とか「どこに保存したっけ?」という状況です。

「最近使ったアイテム」に残っておらず、ファイルサーバーだったか、自分のPCだったか、ダウンロードした奴だったか、というのも覚えておらず、作った人も分からず、手帳にメモも書いておらず、当時聞いた人に「前に言いましたよね?」なんて言葉も聞きたくない。

でも探さないといけない。時間がない。探す時間が無駄すぎる。つらい。うーん、分かります。その状況はイヤです。

VBAで解決しましょう。

Excelのブックを開いた履歴は50個まで

Excelでブックを開く場合に、「最近使ったアイテム」の一覧から、過去に開いたブックを探して開くことが出来ます。便利な機能ですが、初期設定では50個までしか履歴管理されません。数を増やすにしても無限ではありません。

また、「最近使ったアイテム」の一覧に表示されるのは「開いたブック」が対象となりますが、あとから自分が保存したブックを特定したいときには使えません。

そこで、以下では、開いたブックの履歴と、保存したブックの履歴をテキストファイルに出力する方法を紹介します。

コードを書く場所と処理の説明

以下のコードはPERSONAL.XLSBのThisWorkbookに書いてください。ThisWorkbookに何も書いてないのであれば、まるごとコピペでOKです。このマクロはExcel起動時に存在していないと動作しないため、ThisWorkbookに書いて保存したら一度Excelのブックを全て閉じてください。これは最初の1度だけです。それ以降は次にブックを開いたときからPERSONAL.XLSBに書いたコードが動作します。

ブックを開いたり、保存したりすると、「Excelのオプション→保存→既定のローカルファイルの保存場所」で設定されているフォルダ(通常は「ドキュメント」フォルダ)に「Excel-History.txt」というファイルを作成し、日時、開いた(Open)もしくは保存(Save)、ブックパス、を書き込みます。

Excel-History.txtにはこんな感じで書き込まれます。

日時(yyyy/mm/dd hh:mm:ss)と、開いたor保存の[Open]または[Save]、そして、そのブックのフルパスが書き込まれます。ブックがファイルサーバなど\\で始まるパスにある場合でも問題ありません。

なお、Openステートメントを使っているためShift-JISで書き込まれており、テキストエディタでUTF-8で開いたりすると文字化けを起こします。

Excel-History.txtには単純に追加書き込みをしているだけのため、ブックを開いたり保存したりする度に書き込まれていきます。ただ、それだとファイルサイズが増え続けるため、100,000バイト(約100KB)を超えたらExcel-History.txtのファイル名に日時を付与してバックアップ(ファイル名変更)するようにしています。

100KBは、1日にブックを開いたり保存したりを100回行ったとすると、大体ですが半月ぐらいで達するぐらいの分量です。1年掛かってもバックアップファイル含めて2MB行かないぐらいですので、完全放置でも容量不足の問題はまず起きないでしょう。

コード

コード説明

このコードでは少し特殊なことを行っています。それはWithEvents修飾子です。WithEvents修飾子を使って変数を定義すると、型として指定したオブジェクトのイベントを検知できるようにしています。ここでは「Application」を指定しているためExcel自体を指すことになります。

通常、VBAでは他のブックのイベントを検知することは出来ません。例えばa.xlsxでセルの値が変わったことを検知するChangeイベントはa.xlsxで取得するのが普通です。

Excelは起動時に「C:\Users\[ユーザ名]\AppData\Roaming\Microsoft\Excel\XLSTART」」フォルダにあるブックを開きます。PERSONAL.XLSBもこのフォルダに配置されるため、個人用マクロブックとしてExcel起動時に開かれます。

XLSTARTフォルダに他のブックを意図的に置かない限り、PERSONAL.XLSBは唯一のExcel起動時に開かれるブックのため、PERSONAL.XLSBにWithEvents修飾子を使ってExcelのイベントを検知できるようにすることで他のブックの挙動を検知できる仕組みを用意しています。