ファイルを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")
マクロ実装ブックの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形式で圧縮する方法
についてまとめました。
また、他にも便利な方法がありますので、よろしければご参照頂ければと思います。
コメントを残す