none
Excel2016でzipファイルに移動したはずのファイルが消失する RRS feed

  • 質問

  • 初めて質問させていただきます。

    Excel2016、windows7環境で、

    ExcelVBAから生成したCSVファイルを、zipファイルに圧縮したいと考えています。

    下記のコードを実行して、空のzipファイルにCSVファイルを移動する際に、

    処理自体は正常に終了しているにも関わらず、zipファイルへの移動ができておらず、

    移動元および移動先のどちらにも該当のCSVファイルが存在せず消失してしまうケースがあります。

    private sub makeZipFile()

    Dim fileName As String 'ファイル名 Dim fileSystemObject As Object 'ファイルシステムオブジェト Dim shellObject As Object 'shell用オブジェクト Dim fileObject As Object 'ファイル名格納用オブジェクト Dim destFilePath As String '出力zipファイルの絶対パス Dim moveCnt As Long '移動完了ファイル数 Dim zipPath As String '移動元フォルダ zipPath = "D:\test" destFilePath = zipPath & "\" & "zip_" & Format(Now, "yyyymmdd") & "_" & Format(Now, "HHMMSS") & ".zip" 'オブジェクト取得 Set fileSystemObject = CreateObject("Scripting.FileSystemObject") Set shellObject = CreateObject("Shell.Application") '空のZIPファイル作成 With fileSystemObject.CreateTextFile(destFilePath, True) .Write "PK" & Chr(5) & Chr(6) & String(18, 0) .Close End With 'オブジェクト取得 Set fileObject = shellObject.Namespace(fileSystemObject.GetAbsolutePathName(destFilePath)) 'ファイル名取得 fileName = Dir(zipPath & "\*.csv") '初期化 moveCnt = 1 'ファイルの数だけ繰り返す※サブフォルダは対象外 Do While fileName <> "" 'zipファイルに移動 fileObject.MoveHere (zipPath & "\" & fileName) '移動が終わるまで待つ Do Until fileObject.Items().Count = moveCnt '0.1秒待つ Application.Wait [Now() + "0:00:00.2"] Loop '次のファイルへ fileName = Dir() moveCnt = moveCnt + 1 Loop 'オブジェクト解放 Set fileObject = Nothing Set shellObject = Nothing Set fileSystemObject = Nothing

    end sub

    また、同じ条件(実行環境、zip対象ファイルなど)に対して実行しているにもかかわらず、

    当事象が発生する時と発生しない時があります。

    もしファイルが消失してしまう原因や対策などをご存知でしたら

    ご教示いただけると幸いです。

    以上です。よろしくお願いします。

    2017年7月3日 3:21

回答

  • こんにちは。

    詳しくコードを追っていませんが、MoveHereメソッドではなくCopyHereメソッドを使えば、少なくとも移動元のファイルが消えることはなくなるのではないかと思います。

    また、提示されたコードのようなShellを使ったZip処理は、下記ページにあるようにサポート対象外となりますので、可能であれば「7-Zip」等の外部のアプリケーションやライブラリを用いた処理に変更されることをお薦めいたします。

    https://support.microsoft.com/ja-jp/help/2679832
    2017年7月3日 8:23

すべての返信

  • こんにちは。

    詳しくコードを追っていませんが、MoveHereメソッドではなくCopyHereメソッドを使えば、少なくとも移動元のファイルが消えることはなくなるのではないかと思います。

    また、提示されたコードのようなShellを使ったZip処理は、下記ページにあるようにサポート対象外となりますので、可能であれば「7-Zip」等の外部のアプリケーションやライブラリを用いた処理に変更されることをお薦めいたします。

    https://support.microsoft.com/ja-jp/help/2679832
    2017年7月3日 8:23
  • 回答ありがとうございます。

    「7-Zip」などを使う方向で検討したいと思います。

    2017年7月6日 2:14