【Excel VBA】ファイルをZIP形式で圧縮する方法!複数一括処理も可!

【Excel VBA】ファイルをZIP形式で圧縮する方法!複数一括処理も可!

ファイルをZIP形式で圧縮するしたいときはないでしょうか。

けど、そんな中で悩むことは、

・ファイルをZIP形式で圧縮するしたいが方法がよくわからない
・VBAで複数のファイルを一括でZIP圧縮するしたいが方法がよくわからない

ですよね。

今回はそんなお悩みを解決する

・VBAで複数のファイルをそれぞれZIP形式で圧縮する方法
・VBAで複数のファイルをまとめてZIP形式で圧縮する方法

についてまとめます!

VBAでファイルをZIP形式で圧縮するイメージ

VBAでファイルをZIP形式で圧縮するイメージについて説明をします。

Excel側にPDF保存先パスを入力した一覧を作成します。

VBAを実行すると、複数のファイルがそれぞれZIP形式で圧縮され、指定の箇所に保存されます。

次に複数のファイルをひとつのZIPファイルにまとめます。
以下のように指定し、

VBAを実行するとひとつのZIPファイルとして圧縮され、指定の箇所に保存していきます。

ZIPファイルの中身です。

なにかと多いZIP圧縮が一度に処理できるので便利ですね!

それでは早速試してみましょう。

VBAで複数のファイルをそれぞれZIP形式で圧縮する

VBAで複数のファイルをそれぞれZIP形式で圧縮する方法について説明をします。

PDF保存先リストを準備する

ExcelにPDF保存先パス一覧をA列に、ZIP圧縮先パスとファイル名一覧をB列に入力していきます。

このリストに沿って、ZIPファイルが作成/保存される形となります。

またZIP圧縮対象のファイルを用意しましょう。

VBAコード

サンプルのVBAコードは以下の通りです。

Sub 複数の対象ファイルをそれぞれZIP圧縮する()
    
    Dim strCommand As String
    Dim objWsh As Object
    Dim intEndrow As Integer
    Dim i As Integer
    
    'Wscript.Shellをオブジェクトにセットします。
    Set objWsh = CreateObject("WScript.Shell")

    'マクロ実装ブックの1シート目を対象にします。
    With ThisWorkbook.Worksheets(1)
    
        'PDF出力先リストの最終行を取得します。
        intEndrow = .Cells(Rows.Count, 1).End(xlUp).Row
        
        '3行目から最終行まで処理を繰り返します。
        For i = 3 To intEndrow

           'PowerShellのZIP圧縮コマンドを作成します。
           strCommand = "powershell -NoProfile -ExecutionPolicy Unrestricted Compress-Archive -Path " & .Cells(i, 1).Value & " -DestinationPath " & .Cells(i, 2).Value & " -Force"
           
           'ZIP圧縮コマンドを実行します。
           objWsh.Run Command:=strCommand, WindowStyle:=0, WaitOnReturn:=True
    
        Next i
    
    End With

    MsgBox "ZIP圧縮が完了しました。"

    'オブジェクトを開放します。
    Set objWsh = Nothing
    
End Sub

VBAを設定する

マクロ実装ブックの1シート目を対象にします。シート名を指定したい場合はシート番号「1」をシート名に変更してください。

With ThisWorkbook.Worksheets(1)

PDF出力先リストの最終行を取得します。Excelブック1シート目のA列を対象としていますので、変更する場合は列番号「1」を別の列番号に変更してください。

intEndrow = .Cells(Rows.Count, 1).End(xlUp).Row

3行目から最終行まで処理を繰り返します。開始行が3行目でない場合は変更をしてください。

For i = 3 To intEndrow

VBAの実装

VBAの実装方法については
VBAの実装手順
をご参照ください。

VBAを実行する

VBAを実行してみましょう。

それぞれのファイルがZIP圧縮され、指定のパスに格納されていますね!

中身も指定のファイル通りになっています。

VBAの説明

VBAについて説明をします。

Wscript.Shellをオブジェクトにセットします。

Set objWsh = CreateObject("WScript.Shell")

タカヒロ
タカヒロ
VBAではZIP圧縮の関数は用意されていないのでWindowsのコマンドプロンプトでPowerShellにあるZIPコマンドから実行する形になります。

マクロ実装ブックの1シート目を対象にします。

With ThisWorkbook.Worksheets(1)

PDF出力先リストの最終行を取得します。

intEndrow = .Cells(Rows.Count, 1).End(xlUp).Row

3行目から最終行まで処理を繰り返します。

For i = 3 To intEndrow

PowerShellのZIP圧縮コマンドを作成します。

