今でこそExcelマクロ(VBA)でいろいろなツールを作っておりますが、やり始めたのは、派遣先で行っている作業が、まぁ面倒なExcel作業が多かったので、これなんとかならんのかと思ったのがきっかけです。
元々プログラミングの知識は初心者レベルですが持っていたので、指南本を買ったのと、自動記録で書かれたコマンドを参考にしておりました。
色々作っているうち、困ったことが起きてきます。
派遣先では「PCローカルにデータを保存してはいけない」というルールがあり、作成したデータはファイルサーバに置く必要がありました。すると何かしらの作業でファイルを指定する際には、絶対パスがどうしても長くなってしまいます。
\\サーバ名\共通フォルダ名\部門の親フォルダ\グループの親フォルダ\作業別の親フォルダ\案件名フォルダ\作業内容フォルダ\~~~~.xlsx
なんて具合。ファイル名も日付や条件を含めるとどうしても長くなりがちでした。
当時初心者のマクロプログラマは、ファイルまでのパスを文字変数で扱っていたのですが、『256文字を超えるフォルダパスは処理できない』という問題に、何度もぶち当たってしまいます。
何とかならんのかと色々調べていたら見つけたFSO(FileSytemObject)というモノ。
最初は、ただ単に「目的のExcelデータのパスが長くてもFSO使えば処理できる!」くらいで大喜びしていたのですが、更に調べていると、いろんな発見がありました(←大げさ)。
まずは、『VBAはExcel作業のためだけではない』ということに気付けたこと。
そんなん当たり前やろと怒られそうですが、いやいやExcelの作業だけに使えると思っている方、多いと思います(実際、「そんな使い方できるの??」と言われます)。
例えば、FSO.GetFolder で対象フォルダを指定して、そのフォルダを For Each ~~ In 対象フォルダ.Files でフォルダ配下のファイル名をすべて抽出して、書きだすと、ファイルリストを作成できます。抽出したあとで If File.Name Like “.pdf” みたいにすると、PDFだけのファイルリストが作成きますし、GetFolderをGetSubFoldersと合わせて再帰化すれば、子フォルダまで検索できます。
このファイルリストマクロは、特定のフォルダ配下の、ある命名規則で付けられた複数のファイルに対してマクロを実行させる際に、前段階として対象リストを作るのに発展しました。ひとつひとつファイルを指定するのではなく、まず対象のファイルリストを作り、そのあとでリストすべてにマクロを実行することで、一気に効率化が進みました。
次に地味に便利なマクロとして、ファイル操作ができること。
Nameステートメントでファイル名が変更できますが、先に紹介したファイルリストマクロと組み合わせて、ファイルリストをExcel上に作成させ、Excelに抽出したファイル名と変更後のファイル名を対にしてリスト化してから一気にNameでファイル名を変更させると、これも効率化が爆発します。
例えば、ファイル名の冒頭に数字を順番に付けたいとかであれば、Excelですから連番を作るのは簡単ですので、元のファイル名と&やconcatで連番と繋いだセルを作って変更後ファイル名に指定するとあっさり変更できます。
エクスプローラで対象ファイルを選択して、右クリックなどでファイル名変更の選択をして変更後のファイル名を入力しEnter、次のファイルを選択して…と、ちまちま作業をしていた頃が懐かしく思われます(笑
CreateFolder では、その名の通りフォルダ作成ができます。
ひとつのフォルダを作るだけでは、わざわざマクロの力を借りる必要はないでしょうが、複数のフォルダを作る場合、Excel上に作成するフォルダ名のリストを作っておいて、一気にマクロでフォルダ作成させると、これも効率化が爆発します。
ファイル名の変更で紹介したように、連番を付けたり、すでにあるファイルと同名のフォルダを一気に作る場合など、エクスプローラで新規作成を選択してフォルダを選択してフォルダ名を入れて…と、ちまちま作業をしていた頃が(以下省略)
と、このように256文字問題だけでなく、Excel作業とは直接関係のないファイル操作においても。FSOを持ちいることで作業がぐーーーーんと効率化できるってこと、分かって欲しいです。