Office関連

7-Zipで圧縮・解凍を行うVBAマクロ

7-Zip VBA」といったキーワード検索でのアクセスがありました。

恐らく「圧縮・解凍ソフト 7-Zip」を使って、ファイルの圧縮や解凍を行うマクロを探している方だろうと思います。

以前下記記事でShellを使ったZIP圧縮・解凍を行うマクロを紹介しましたが、動作はサポート外となっているため、今回改めて7-Zipを使った圧縮・解凍マクロを考えてみたいと思います。

準備する物

統合アーカイバ・プロジェクトで公開されている「7-ZIP32.DLL」を使うこともできるのですが、今回はインストール不要、EXEファイル一つで使えるコマンドライン版(7za.exe)を使用します。

上記ダウンロードページからコマンドライン版をダウンロードして、適当なフォルダに解凍します。

ただし、元のファイルが「7z」ファイルになっているため、7z形式に対応した解凍ソフトを導入していない場合は、先に7-Zip本体をインストールしておく必要があります。

VBAコード

※ 7za.exeファイルのパスは必要に応じて変更してください。

Option Explicit

Private Const SevenZipFilePath As String = "C:\7zip\7za.exe"

Public Sub ArchiveSample()
'[C:\Test\PDF]フォルダをパスワード付zip形式(AES-256)で圧縮
  ArcFileOrFolder "C:\Test\PDF", "zip", "C:\7zip", "pass", True
  MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub

Public Sub ExtractSample()
'[C:\Test\PDF.zip]ファイルを解凍
  ExtractArchive "C:\Test\PDF.zip", "C:\7zip", "pass"
  MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub

Public Sub ArcFileOrFolder(ByVal SrcPath As String, _
                           Optional ByVal ArcExtension As String = "zip", _
                           Optional ByVal DestFolderPath As String = "", _
                           Optional ByVal ArcPassWord As String = "", _
                           Optional ByVal EncMethodAES256 As Boolean = True)
'ファイル・フォルダを7-Zipで圧縮
' - SrcPath:元ファイル・フォルダ
' - ArcExtension:圧縮ファイルの拡張子
' - DestFolderPath:出力先、指定しない場合は元ファイル・フォルダと同じ場所
' - ArcPassWord:圧縮ファイルのパスワード
' - EncMethodAES256:AES-256による暗号化(zip形式のみ)

  Dim DestFilePath As String
  Dim com As String
  
  'ファイル・フォルダの存在判定
  If (IsFolder(SrcPath) = False) And (IsFile(SrcPath) = False) Then Exit Sub
  
  '圧縮ファイルの拡張子設定
  ArcExtension = LCase(ArcExtension)
  Select Case ArcExtension
    Case "zip", "7z", "tar"
    Case Else: ArcExtension = "zip"
  End Select
  
  With CreateObject("Scripting.FileSystemObject")
    If IsFolder(DestFolderPath) = False Then
      If IsFolder(SrcPath) = True Then
        DestFolderPath = SrcPath
      ElseIf IsFile(SrcPath) = True Then
        DestFolderPath = .GetFile(SrcPath).ParentFolder.Path
      End If
    End If
    DestFilePath = AddPathSeparator(DestFolderPath) & _
                     .GetBaseName(SrcPath) & "." & ArcExtension
  End With
  com = ChrW(34) & SevenZipFilePath & ChrW(34) & _
        " a " & ChrW(34) & DestFilePath & ChrW(34) & " " & ChrW(34) & SrcPath & ChrW(34)
  If Len(Trim(ArcPassWord)) > 0 Then
    com = com & " -p" & ArcPassWord
    Select Case ArcExtension
      Case "zip": If EncMethodAES256 = True Then com = com & " -mem=AES256"
    End Select
  End If
  
  'Debug.Print com '確認用
  CreateObject("WScript.Shell").Run com, 1, True
End Sub

Public Sub ExtractArchive(ByVal SrcPath As String, _
                          Optional ByVal DestFolderPath As String = "", _
                          Optional ByVal ArcPassWord As String = "")
