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. Office関連

    “元に戻す”履歴に文字列をセットするPowerPointマクロ

    PowerPointマクロでは、Presentationオブジェクトの…

  2. Office関連

    起動中のMicrosoft EdgeからタイトルとURLを取得するVBAマクロ(DOM編)

    前回の記事で、UI Automationを使って起動中のMicroso…

  3. Office関連

    Outlook REST APIに会議室情報を取得するAPIが追加されました。

    松崎さんのツイートで、Outlook REST APIのベータエンドポ…

  4. Office関連

    ちゃうちゃう! 2.0を操作するWordマクロ

    「テキスト比較ソフト「ちゃうちゃう!」がバージョンアップされました。」…

  5. Office アドイン

    [Office用アプリ]マニフェストファイルで多言語対応させる。

    Office用アプリの各種設定を定義するXMLマニフェストファイルです…

  6. Office関連

    Office 2016 Previewをインストールしてみました。

    「Microsoft、「Office 2016」と「Skype for…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP