パスが長すぎてファイルの移動ができない時の対応方法(Excel マクロ(VBA) )
問題点
ファイルサーバに置いてあるファイルを、Excel マクロ(VBA) で「フォルダA」から「フォルダB」に移動したいが、フォルダAのパス名が長すぎてファイルの移動ができない、という相談を受けました。なお、利用できる手段は Excel マクロ(VBA) のみです。※windowsでは通常の状態でフルパス名が260文字を超えると、ファイル操作を行うことができなくなります。
以下の方法で対応ができました。
前提条件
【移動元フォルダ(フォルダA)】
\\fileserver\shared\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ddddddddddddddddddddddddddddddddddddddddddd\
【移動先フォルダ(フォルダB)】
\\fileserver\shared\target\
【移動対象ファイル】
test.csv
【制約】
・情報システム部門に管理されている職場のPC、共有のファイルサーバなので、フォルダ名を変更することができないし、GPOを変更することもできない。
対応方法
①260文字制限にひっかからないフォルダ(今回の例では1つ上の「ccc…」フォルダ)に、ダミーファイル(dummy.csv(ファイル名も中身も何でもいいです))とエクセルファイル(.xlsm)を作成し、以下のvbaを実行して、フォルダAのショートパスを確認する。
Sub getshortpath()
Dim FSO As Object, Target As String
Target = ThisWorkbook.path & "\dummy.csv" 'ここでダミーファイルを指定しないとエラーになる
Set FSO = CreateObject("Scripting.FileSystemObject")
MsgBox FSO.GetFile(Target).ShortPath
Set FSO = Nothing
End Sub
これを実行すると、msgboxにショートパス「\\fileserver\shared\AAAAAA~1\BBBBBB~1\CCCCCC~1\dummy.csv」が表示されるので、メモをしておきます。
②任意の場所にエクセルファイル(.xlsm)を作成し、ファイル移動のコード中、①のフォルダまでのパスを先ほどメモしたショートパスで記載して実行すると、ファイルの移動ができます。
Sub copy()
Dim FSO As Object
Set FSO = CreateObject("scripting.filesystemobject")
fso.GetFile("\\fileserver\shared\AAAAAA~1\BBBBBB~1\CCCCCC~1\ddddddddddddddddddddddddddddddddddddddddddd\test.csv").Copy "\\fileserver\shared\target\"
Set FSO = Nothing
End Sub
ちなみに、同じコードを以下のようにフルパスを記載して実行すると、エラー(実行時エラー'53':ファイルが見つかりません)となり失敗します。
Sub copy()
Dim FSO As Object
Set FSO = CreateObject("scripting.filesystemobject")
fso.GetFile("\\fileserver\shared\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\ddddddddddddddddddddddddddddddddddddddddddd\
test.csv").Copy "\\fileserver\shared\target\"
Set FSO = Nothing
End Sub
備考
※FSO(FileSystemObject)を利用すると、簡単にフォルダやファイルの操作ができます。初めてFSOを使用する場合は、「Microsoft Scripting Runtime」の参照設定をする必要があります。設定の仕方は、以下のサイトが参考になります(簡単です)。
Valmore (【Excel VBA入門】FileSystemObjectを使ったファイル操作の基本を解説 > Microsoft Scripting Runtimeの参照設定を利用する)
Tipsfound (VBA FileSystemObject ファイル操作の基礎 > FileSystemObject を使用する)
※ショートパスとは?:WindowsOSではファイルやフォルダを作成すると、長いファイル・フォルダ名だけではなく、短いファイル・フォルダ名(8.3形式)も同時に作成します。長いファイル名と短いファイル名は、同じように使うことができます。
参照したサイト
Office TANAKA (Fileオブジェクト - ShortPathプロパティ)
Office TANAKA (Fileオブジェクト - Copyメソッド)
knjnameのブログ (VBAで長いパスが扱えないと思ったら)