1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CopyHere メソッドから Zip ファイルを処理することはできません。

1
Last updated at Posted at 2025-12-10

はじめに

これは、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を使用するのがいいでしょう。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?