MS Access Tips/Sample and VBA and Blog customize etc...

7-zip32.DLLを利用してZIPファイルの作成と解凍

ZIP圧縮はいままで、Shell関数で Lhaplus をコマンドラインで呼び出していました。が、連続でZIPファイルを作成する必要が出てきて、Shell関数だと非同期だし、ダイアログが鬱陶しいし、で不満でした。DLLを利用した圧縮と解凍の関数を作成しようと思い立ちました。

DLLを利用したZIPファイルの作成は ZIP32J.DLL + ZIP32.DLL が一般的なようですが、これだと圧縮だけしかできないです。解凍は UNZIP32.DLL が別に必要になります。

で、他にないか探してみました。

7-zip32.DLLを利用してZIPファイルの作成と解凍タイトル

難易度:

7-ZIP32.DLL のインストール

統合アーカイバプロジェクト

の個別ライブラリを見ると、

7-ZIP32.DLL
Igor Pavlov 氏が開発し、高圧縮率で一部の人に支持されている 7z 形式の書庫の圧縮・解凍及び、他の zip 互換プログラムより少しだけ圧縮率の高い zip 書庫の圧縮・解凍をサポートするライブラリです。

というのが見つかります。これだとこれだけで圧縮も解凍も可能だし、少しだけ圧縮率の高いzipファイルが作成できというのもちょっと惹かれます。で、このライブラリを利用することにしました。

下記よりファイルをファイルをダウンロードします。

Common Archivers Library: 7-ZIP32.DLL

2021/09/06 追記: 下記のサイトのdllファイルの方が新しそうです。また 32bit版と64bit版のDLLファイルが同封されているので64bitOfficeをご利用の場合はこちらからダウンロードしてください。
本家の7-zipのダウンロードサイトからダウンロードしたものは日本語環境では使用できませんので注意ください。

ZIPファイルですので、その中の 7-zip32.dll をWindowsのシステムフォルダにコピーします。通常は、32ビット版の場合は「C:\Windows\SysWOW64」、64ビット版の場合は「C:\Windows\System32」です。

これで準備完了です。

標準モジュールのコード

7z形式のより圧縮率の高いファイルも作成出来ますが、なるべくシンプルにしたいので、今回はZIPのみの圧縮、解凍の関数にしました。標準モジュールに下記のコードをコピーして貼り付けてください。

解説

SendToZIP(圧縮時)のsSrsPathにファイルのパスを指定するとそのファイルを圧縮します。フォルダーのパスを指定すると、そのフォルダー内のすべてのファイル、サブフォルダーを圧縮します。

SendToZIP(圧縮時)のsZIPFile(ZIPファイルのパス)に存在しないフォルダーを指定すると、フォルダーを作成してそこにZIPファイルを生成します。

ExtractZIP(解凍時)のsDstPath(解凍先)に存在しないフォルダーを指定するとフォルダーを作成してそこに解凍します。

解凍または圧縮が失敗したら、ライブラリの出すメッセージをメッセージボックスで表示します。

SendToZIP関数の下記のコードでコマンドのスイッチオプションを設定しています。

    sCmd = "a -tzip -mx9 -hide "

-hide は処理状況ダイアログを非表示にします。表示したい場合は削除してください。

ExtractZIP関数の下記のコードでコマンドのスイッチオプションを設定しています。

    sCmd = "X -hide -aoa "

-aoa は、全てのファイルを確認しないで上書きします。

その他、コマンドの詳細は下記を参照してください。ダウンロードした書庫ファイル内の 7-zipCMD.txt を参照ください。

使用例

18 Comments

名無し says..."質問"

zip内の特定のファイルだけ解凍するにはどうすればいいですか?

2015.10.27 10:41 | URL | #VVspvHsA [edit]
hatena says..."re:質問"

> zip内の特定のファイルだけ解凍するにはどうすればいいですか?

記事のコードの ExtractZIP関数を下記のように修正します。

