VBAでZIP圧縮と解凍を行う方法

VBAの標準機能にはZIPファイル関連の機能がありません。

無いのであればなんらかの別の方法で行うことになります。具体的には以下が挙げられます。

  1. PowerShellの圧縮、解凍コマンドを利用する。
  2. 7-Zipなどの外部ライブラリを利用する。
  3. 他のプログラミング言語のZIP関連機能を利用する。
  4. WshShell.NameSpace.CopyHereメソッドでのZipファイルへのコピー処理を利用する。ただし、Microsoft非推奨(公式リンク)。

どれも一長一短がありますが、より多くのPCで一番確実に動作するのはPowerShellでの方法です。

ただ、PowerShellでの方法には欠点があり、パスワードが付けられなかったり、サイズが2GBに制限されていたりなどの制約があります。ただ、パスワードなしの単純な圧縮と解凍であればこれで十分です。

7-zipなどの外部ライブラリはインストールが必要になるため、オフライン環境PCやインストール禁止PCなどでは利用できません。ただ、7-Zipに限って言えば、利用できるのであれば多数の機能がサポートされており、複雑なことをしたい場合は一番オススメです。

他のプログラミング言語ではそれらの言語がインストールされていることが必須になりますし、CopyHeraメソッドはエラー処理に不備があるようで(公式リンク)、Microsoft自体が非推奨です。

というわけで、ここではPowerShellを使った方法を紹介します。

事前設定

以下に紹介するコードではWshShellクラスを利用しています。

WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。これでWshShellクラスを利用できるようになります。

なお、参照設定を行わず、CreateObject関数を使う場合は「Dim obj」と「Set obj = CreateObject(“WScript.Shell”)」と書きます。

圧縮関数

コードの内容はコメントの通りですが、概要を説明します。

引数のパスに半角スペースがあった場合を考慮して、半角スペースをバッククォートでエスケープしています。

あとは、その引数を使ってPowerShellで実行するコマンド文字列をsCmd変数に入れてます。これがZIP圧縮するためのコマンドです。

そのあとにWshShell.Execメソッドで、PowerShellを呼び出してコマンドを渡しています。

NoLogo PowerShell起動時の著作権のバナーを表示しません。
ExecutionPolicy RemoteSignedでコマンドの実行を許可する。デフォルトはRestrictedが設定されており実行不可状態。
Command 実行するコマンドを指定する。

あとはコマンドの実行状態の判定を行い、失敗していたら異常を返し、処理中であれば終わるまで待って、終わったら正常を返します。

解凍関数

コードの内容はMakeZip関数とほとんど同じです。コマンドがCompress-ArchiveからExpand-Archiveに変わっただけです。

使い方

圧縮関数の使い方のサンプルです。

第一引数に圧縮したいフォルダかファイルのパスを指定し、第二引数に作成する圧縮ファイルを拡張子の(.zip)も含めて指定して実行します。

解凍関数の使い方のサンプルです。

注意点

圧縮関数と解凍関数は引数のパスが存在しているかどうかのチェックを行っていません。

チェックが必要な場合はフォルダ存在チェックやファイル存在チェックを行うようにしてください。

それぞれのチェックの詳細は「VBAでフォルダ存在チェック」「VBAでファイルの存在をチェックする」をご参照ください。

もし、zipを解凍したときに中身が空の場合は、圧縮時か解凍時のパスが間違ってますので確認してください。