【Excel VBA】ZIPファイルをマクロで解凍する方法|複数ファイルの一括解凍にも対応

こんにちは。

今回は、Excel VBAからZIPファイルを解凍する方法についてご紹介します。

VBAだけでZIPファイルを扱うのではなく、Windowsに標準搭載されているPowerShellの Expand-Archive を使用します。

さらに後半では、指定したフォルダ内にあるZIPファイルをまとめて一括解凍する方法もご紹介します。


この記事はこんな人におすすめ

この記事はこんな人におすすめです。

  • VBAでZIPファイルを解凍したい人
  • 複数のZIPファイルを一括処理したい人
  • ファイル操作を自動化したい人
  • 業務効率化ツールを作りたい人

といったところでしょうか。


VBAでZIPファイルを解凍する仕組み

今回はVBAからPowerShellを呼び出します。

PowerShellには、

Expand-Archive

というZIPファイルを解凍するコマンドがあります。

処理の流れは以下になります。

VBA

PowerShellを起動

Expand-Archiveを実行

ZIPファイルを解凍

それでは実際にコードを見てみましょう。


ZIPファイルを1つ解凍する

まずは、指定したZIPファイルを1つ解凍するコードです。

Function ExtractZipFile( _
    ByVal zipFilePath As String, _
    ByVal outputFolderPath As String _
) As Boolean

    Dim command As String
    Dim shell As Object
    Dim exitCode As Long

    command = "powershell.exe -NoProfile -ExecutionPolicy Bypass " & _
              "-Command ""Expand-Archive " & _
              "-LiteralPath '" & zipFilePath & "' " & _
              "-DestinationPath '" & outputFolderPath & "' " & _
              "-Force"""

    Set shell = CreateObject("WScript.Shell")

    exitCode = shell.Run(command, 0, True)

    ExtractZipFile = (exitCode = 0)

    Set shell = Nothing

End Function

ZIPファイルのパスと解凍先フォルダを指定して、PowerShellに処理を実行させています。


ZIPファイルを解凍してみる

呼び出す側のコードはこちらです。

Sub ZIPファイル解凍テスト()

    Dim zipPath As String
    Dim outputPath As String

    zipPath = "C:\work\sample.zip"
    outputPath = "C:\work\sample"

    If ExtractZipFile(zipPath, outputPath) Then

        MsgBox "ZIPファイルの解凍が完了しました。", vbInformation

    Else

        MsgBox "ZIPファイルの解凍に失敗しました。", vbExclamation

    End If

End Sub

実行すると、

C:\work\sample.zip

の内容が、

C:\work\sample

へ解凍されます。

※ここに実行前・実行後の画像を掲載


ソースコードのポイント

Expand-Archive

Expand-Archive

PowerShellでZIPファイルを解凍するためのコマンドです。

解凍するZIPファイル

-LiteralPath

ここで解凍対象のZIPファイルを指定します。

解凍先フォルダ

-DestinationPath

ここで解凍先を指定します。

既存ファイルを上書きする

-Force

同名ファイルが存在した場合でも上書きして処理します。


VBAからPowerShellを実行する

PowerShellの実行には WScript.Shell を使用します。

Set shell = CreateObject("WScript.Shell")

実際にコマンドを実行しているのはこちらです。

exitCode = shell.Run(command, 0, True)

第2引数を 0 にしているため、PowerShellの画面は表示されません。

また、第3引数を True にしているため、解凍が完了するまでVBA側の処理を待機します。


解凍結果を取得する

ExtractZipFile = (exitCode = 0)

PowerShellが正常終了した場合は 0 が返されます。

そのため、

0 → True
0以外 → False

として解凍結果を取得しています。


フォルダ内のZIPファイルを一括解凍する

次は、指定したフォルダ内にあるZIPファイルをまとめて解凍します。

Sub ExtractAllZipFiles()

    Dim targetFolderPath As String
    Dim fso As Object
    Dim targetFolder As Object
    Dim targetFile As Object
    Dim outputFolderPath As String

    targetFolderPath = "C:\work\ZipFiles"

    Set fso = CreateObject("Scripting.FileSystemObject")

    If Not fso.FolderExists(targetFolderPath) Then

        MsgBox "指定したフォルダが見つかりません。", vbExclamation
        Exit Sub

    End If

    Set targetFolder = fso.GetFolder(targetFolderPath)

    For Each targetFile In targetFolder.Files

        If LCase(fso.GetExtensionName(targetFile.Name)) = "zip" Then

            outputFolderPath = fso.BuildPath( _
                targetFolderPath, _
                fso.GetBaseName(targetFile.Name) _
            )

            Call ExtractZipFile(targetFile.Path, outputFolderPath)

        End If

    Next targetFile

    Set targetFile = Nothing
    Set targetFolder = Nothing
    Set fso = Nothing

    MsgBox "ZIPファイルの解凍処理が完了しました。", vbInformation

End Sub

一括解凍コードのポイント

FileSystemObjectを使用する

Set fso = CreateObject("Scripting.FileSystemObject")

今回は参照設定を変更せずに使える方法にしています。

ZIPファイルだけを対象にする

If LCase(fso.GetExtensionName(targetFile.Name)) = "zip" Then

フォルダ内に他のファイルがあっても、ZIPファイルだけを処理します。

ZIPファイル名を解凍先フォルダ名にする

outputFolderPath = fso.BuildPath( _
    targetFolderPath, _
    fso.GetBaseName(targetFile.Name) _
)

例えば、

売上データ.zip

であれば、

売上データ

というフォルダへ解凍されます。


ZIPファイルの解凍は業務自動化にも使える

この処理は単体でも使えますが、他の処理と組み合わせるとより便利です。

例えば、

ZIPファイルをダウンロード

自動で解凍

CSVを開く

Excelへ取り込む

といった処理も可能になります。

こういった小さな処理を組み合わせることで、VBAによる業務自動化の幅も広がります。


最後に

いかがでしたでしょうか。

今回は、Excel VBAからPowerShellを使用してZIPファイルを解凍する方法についてご紹介しました。

1つのZIPファイルを解凍するだけでなく、フォルダ内のZIPファイルをまとめて処理することもできます。

それほど難しい処理ではありませんので、ぜひ今後のVBAツール開発や業務効率化に活用してみてください。

少しでも参考になればと思います。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA