たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

VBA_バッチファイル_7-Zipを実行してファイルを圧縮【Shell】

VBAの中でコマンドを作って、7-Zipのexe実行によりファイルをzip化する

今回の例についての説明

Excel2016やそれより前のExcelVBAで
ファイルをZip化しようと思ったものの
会社のPCに入っている圧縮.exeが7-zipしかなかった
なのでこの際7-zipを使用し、VBAのなかでコマンドを作ってZip化することにした
この記事ではVBAで実行するが、コマンドだけバッチファイルとかに書いて実行しても同じかと

ちなみに、Excel2010では
SaveAsのオプションでZip化できちゃうので、わざわざこの対応を行う必要はない

事前準備

7z.exeがある場所を特定しフルパスを取得

おおかた、CドラのProgram Filesのなかにあるのであろう

たま氏は「"C:\Program Files\7-Zip\7z.exe"」だった
それを変数「SZPath」に格納する予定

zipに入れたいファイルのフルパスを取得

「"C:\Users\user\デスクトップ\test\Book1.xlsx"」をzipにしたい

たま氏はそのフルパスを変数「TargetFile」に代入する予定

zip化したときのフルパスを作成

Book1.xlsxと同じ場所に作りたいので、フルパスは以下になる
「"C:\Users\user\デスクトップ\test\Book1.zip"」
たま氏は変数「ZipFile」に格納しようかと

コマンド格納用変数を準備

たま氏は変数「CommandLine」に格納しようかと

7-Zip実行コマンド作成

先にイメージだけ
▼記述例▼
SZPath + a + ZipFile + TargetFile

-----解説-----
1. 最初に、7-zip.exeのフルパスを記述
2. 「a」はAddのa、7-zipでファイルをアーカイブするコマンド
3. zipのフルパスと圧縮したいファイルをスペースを空けて記述

・最初の7-zip.exeのフルパスは、コマンド「7z」でも大丈夫
 それでうまくいかなかったらフルパスにしてみるとよい
 「7z」は多分、コマンドラインプログラムとして認識されない場合には使えない
・あくまで、コマンドの記述をVBAのなかで作文するということになるので
 「a」の前後、ZipFileとTargetFileの間にはスペースを入れる

VBA記述

実際の利用を想定するとZip作成は外だししそうなので
プロシージャを「test」と「MakeZip」に分けて書いた
コマンドは、Shell関数で実行


▼記述例▼

Sub test()

Dim ZipFile As String, TargetFile As String

TargetFile = "C:\Users\user\デスクトップ\test\Book1.xlsx"
ZipFile = Replace(TargetFile, ".xlsx", ".zip")

Call MakeZip(ZipFile, TargetFile)

End Sub

'zip作成ルーチン
Sub MakeZip(ZipFile As String, TargetFile As String)

Dim SZPath As String, CommandLine As String

SZPath = "C:\Program Files\7-Zip\7z.exe"
CommandLine = """" & SZPath & """ a """ & ZipFile & """ """ & TargetFile & """"

Shell CommandLine

MsgBox "Zipファイルが作成されました"

End Sub


VBAを実行

testプロシージャを再生
▼結果例▼