VBAでファイルを一括でzipフォルダに圧縮

スポンサーリンク

電子書籍をタブレット・スマホで読むにはZipが便利

私はよく電子書籍をjpg形式で保管しているのですが、通常のフォルダで管理しているとスマホ、タブレットに入れるとギャラリーの中に電子書籍のデータが入ったり、また開くアプリによってページ順がばらばらになったりしていました。

「.」から始まるフォルダを作成しておけばギャラリーの中に画像が入り込むことはなくなりますが、管理が面倒になります。
(私が使っているスマホはパソコンと接続しても「.」から始まるフォルダが表示されません。)

今回は私が持っている電子書籍のデータを一括でZipフォルダに変更するために作成したVBAコードを紹介します。

LhaPlusという圧縮ソフトを使用する

「.CopyHere」というメソッドを用いたWindows標準の機能でもZipファイルは作成できますが、たくさんのファイルをZipフォルダの中に入れようとするとエラーが起こり途中で止まってしまいました。

この作成方法はWindowsのサポート対象外の機能のようでうまく動作しない場合があるとMicrosoftのページでも記載されています。

そこで圧縮のフリーソフトで有名なLhaPlusというものを使用することにしました。LhaPlusは色々なところでダウンロードできますが、私は窓の杜のページからダウンロードしました。

このLhaPlusはコマンドラインで操作できるのが特徴で、VBAと組み合わせるとかなり自由な操作が可能になります。

スポンサーリンク

LhaPlusのコマンドライン

私が把握しているコマンドラインでのLhaPlusを操作するコードは以下のものです。

