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プロシージャを再生
▼結果例▼