はじめに
これは、Visual Basic Advent Calendar 2025の10日目の記事となります。
予定では、VBA から .NET Frameworkの機能を使用するvb2Clr関連の記事を書く予定でしたが、使い方の理解がまだ乏しいため、こなれてから書く予定です。
ただvb2Clrを使用して何をやろうかという案は幾つか上がっています。
その中の1つが、ZIPファイルの圧縮、解凍です。VBA を使用してZIPファイルの圧縮、解凍を行う方法としては大きく2つあります。
VBAからZIPファイルを作成する主な方法
- OS標準機能でzipファイル作成する方法
- PowerShellの圧縮、解凍コマンドを利用する
OS標準機能でzipファイル作成する方法
WshShell.NameSpace.CopyHereメソッドでのZipファイルへのコピー処理を利用する。ただし、MicrosoftWindowsサポートで(公式リンク)「CopyHere メソッドから Zip ファイルを処理することはできません」でサポート対象外とされています
サポート対象外の原因を知りたいと思って公式リンクをクリックするも、現在は「申し訳ございません。ページが見つかりませんでした」になってしまいます。
https://support.microsoft.com/ja-jp/help/2679832
それではとインターネットアーカイブで見ると、一瞬記事が表示されるがフッターで消えてしまう。そういうとこだよ、嫌われるのは Microsoftさんよー。
https://web.archive.org/web/20200919105250/https://support.microsoft.com/ja-jp/help/2679832
キャプチャして画像を切り取り、ChatGPTでテキスト化しました。
これを知った上で使用するならお手軽だし問題ないです。
パスワードは付けることができないが、下記サイトによれば、2GB以上でも圧縮できる。
Windows PowerShell V4.0以前の機能を使って、大きなサイズのファイルを圧縮する
CopyHere メソッドから Zip ファイルを処理することはできません
適用対象: Microsoft Windows XP Home Edition, Microsoft Windows XP Professional, Windows Vista Business, 詳細
現象
スクリプトまたはプログラムから Shell のオブジェクトやインターフェイスにて ZIP ファイルを操作した場合、ZIP ファイルを正しく処理できない場合があります。
たとえば、すべてのファイルを処理せずに途中で終了したり、エラーが発生しているにもかかわらずエラーを示さずに終了したりすることがあります。
また、ユーザーの操作を求めるダイアログが表示され、ユーザー操作があるまで中断することがあります。
原因
エクスプローラーから、ユーザー操作以外の方法で ZIP ファイルを扱うことは想定されていません。
CopyHere メソッドを使用して ZIP ファイルからファイルを取り出したり、ZIP ファイルにファイルを格納したりすることもサポート対象外となります。
PowerShellの圧縮、解凍コマンドを利用する
WshShellクラスのWshShell.Execメソッドで、PowerShellを呼び出してコマンドを渡して処理を行う方法です。「圧縮コマンド」=Compress-Archive、「解凍コマンド」=Expand-Archive
パスワードは付けることができないのと、2GBのサイズ制限があります。
【2025/12/12追記】
なぜ 2GB で止まるのか?
Windows PowerShell(5.x 系)や一部の実装では、Compress-Archive が 出力 ZIP を作る過程でメモリストリームにアーカイブ内容を保持しようとするため、容量が増えると「Stream was too long」という例外が発生します。結果として 実質 2GB 付近で失敗します。
(この挙動は ZIP64 非対応というより、コマンドレット側の作りによる上限です。)
PowerShell v5では、.NET FrameworkのZipFileクラスを使うことで、外部ツールなしでZIP64対応の圧縮が可能です。
最後に
vb2Clrを使用した Zipファイルの操作では .NET Frameworkの System.IO.Compression は ZIP64 をサポートしているため、2GB、4GB、10GB、100GB の ZIP も扱えます。ただし、パスワードには非対応となっています。
パスワード対応としたい場合、7zipを使用するのがいいでしょう。