strCommand = "powershell -NoProfile -ExecutionPolicy Unrestricted Compress-Archive -Path " & .Cells(i, 1).Value & " -DestinationPath " & .Cells(i, 2).Value & " -Force"
コマンド名 Compress-Archive
機能 指定されたファイルとディレクトリから、圧縮されたアーカイブ (zip ファイル) を作成します。
引数 -Path:圧縮元ファイルパス 必須
-DestinationPath:圧縮ファイル出力先パス 必須
-Force:上書き指定。指定なしで同名のファイルがある場合はエラーとなる。
-CompressionLevel:圧縮量(レベル)を指定
Fastest:最速の圧縮法。ファイルサイズ中
NoCompression:圧縮なし。ファイルサイズ大
Optimal:処理時間最適化。ファイルサイズ小
-Update:指定されたアーカイブファイルを更新
-WhatIf:コマンドレットが実行された場合の動作(実際に圧縮実行はしない)
-Confirm:コマンドレットを実行する前の確認有無

参考:https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-7.2

ZIP圧縮コマンドを実行します。

objWsh.Run Command:=strCommand, WindowStyle:=0, WaitOnReturn:=True

オブジェクトを開放します。

Set objWsh = Nothing

VBAで複数のファイルをまとめてZIP形式で圧縮する

VBAで複数のファイルをまとめてZIP形式で圧縮する方法について説明をします。

PDF保存先リストを準備する

ExcelにPDF保存先パス一覧をA列に、ひとつのZIP圧縮先パスとファイル名をB列に入力していきます。

このリストに沿って、ZIPファイルが作成/保存される形となります。

ファイルは前回と同様です。

VBAコード

サンプルのVBAコードは以下の通りです。

Sub 複数の対象ファイルをひとつにまとめZIP圧縮する()
    
    Dim strMotoFilePath As String
    Dim strCommand As String
    Dim objWsh As Object
    Dim intEndrow As Integer
    Dim i As Integer
    
    'Wscript.Shellをオブジェクトにセットします。
    Set objWsh = CreateObject("WScript.Shell")

    'マクロ実装ブックの1シート目を対象にします。
    With ThisWorkbook.Worksheets(1)
    
        'PDF出力先リストの最終行を取得します。
        intEndrow = .Cells(Rows.Count, 1).End(xlUp).Row
        
        '3行目から最終行まで処理を繰り返します。
        For i = 3 To intEndrow
            
            '対象ファイルパスを文字結合します。
            strMotoFilePath = .Cells(i, 1).Value & "," & strMotoFilePath
    
        Next i
        
        'バグるので末尾の","を削除します。
        strMotoFilePath = Left(strMotoFilePath, Len(strMotoFilePath) - 1)
        
        'PowerShellのZIP圧縮コマンドを作成します。
        strCommand = "powershell -NoProfile -ExecutionPolicy Unrestricted Compress-Archive -Path " & strMotoFilePath & " -DestinationPath " & .Range("B3").Value & " -Force"

    End With
    
    'ZIP圧縮コマンドを実行します。
    objWsh.Run Command:=strCommand, WindowStyle:=0, WaitOnReturn:=True
    

    MsgBox "ZIP圧縮が完了しました。"

    'オブジェクトを開放します。
    Set objWsh = Nothing
    
End Sub

VBAを実行する

VBAを実行してみましょう。

それぞれのファイルがひとつにZIP圧縮され、指定のパスに格納されていますね!

中身も指定のファイル通りになっています!

VBAの説明

VBAについて説明をします。

Wscript.Shellをオブジェクトにセットします。

Set objWsh = CreateObject("WScript.Shell")

マクロ実装ブックの1シート目を対象にします。

With ThisWorkbook.Worksheets(1)

PDF出力先リストの最終行を取得します。

intEndrow = .Cells(Rows.Count, 1).End(xlUp).Row

3行目から最終行まで処理を繰り返します。

For i = 3 To intEndrow

対象ファイルパスを文字結合します。

strMotoFilePath = .Cells(i, 1).Value & "," & strMotoFilePath

タカヒロ
タカヒロ
対象ファイルをカンマ”,”で区切って指定をすると処理対象としてまとめることができます。

バグるのでstrMotoFilePath末尾の”,”を削除します。

strMotoFilePath = Left(strMotoFilePath, Len(strMotoFilePath) - 1)

PowerShellのZIP圧縮コマンドを作成します。

strCommand = "powershell -NoProfile -ExecutionPolicy Unrestricted Compress-Archive -Path " & strMotoFilePath & " -DestinationPath " & .Range("B3").Value & " -Force"

タカヒロ
タカヒロ
引数の構成は前回と変わりません。

ZIP圧縮コマンドを実行します。

objWsh.Run Command:=strCommand, WindowStyle:=0, WaitOnReturn:=True

オブジェクトを開放します。

Set objWsh = Nothing

VBAの実装手順

実装手順は以下の通りです。

Excel側にVBAを実装していきます。

①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。

②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。

③右ペインのウインドウに上記のVBAを入力します。

こちらで完了です。

VBAを実行する

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。

②処理がされたことが確認できれば完了です。

さいごに

いかがでしょうか。

今回は、

・VBAで複数のファイルをそれぞれZIP形式で圧縮する方法
・VBAで複数のファイルをまとめてZIP形式で圧縮する方法

についてまとめました。

また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です