'圧縮ファイルを7-Zipで解凍
' - SrcPath:元ファイル
' - DestFolderPath:出力先、指定しない場合は元ファイルと同じ場所
' - ArcPassWord:圧縮ファイルのパスワード

  Dim com As String
  
  'ファイルの存在判定
  If IsFile(SrcPath) = False Then Exit Sub
  
  With CreateObject("Scripting.FileSystemObject")
    '圧縮ファイルの拡張子判定
    Select Case LCase(.GetExtensionName(SrcPath))
      Case "zip", "7z", "tar"
      Case Else: Exit Sub
    End Select
    
    If IsFolder(DestFolderPath) = False Then
      DestFolderPath = .GetFile(SrcPath).ParentFolder.Path
    End If
  End With
  
  com = ChrW(34) & SevenZipFilePath & ChrW(34) & _
        " x " & ChrW(34) & SrcPath & ChrW(34) & _
        " -o" & ChrW(34) & DestFolderPath & ChrW(34) & _
        " -aoa" 'ファイル上書き
  If Len(Trim(ArcPassWord)) > 0 Then com = com & " -p" & ArcPassWord
  
  'Debug.Print com '確認用
  CreateObject("WScript.Shell").Run com, 1, True
End Sub

Private Function IsFolder(ByVal SrcPath As String) As Boolean
  IsFolder = CreateObject("Scripting.FileSystemObject").FolderExists(SrcPath)
End Function
 
Private Function IsFile(ByVal SrcPath As String) As Boolean
  IsFile = CreateObject("Scripting.FileSystemObject").FileExists(SrcPath)
End Function
 
Private Function AddPathSeparator(ByVal SrcPath As String) As String
  If Right(SrcPath, 1) <> ChrW(92) Then SrcPath = SrcPath & ChrW(92)
  AddPathSeparator = SrcPath
End Function

引数の説明はコード中に記載している通りで、パスワードや暗号化方式を指定して圧縮・解凍できるようにしています。

使用しているコマンド・スイッチ

上記マクロでは、下記のコマンドラインオプションを使用して圧縮・解凍を行っています。

  1. a:アーカイブにファイルを追加します。ファイル・フォルダ圧縮。
  2. x:パス名付きでファイルを解凍します。
  3. -p{Password}:パスワードを指定します。
  4. -m{Parameters}:圧縮方法を指定します。「em」パラメーターで暗号化方式を指定できます([-mem=AES256]でAES-256による暗号化)。
  5. -o{Directory}:出力先を指定します。
  6. -ao{a|s|t|u}:上書きモードを指定します。[-aoa]で既存ファイルをすべて上書きします。

より詳細な説明は下記ページに記載されています。

7za.exeと7z.exeの違い

通常版の7-Zipには、GUIの「7-Zip File Manager」の他にコマンドライン版の「7z.exe」ファイルが含まれています。

7z.exeは7z.dllと実行することで、File Manegerと同等の機能を呼び出すことができ、それに対し「7za.exe」は、機能が制限されますが、ファイル単体で主要な機能を実行することができます。

参考Webページ

「湯神くん練習メニューQUOカード」に当選したよ。前のページ

Office 365でVisio JavaScript APIsを試してみました。次のページ

関連記事

  1. Excel

    「入門レベルでは決して足りない実務に必須のスキルとは ExcelVBA 実戦のための技術」レビュー

    久しぶりにVBA参考書籍のレビューです。今回は沢内晴彦氏が執筆され…

  2. Office関連

    OneNoteのノート名を列挙するマクロ

    今回はOneNoteのノート名を列挙するマクロを紹介します。O…

  3. Office関連

    SmartArtからテキストを取得するPowerPointマクロ

    Twitterで@terrysaitoさんが下記のようなツイートをされ…

  4. Office関連

    Office 2013関連資料のリンク

    Office 2013関連資料のリンクをメモしておきます。・O…

  5. Office関連

    2つの文書を比較するWordマクロ

    先日テキスト比較ソフトの「ちゃうちゃう!」がバージョンアップされたこと…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP