和風スパゲティのレシピ

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

ブックを開いたまま移動/名前を変更する

ブックを開いたまま移動したり、名前を変更する方法を解説します。

と言ってもこれをストレートに実行する方法はありませんので、

  1. 対象のブックを名前を付けて保存(SaveAs)
  2. 元のブックを削除

という手順で実行することになります。


※ もちろん「対象ブックを閉じる→移動→開き直す」でも実行可能ですが、
例えばマクロ実行ブック自身を実行中に移動する場合など
「開いたままにする必要がある」前提で解説します。

基本コード

Sub 開いているブックを移動または名称変更する()
    
    Dim wb移動ファイル As Workbook
    Set wb移動ファイル = ThisWorkbook
    
    ' ブックが読取専用の場合は実行しない
    If wb移動ファイル.ReadOnly Then Exit Sub

    ' 元のファイルパスを記憶
    Dim 移動前のファイルパス As String
    移動前のファイルパス = ThisWorkbook.FullName
    
    ' 移動先のフォルダパスや名称変更後のファイル名の設定
    Dim path移動先フォルダ As String
    path移動先フォルダ = wb移動ファイル.Path & "\完了"
    
    Dim 新規ファイル名 As String
    新規ファイル名 = "【済】" & wb移動ファイル.Name
    
    ' 名前を付けて保存
    wb移動ファイル.SaveAs path移動先フォルダ & "\" & 新規ファイル名
    
    ' 元のファイルを削除
    Kill 移動前のファイルパス
    
End Sub

解説

ブックを開いたまま移動、名称変更を行いたい場合は、
一旦「名前を付けて保存」し完了後に元のファイルを削除する手順を踏みます。

名称と移動はほとんど同じ手順になるため、特にコードを変更する必要はありません。


メインコードは上記の通り簡単なコードで実行できますが、
Kill ステートメントは万一誤作動すると危険なメソッドであるため、
以下の注意点を一読してから使用して下さい。

先に保存をしておく

まずは概論的な話になりますが、こういったやや無理矢理な実装では、
どうしても処理に失敗してファイルが増えるケースを0にできません。

もしそうなっても混乱を招きづらくしておくために、

wb移動ファイル.Save

で上書き保存をしてから実行すれば、
最悪複数のファイルができても同じファイルにはなってくれます。

特に問題がなければ、この処理ははさんでおきましょう。

KillステートメントはUnicode文字非対応

ファイルを削除する場合はKillステートメントを用いるのが簡単ですが、
KillステートメントはUnicode文字(環境依存文字)に対応していません。

よくある丸数字も㉑以降はUnicode文字のためエラーになります。


Unicode文字に対応が必要な場合は、
FileSystemObjectのDeleteFileメソッドを使用してください。

Kill 移動前のファイルパス
' ↓書き替え
Dim FSO As New FileSystemObject
FSO.DeleteFile 移動前のファイルパス

詳しくはこちらをどうぞ。

「名前を付けて保存」が失敗する可能性

名前を付けて保存するSaveAsメソッドは、

  • 保存先のフォルダが存在しない
  • ファイル名・フォルダ名に禁則文字が混じっている
  • 同名ファイルが存在し、上書きを拒否された

などによってエラーが起きる可能性があります。


この時、On Error Resume Nextなどでエラーをスキップしていると、
最悪「名前を付けて保存が失敗しているのに削除だけ実行」される可能性もあります。


もちろん今回は該当ファイルは開いているため、
その場合Killステートメントも一緒に失敗してはくれます。

が、何かの巡りあわせでKillできてしまう(ファイルを閉じてしまう)こともあり得ます。


取り返しのつかないステートメントですし、扱いには十分注意しましょう。


保存先フォルダの存在や、同名ファイルのチェックなど、
SaveAsメソッドのエラー回避はできる限りやっておくのをおすすめします。

元のファイルの書き込み権限がない

元のファイルを誰かが開いているなどの状況では、

Kill 移動前のファイルパス

このコードは以下のエラーとなります。

実行時エラー '70':
書き込みできません。


こうなると「移動先ファイルを作ったのに削除に失敗」するため、
ファイルが複製されてしまい混乱のもととなります。


これを回避するための策として、
まずは対象ブックが読取専用なら本処理は実行しないようにしましょう。

If wb移動ファイル.ReadOnly Then Exit Sub

これだけでもこのエラーの大部分を回避できます。

Kill/DeleteFileのワイルドカード問題

今回の処理に直接は関係ないのですが、
Killステートメントには「ワイルドカードを用いた一括削除」機能があります。

' フォルダ内のファイルをすべて削除
Kill フォルダパス & "\*"

 
今回は

' 元のファイルパスを記憶
Dim 移動前のファイルパス As String
移動前のファイルパス = ThisWorkbook.FullName

このように「ブックのフルパスを直接取得」しており、
ブック名・フォルダ名に「*」や「?」は使用できないため、
この仕様で用いる場合はそこまで気にすることはありません。


しかし、もしこれ以上に複雑な処理を書いており、
この問題を回避する必要がある場合は以下の記事をご参考ください。
[準備中]