和風スパゲティのレシピ

日本語でコーディングするExcelVBA

フォルダを別のドライブに移動する

フォルダを移動する「Name」「FSO.MoveFolder」の両機能とも、
「Cドライブ⇒Dドライブ」や「ローカル⇒共有サーバー」の移動はできません。

手作業でもドラッグ&ドロップでは移動できませんからね。


これを一発で行う機能は用意されていませんので、

  1. まずはフォルダをコピー
  2. そのあと元のフォルダを削除

という手順で実行する必要があります。


この「フォルダごとコピー」「フォルダごと削除」を実行するには、
FileSystemObject(以下FSO)を使用する必要があります。


FSOについてはこちらを参照ください。
www.limecode.jp

フォルダを別ドライブに移動する

Dim FSO As New FileSystemObject

Dim 元のフォルダパス As String: 元のフォルダパス = "C:~~"
Dim 移動先フォルダパス As String: 移動先フォルダパス = "D:~~"

FSO.CopyFolder 元のフォルダパス, 移動先フォルダパス
FSO.DeleteFolder 元のフォルダパス

非常に単純なコードなので解説は不要ですね。


本当にストレートに

  1. まずはフォルダごとコピー
  2. そのあと元のフォルダを削除

を実行しただけです。


DeleteFolderは取り返しのつかない処理ですので、
しっかり変数に入れてパスの変え忘れに備えておきましょう。

CopyFolderの引数を変えてDeleteFolderの引数を変え忘れると悲劇が起きます。

実際はバックアップフォルダへの移動がおすすめ

上記のコードでちょっと怖いのが、
移動先のフォルダが共有サーバーなどネットワーク上にある場合に、
コピーの完了を待たずに削除される可能性が絶対ないとは言えないところです。


共有サーバーなどの仕様にもよりますが、

Workbooks.Open "~~~"
ブックへの処理

こんなコードで「ブックを開き終わる前に処理が始まってエラー」なんてことがたまにありますからね・・・

FSO.CopyFolder 元のフォルダパス, 移動先フォルダパス
DoEvents
DoEvents
DoEvents
DoEvents
DoEvents
DoEvents
FSO.DeleteFolder 元のフォルダパス

こういういつものおまじない対策をしてもいいのですが、
結局怖いことに変わりはありません。


ということで次善策として、
「いったん別のフォルダに移し、削除は手作業で行う」というのも手です。

Dim 元のフォルダ As Folder: Set 元のフォルダ = FSO.GetFolder("C:~~")

元のフォルダ.Copy "D:~~"
元のフォルダ.Move 元のフォルダ.ParentFolder.Path _
    & "\バックアップ\" & Format(Date, "yyyymmdd")

 
このコードを実行すると、一見フォルダが消えたように見えて、
元フォルダの親フォルダ内の「バックアップ」フォルダに日付名で移動します。

こんな風に普段は残しておき万が一に備え、
1ヶ月くらいで中身を削除すると安全そうですよね。


DeleteFolderメソッドはゴミ箱ではなく完全に削除するメソッドのため、
実行するのはちょっと勇気がいります。

気を付けて使っていきましょう。