見出し画像

パスが長すぎてファイルの移動ができない時の対応方法(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で長いパスが扱えないと思ったら)

いいなと思ったら応援しよう!