【VBA】ファイル/フォルダをZIP形式で圧縮する

VBAで
 ・ファイル/フォルダをZIP圧縮
できます!
※ここで紹介するのは「パスワード無しZIPファイル」の作成(圧縮)方法です。

VBAから
 ・Power Shellのコマンドレットを実行
することで実現します!
※コマンドレット「Compress-Archive」により実現します。

実行結果も取得できます!
※正常終了の場合、実行結果は「0」になります。
※異常終了の場合、実行結果は「1」になります。

ZIP形式(パスワード付き)で圧縮するすることも
できます!
詳細は以下の記事をご確認ください!


PR

はじめに

他のサイトでは
 ・「CopyHere」メソッドなるもので圧縮する方法
が紹介されていたりしますが、こちらは動作保証されていません
※公式サイトに動作保証していない旨が記載されています。

動作保証されていない方法を採用するのは、やめておいた方がよいです。

PR

VBAコード

ここでは例として
 ・デスクトップ配下の約1GBのフォルダ「test」を圧縮
 ・デスクトップ配下にファイル「test.zip」として作成
します。

フォルダ「test」
フォルダ「test」
フォルダ「test」のサイズは約1GB
フォルダ「test」のサイズは約1GB

※圧縮対象は「フォルダ」でなく「ファイル」でも大丈夫です。

Option Explicit

Sub execPsCommand()
    
    Dim targetPath As String
    Dim zipFilePath As String
    Dim psCommand As String
    Dim wsh As Object
    Dim result As Integer
    
    'ZIP形式で圧縮するフォルダ(またはファイル)パスを指定
    targetPath = "C:\Users\user\Desktop\test"
    
    '作成するZIPファイルのパスを指定
    zipFilePath = "C:\Users\user\Desktop\test.zip"
    
    '実行するPowerShellのコマンドレットを組み立て
    psCommand = "powershell -NoProfile -ExecutionPolicy Unrestricted Compress-Archive -Path " & targetPath & " -DestinationPath " & zipFilePath & " -Force"
    
    Set wsh = CreateObject("WScript.Shell")
    
    'PowerShellのコマンドレットを実行
    result = wsh.Run(command:=psCommand, WindowStyle:=0, WaitOnReturn:=True)
    
    If (result = 0) Then
        MsgBox ("圧縮が正常終了しました。")
    Else
        MsgBox ("圧縮が異常終了しました。")
    End If
    
    '後片付け
    Set wsh = Nothing
    
End Sub

「ZIP形式で圧縮するフォルダパス(またはファイルパス)」を指定します(12行目)。
「作成するZIPファイルのパス」を指定します(15行目)。

実行するPower Shellのコマンドレットを組み立てます(18行目)。
※実行するPower Shellのコマンドレット「Compress-Archive」を組み立てます
※オプション「-Force」により、作成するZIPファイルが既に存在する場合は上書きします。

フォルダを圧縮します(24行目)。
※Power Shellのコマンドレット「Compress-Archive」を実行します。
※「フォルダ」でなく「ファイル」でも圧縮できます。

Run」メソッドの引数「WindowStyle」に「0」を指定することで、PowerShell画面を表示にできます(24行目)。
※「1(規定値)」を指定すると表示になります。

Run」メソッドの引数「WaitOnReturn」に「True」を指定することで、同期実行になります(24行目)。
※「False(規定値)」を指定すると同期実行になります。

ここでいう「同期実行」とは、
 ・PowerShellのコマンドレットの処理完了後にVBAへ制御が返ってくるように実行
という意味です。
※PowerShellのコマンドレットの処理が完了するまでは、VBAの処理は停止して先に進みません。

PowerShellのコマンドレットが正常終了した場合、「戻り値(実行結果)」として「0」が返されます(26~29行目)。
※異常終了の場合は「1」が返されます。

PR

実行結果

フォルダをZIP形式で圧縮できました。
※「フォルダ」でなく「ファイル」でも圧縮できます。

実行結果①
実行結果①
実行結果②
実行結果②


サイズが圧縮されていることも確認できました。
※「約1GB」から「約0.2GB(=約200MB)」へ圧縮されました。

実行結果③
実行結果③
PR

参考①

ZIP形式のファイルを解凍(展開)することもできます。

詳細は以下の記事をご確認ください。

PR

参考②

圧縮する前に、圧縮するファイル/フォルダの存在確認をしたほうがよいです。

ファイル/フォルダの存在確認の詳細は、以下の記事をご確認ください。

PR

参考③

上記で使用した以下の詳細は、公式サイトをご確認ください。

●Power Shellのコマンドレット「Compress-Archive」