見出し画像

VBAのファイル操作、パスの長さでドツボにはまる

今回のはタイトルがすべて。
ただの愚痴と記録なので、技術的な学びありません。

ことの発端は、ちょっと前に記事にしたファイル名のリネームツールのユーザからの依頼でした。
毎月発生する特定のファイルをリネームして保管する作業が無駄なので自動化したいとのこと。

社内システムから吐き出されるファイルが
第一階層:処理のおおまかな種別3種類
第二階層:処理の種別+日付+システム登録No.
これらのフォルダ下に、任意の名前のファイルが出てくるので、
そのファイル名をルールに沿ってリネームするというもの。

フォルダ名の情報を使ってファイル名をつけてあげるだけの簡単なお仕事だったですが、どうしても処理されないファイルが残る。
対象のファイルを調べていくとどうやら、フルパスが200文字を超えているので、その辺が原因ということにたどりつきました。

FSO,VBA、パス、長さみたいなキーワードで検索すると、ファイル、フォルダオブジェクトはどうやらショートパスという短縮されたパス情報を持っているようなので、それを使うのが正解のようです。

しかし、私が書いた再帰処理はパス名ではなく、サブフォルダオブジェクトを渡すように書いちゃったので、書き直すのが面倒。
動作自体は完成しちゃってるので不要な書き直しはしたくないなと。

結論、事前にフォルダ名を短く変更して対策というしょーもないオチ。

    Set fso = New FileSystemObject

    '特定の文字列を含んでいたら'
    If InStr(fso.GetFolder(objPATH).Name, "とてつもなく長ったらしいフォルダ名1") > 0 Then
        '空白に置換して、フォルダ名を短縮'
        fso.GetFolder(objPATH).Name = Replace(fso.GetFolder(objPATH).Name, "とてつもなく長ったらしいフォルダ名1", "")
    ElseIf InStr(fso.GetFolder(objPATH).Name, "とてつもなく長ったらしいフォルダ名2") > 0 Then
        fso.GetFolder(objPATH).Name = Replace(fso.GetFolder(objPATH).Name, "とてつもなく長ったらしいフォルダ名2, "")
  Endif

こんな感じで、特定の不要な文字列を含んでいたらフォルダ名を短縮するだけの機能追加となりました。めでたしめでたし。

そもそもの原因が、
・第一階層と第二階層のフォルダ名に重複した情報があること。
・和英併記でさらに冗長なフォルダ名になっていること。
このためパス名がやたらと長くなっているのでした。

優しさだとは思うけど、システムから一括で吐き出すログみたいなものよ?
誰得やねん。MECEかつ英語だけの情報にしてくれよ!
と憤りを感じつつ、トラブル解消したのでした。

この記事が気に入ったらサポートをしてみませんか?