LhaPlusのコマンドの種類

  • /p:xxx パスワード付きzip圧縮でパスワードを指定する
  • /o:xxx 出力先フォルダ(圧縮フォルダを作成するフォルダ)を指定
  • /n:xxx 出力するファイル名(圧縮フォルダの名前)を指定する
  • /l:xxx 指定のファイルで記述されたファイル一覧を操作対象にする
  • よくあるネットで紹介されているLhaPlusの使用方法

    Lhaplus.exe /o:圧縮ファイルを作成するフォルダ名(フルパス) /c:zip 圧縮したいファイル(フルパス)

    圧縮したいファイルが複数ある場合は半角スペースを空けて記入することで一つの圧縮フォルダに複数のファイルを格納することができるようです。

    Lhaplus.exe /o:圧縮ファイルを作成するフォルダ名(フルパス) /c:zip 圧縮したいファイル①(フルパス) 圧縮したいファイル②(フルパス)…

    このコードをそのまま使用した場合、今回の目的に対して2点問題が生じました。

    1つ目は圧縮フォルダの名前が先頭のファイル名になってしまうことです。これはあとで変更しても良いので大した問題ではないですが、できれば解決しておきたい部分です。

    そして2つ目が命取りの問題で、コマンドラインに出力する文字数の制限を超えることです。
    電子書籍は一つのフォルダに300ページくらい入っているものがあって、全部のフルパスを指定していくとコマンドラインに出力する文字数が軽く10,000文字を超えてしまっていました。

    Microsoftのサポートページによるとコマンドラインで使用できる文字数は8,191文字で、超えた分がエラーになってしまいます。

    出力できない場合があるのでこのコードは使用できず他の方法を検討しました。

    私がLhaPlusを操作するのに使用したコード

    私がVBAに組み込んだコマンドラインのコードは以下の通りです。

    Lhaplus.exe /c:zip /n:圧縮フォルダの名前(フルパス) /l:圧縮したいファイルを記載したテキストファイル名(フルパス)

    「/n:」を使用して圧縮フォルダの名前を指定して、圧縮したいファイル名の一覧を記載したテキストファイルを「/l:」を用いて呼び出すことにしました。

    圧縮したいファイル名の一覧はテキストファイルで、1行に1つのファイル名を記載しておくと呼び出して使用できるようになります。
    私はデスクトップに「圧縮リスト.txt」というファイルを作成してする手順でVBAコードを作りました。

    VBAコード紹介

    私が作成したVBAコードは以下の通りです。
    デスクトップの「前」の中にあるフォルダをすべて「後」というフォルダに圧縮ファイルとして出力するコードです。

    圧縮ファイルの中にはダイレクトにファイルが入っていて、通常のフォルダとほとんど同じ扱いで処理できるようになっています。

    VBAでコマンドラインを操作する方法はこちらの記事を参考にしてください。

    Sub zip変更5()

    Dim FSO As Object, WSH As Object
    Dim Cmd(4) As String

    Dim 前FoldPath As String, 後FoldPath As String
    Dim FolderName As String, FileName As String

    Dim ArrFileName As String, ArrFolderName() As String
    Dim DesktopPath As String

    Dim i As Long, k As Long

    Set FSO = CreateObject(“Scripting.FileSystemObject”)
    Set WSH = CreateObject(“Wscript.Shell”)

    WSH.CurrentDirectory = “C:Program Files (x86)Lhaplus” ’LhaPlusがあるフォルダをカレントディレクトリに指定する

    DesktopPath = WSH.SpecialFolders(“Desktop”)
    前FoldPath = “C:UsersmasahDesktop前” ’圧縮したいフォルダを格納するフォルダを決定する。今回はデスクトップの「前」フォルダ
    後FoldPath = “C:UsersmasahDesktop後” ’圧縮したZipファイルを作成するフォルダをデスクトップの「後」に指定する。

    If FSO.Folderexists(後FoldPath) = False Then
    FSO.CreateFolder 後FoldPath ’「後」フォルダが存在しなければ作成する
    End If

    If FSO.Fileexists(DesktopPath & “圧縮リスト.txt”) = True Then
    FSO.DeleteFile DesktopPath & “圧縮リスト.txt” ’デスクトップに圧縮リスト.txtというファイルがあれば削除する
    End If

    i = 0
    FolderName = Dir(前FoldPath & “*”, vbDirectory)
    ’フォルダごとに中のファイルを圧縮していくがDirは入れ子にできないので、フォルダのパスを配列ArrFolderName()に格納
    Do While FolderName <> “”
    If Left(FolderName, 1) <> “.” Then
    ReDim Preserve ArrFolderName(i)
    ArrFolderName(i) = FolderName
    i = i + 1
    End If
    FolderName = Dir()
    Loop

    For k = 0 To i – 1 ’フォルダの中のファイル名の一覧(ArrFileName)を作成する
    ArrFileName = “”
    FileName = Dir(前FoldPath & “” & ArrFolderName(k) & “*.jpg”, vbNormal)
    Do While FileName <> “”
    If ArrFileName <> “” Then
    ArrFileName = ArrFileName & vbCrLf & 前FoldPath & “” & ArrFolderName(k) & “” & FileName
    Else
    ArrFileName = 前FoldPath & “” & ArrFolderName(k) & “” & FileName
    End If
    FileName = Dir()
    Loop

    With FSO.CreateTextFile(DesktopPath & “圧縮リスト.txt”) ’圧縮リスト.txtにArrFileNameを記載する

    .WriteLine ArrFileName
    .Close
    End With

    Cmd(0) = “Lhaplus.exe /c:zip /n:” & 後FoldPath & “” & ArrFolderName(k) & “.zip” & ” /l:” & DesktopPath & “圧縮リスト.txt”
    WSH.Run “%ComSpec% /c ” & Cmd(0), 7, True
    ’コマンドを実行する
    FSO.DeleteFile DesktopPath & “圧縮リスト.txt” ’圧縮リストを削除する

    Next k ’最後のフォルダまで繰り返す

    Set wdApp = Nothing
    Set FSO = Nothing
    Set WSH = Nothing

    End Sub

    デスクトップにもともと「圧縮リスト.txt」というファイルが存在していると強制的に削除してしまうので、その点だけは注意です。

    指定するパスを変更すると出力前のフォルダ、出力後のフォルダなどを簡単に変更できます。

    コメント