VBAで圧縮と解凍を行うには

VBAでファイルやフォルダの圧縮や解凍を行いたい場合、残念ながらVBAに標準で圧縮や解凍を行う仕組みがないため、外部の機能を利用することになります。

ここでは7-Zipを使う方法を紹介します。

なお、Windowsの標準機能のみを使う方法については「VBAでZIP圧縮と解凍を行う」をご参照ください。


7-Zipとは?

7-Zipはオープンソース(フリー)の圧縮解凍ソフトです。zip、7z、tar、gzip、RAR、LZHなど様々な書庫形式に対応しています。

7-Zipの日本語公式サイトは「https://sevenzip.osdn.jp/」です。ダウンロードもここから可能です。

7-ZipのWindowsでの一般的な操作は、エクスプローラーで対象のフォルダやファイルを右クリックして、7-Zip→圧縮、または、展開(解凍の意味)で行います。バッチファイルやプログラムなどから利用できるようにコマンドラインも用意されているので、それを利用することでVBAからフォルダやファイルの圧縮や解凍を行うことができます

以下では7-ZipのコマンドラインをVBAから利用して圧縮や解凍を行う方法を紹介します。利用の際には7-Zipがインストールされていることが前提です。


7-Zipのコマンドラインの基本的な考え方

7-Zipをインストールすると、インストール先のフォルダ(C:\Program Files\7-Zip など)に7z.exeが配置されます。コマンドラインはこの7z.exeを利用します。

7z.exeのコマンドラインは以下の形式になります。[ ~ ]は省略可能です。

「7z.exe コマンド文字 [スイッチ文字] アーカイブのパス [元データのパス]」

詳細は公式ページ「https://sevenzip.osdn.jp/chm/cmdline/syntax.htm」をご参照ください。

7z.exe 7z.exeのフルパスを指定します。7z.exeに環境変数PATHが設定されていればフルパスを書く必要はありませんが、標準インストール時は設定されていないのでここでは設定されていないものとして説明します。
コマンド文字 どのような操作を行うのかを1文字で指定します。詳細は公式ページ「https://sevenzip.osdn.jp/chm/cmdline/commands/index.htm」をご参照ください。ここではよく使うものだけ紹介します。

コマンド文字 説明
a 「元データのパス」で指定したファイルやフォルダを「アーカイブのパス」に圧縮します。
x 「アーカイブのパス」を解凍します。解凍結果をフォルダに入れたい場合は”-o”オプションでフォルダを指定してください。
l 「アーカイブのパス」で指定された圧縮ファイルに格納されているファイルやフォルダを列挙します。
スイッチ文字 指定したコマンド文字の内容に加えて指定します。省略可能です。詳細は公式ページ「https://sevenzip.osdn.jp/chm/cmdline/switches/index.htm」をご参照ください。ここではよく使うものだけ紹介します。

スイッチ文字 説明
-o 解凍時に作成するフォルダ名を指定します。”-o”とフォルダ名の間にはスペースを入れずに連続して入力します。”D:\testFolder”というフォルダ内に解凍したい場合は「-oD:\testFolder」と指定します。
-p パスワードを指定する場合は”-p”とパスワードを設定します。”-p”とパスワードの間にはスペースを入れずに連続して入力します。”ABC123″というパスワードを指定する場合は「-pABC123」と指定します。
-y 解凍時に何を展開するかの問い合わせを全て「Yes」扱いにします。解凍時は付けておいた方がいいです。
アーカイブのパス 圧縮時や解凍時に圧縮ファイルのパスを指定します。ファイル名だけを指定することも可能ですが、VBAで利用する場合はフルパスを指定することをお勧めします。
元データのパス 圧縮する対象のファイルやフォルダを指定します。VBAで利用する場合はフルパスを指定することをお勧めします。

そもそもの「コマンドライン」とは? という話ですが、簡単に言うとWindowsでのマウス操作で行っていることを、コマンドプロンプトなどのコンソール画面(黒背景に文字しか打てない画面)に決められた規則に従って入力した命令文のことを指します。


7z.exeのコマンドラインヘルプ表示

7z.exeをコマンドプロンプト上で引数無しで実行すると、コマンドラインのヘルプが英語で表示されます。以下が実行結果です。これだけの種類のコマンド文字とスイッチ文字があります。

後述するマクロでは、一般的な圧縮や解凍を行う際に必要なコマンドに絞って説明しています。



事前準備(WshShellの参照設定)

以下で紹介するマクロはWScript.Shellを利用します。WScript.Shellを参照設定をする場合としない場合で書き方が2通りあります。

参照設定をする場合は、ツールメニュー→参照設定で「Windows Script Host Object Model」にチェックを付けて、WshShellクラスの変数を利用します。

参照設定をしない場合は、「CreateObject(“WScript.Shell”)」でWshShellクラスのオブジェクト変数を作成して利用します。

どちらで実装しても問題ありませんが、処理速度は参照設定をした方が若干速いです。

その理由については興味があれば別ページ「VBAの高速化(クラスは参照設定+Newする)」をご参照ください。


VBAから7-Zipを使って圧縮を行うマクロ

以下のマクロは引数で指定されたファイルパスやフォルダパスを、指定した圧縮ファイルパスの名前で圧縮します。

7z.exeのパスを6行目で指定していますが、PCによって異なるため利用しているPCに合わせて書き換えてください。

第一引数(a_sPath):圧縮するファイルやフォルダのパス
第二引数(a_sZipPath):圧縮後のファイルパス
第三引数(a_sPassword):パスワード。省略可。

圧縮マクロの使い方1(パスワードなしで圧縮する場合)

MakeZip7関数の第3引数を省略するか、””(空文字)で指定するとパスワードが未設定として実行されます。

以下、見本として「Call MakeZip7」の行が2つ用意していますが、どちらも結果は同じです。

圧縮マクロの使い方2(パスワードありで圧縮する場合)

MakeZip7関数の第3引数に””以外の文字列を指定することで圧縮ファイル解凍時に必要なパスワードを設定することができます。

以下では”ABC111″というパスワードを設定しています。



VBAから7-Zipを使って解凍を行うマクロ

解凍を行うマクロは上の圧縮のマクロとほとんど同じです。違うのは7z.exeのコマンドラインで解凍の場合はコマンド文字に「x」を指定することと、解凍先フォルダを指定できるようにしている点です。

解凍先フォルダが未設定の場合はカレントディレクトリが解凍先になりますが、VBAで実行する場合はコマンドプロンプトなどで実行する場合と異なり、コマンドを実行しているカレントディレクトリが分かりません。そのため、どこに解凍されるのはOSやツール任せになり行方不明になることがありえます。

そのため、解凍先フォルダが未設定の場合は、圧縮ファイルがあるフォルダに展開するようにしています。

第一引数(a_sZipPath):圧縮ファイルパス
第二引数(a_sMakeDirectory):解凍先フォルダパス。省略時は圧縮ファイルがあるフォルダに解凍される。
第三引数(a_sPassword):圧縮ファイルを解凍する際のパスワード。省略可。パスワードが設定されていない圧縮ファイルの場合は省略する。

解凍マクロの使い方1(パスワードなしで解凍する場合)

解凍先フォルダを指定してないため、圧縮ファイルと同じ階層に解凍されます。

解凍マクロの使い方2(解凍先フォルダあり、パスワードありで解凍する場合)