Public Function ExtractZIP(sDstPath As String, sZIPFile As String, Optional sPassWord As String = "", Optional sFileName As String = "") As Boolean
  Dim sCmd As String
  sCmd = "X -hide -aoa "
  If sPassWord <> "" Then sCmd = sCmd & "-P" & sPassWord & " "
  sCmd = sCmd & Q2(sZIPFile) & " -o" & Q2(sDstPath)
  If sFileName <> "" Then sCmd = sCmd & " " & sFileName
  ExtractZIP = DoSevenZip(sCmd) = 0
End Function


使用例

If ExtractZIP("C:\TEMP\", "C:\test\Test.zip", ,"Test.txt") Then
  MsgBox "ZIPファイル内のTest.txtを解凍しました。"
End If

ファイル名にはワイルドカードも指定できます。

2015.10.27 15:56 | URL | #5uE6dEgY [edit]
atropos_043 says..."複数フォルダにまたがったファイルの圧縮"

7-zipでは複数ファイルの圧縮に対してテキストファイルに記載されたリストを用いて対応出きると思いますがこの場合はどのようにしたらよいでしょうか。

2016.12.07 14:34 | URL | #mQop/nM. [edit]
hatena says..."re:複数フォルダにまたがったファイルの圧縮"

ダウンロードしたファイル内の 7-zipCMD.txt によると、
リストファイル名の前に @ を付けるという説明がありますので、
下記のようにすればいけそうな気がします。

Send2ZIP("@C:\TEMP\listfile.txt", "C:\test\Test.zip")

試していませんので、うまくいったらご報告ください。

2016.12.08 11:30 | URL | #5uE6dEgY [edit]
hatena says..."re:re:複数フォルダにまたがったファイルの圧縮"

時間があったので試してみたら、できました。

If SendToZIP("@C:\TEMP\listfile.txt", "C:\test\Test.zip") Then
  MsgBox "ZIPファイルを生成しました。"
End If

2016.12.08 14:55 | URL | #5uE6dEgY [edit]
atropos_043 says..."re:re:re:複数フォルダにまたがったファイルの圧縮"

記載されていたやり方で複数ファイルをパスワード付Zipに圧縮することが出来ました。
ありがとうございました。

2016.12.10 18:30 | URL | #- [edit]
名無し says..."パスワードに"を含む場合"

パスワードに"を含む場合への対策はありますでしょうか?

2019.11.20 11:52 | URL | #- [edit]
hatena says..."re:パスワードに"を含む場合"

ごめんなさい。
いろいろ調べてみましたが、対策は分かりません。

2019.11.20 13:53 | URL | #5uE6dEgY [edit]
なりたぶらいやん says..."エントリSevenZipが7-zip32.DLLにありません と表示されます"

こちらのコードを参考に組みましたが、実行時に標記のエラーが表示されます。
PCには、7Zipがインストール済みで、右クリックで7zでもzip形式でも圧縮できます。
解消するヒントがあれば、教えてください。

2021.06.06 06:38 | URL | #- [edit]
hatena says..."re:エントリSevenZipが7-zip32.DLLにありません と表示されます"

メッセージから、7-ZIP32.DLL が正しい場所にないということだと思います。

記事で解説している通りに、ダウンロード、解凍、システムフォルダーにコピーという作業をしましたか。

2021.06.06 11:41 | URL | #5uE6dEgY [edit]
なりたぶらいやん says..."re:re:エントリSevenZipが7-zip32.DLLにありません と表示されます"

職場のPCで、システムフォルダへのアクセスが制限されています。
7Zipがインストール済みなので、可能と思い、チャレンジしましたが、あきらめて、他の方法を探します。

2021.06.09 06:51 | URL | #- [edit]
yamamomokokemomo says..."最新の7-zip32.dllではエラーがでて動かない"

お世話になります。
暗号付zipファイルをvbaで作る方法を探して、このウェブページにたどり着きました。WscriptShellでコマンドを実行する方法ですとセキュリティソフトがマルウェアと認識して阻止されてしまうため、apiを使う方法で対処することとした次第です。
このサイトは作成時点が古く、ダウンロードされる7-zip32.dllも古いバージョンだったので、最新のバージョンをダウンロードして試したところ、SevenZip()の実行の段階でエラーが出て、数日間あれやこれや試行してみましたが、うまくいきませんでした。
そこで、やはり基本に立ち返るべし!と考えてこのサイトから古いバージョンのdllファイルをダウンロードして実行したところ、何の問題もなくうまく動作いたしました。
ありがとうございました。
しかし、最新バージョンの7-zip32.dllではなぜうまく動作しないのか、誠に不思議です。もしも最新バージョンのdllファイルで動作するコードができるようでしたら、更新していただけると嬉しいです。また、なぜうまくいかないのか、理由が分かったら教えていただけると嬉しいです。
宜しくお願いします。
ありがとうございました。

2021.09.01 19:13 | URL | #xGWvl2RE [edit]
yamamomokokemomo says..."最新の7-zip32.dllではエラーがでて動かない"

補足です。
同じエラーの質問が、なりたぶらいやんさんから出ていましたね。
当方、Windows10は64bit版、Excel16は職場との互換性を考慮して32bit版です。7-zip32.dllをSystem32又はSystWOW64に置いて試行したところ、SysWOW64に置いた場合に7-zip32.dllが読み込まれてうまく動作いたしました。

2021.09.01 19:24 | URL | #xGWvl2RE [edit]
yamamomokokemomo says..."厚かましいお願いですが…"

何とも厚かましいお願いですが、今後は、エクセルも32bit版から64bit版の使用が多くなっていくのではないかと思う次第です。64bit版でも問題なく動作する7-ZIPのAPIのご紹介を頂けると嬉しいです。

2021.09.01 19:30 | URL | #xGWvl2RE [edit]
yamamomokokemomo says..."2つ目の補足"

2つ目の補足です。
このウェブページはAccessのVBAに関するページだったのですね。同じようなものではありますが、エクセルnoVBAでの動作について投稿して申し訳ありません。そこで、Accessではどうかな、とAccess2016_32bit版で同じようにVBAコードを作って、試行してみました。
やはり、最新の7-zip32.dllでは、なりたぶらいやんさんの投稿の様に「エントリSevenZipが7-zip32.DLLにありません。」とのエラーメッセージが表示されて止まります。小生の見解は、dllファイルは読み込まれているけれど、SevenZip関数を読み込もうとして失敗している、という事だろうと思います。
古いバージョンのdllファイルでは、問題なく動作しました。
以上、補足してご報告いたします。

2021.09.01 21:50 | URL | #xGWvl2RE [edit]
yamamomokokemomo says..."お詫びなど"

その後、ダウンロードしたReadmeなどを読んで、どうやら、7-ZIPの本来のダウンロードサイトからダウンロードした7-zip32.dllではダメで、このウェブページで指定されているサイトからダウンロードした秋田稔さんが手を加えた7-zip32.dllでなければ上手くいかないのではないか、と理解しました。
この理解が正しいとすると、小生の先の投稿でのお願いはピント外れ、的外れのお願いとなってしまうと思いますので、ご放念ください。
なお、7-ZIPのサイトからダウンロードした7-zip32.dllではダメである旨を、このウェブサイトにちょこっと注記されておけば、小生やなりたぶらいやんさんの様に困ったことにならずに済むのではないかと思います。ご検討ください。
いずれにしても小生の目的は果たせそうです。ありがとうございました。

2021.09.01 22:18 | URL | #xGWvl2RE [edit]
yamamomokokemomo says..."お礼"

その後Excel64bit版についても、次のURLのページから7-zip64.dllファイルをダウンロードして組み込むことにより、ご紹介いただいたコードで同様に圧縮解凍が出来ました。
http://frostmoon.sakura.ne.jp/7-zip32_ungarbled/#Download
誠にありがとうございました。

2021.09.05 22:21 | URL | #xGWvl2RE [edit]
hatena says..."re:お礼"

yamamomokokemomo様
ご指摘ありがとうございます。

本家サイトのファイルではダメな件と64bit版のdllファイルのリンク先を記事に追記しておきます。

2021.09.06 11:29 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
https://hatenachips.blog.fc2.com/tb.php/376-48d3e565
該当の記事は見つかりませんでした。