電子書籍をタブレット・スマホで読むにはZipが便利
私はよく電子書籍をjpg形式で保管しているのですが、通常のフォルダで管理しているとスマホ、タブレットに入れるとギャラリーの中に電子書籍のデータが入ったり、また開くアプリによってページ順がばらばらになったりしていました。
「.」から始まるフォルダを作成しておけばギャラリーの中に画像が入り込むことはなくなりますが、管理が面倒になります。
(私が使っているスマホはパソコンと接続しても「.」から始まるフォルダが表示されません。)
今回は私が持っている電子書籍のデータを一括でZipフォルダに変更するために作成したVBAコードを紹介します。
LhaPlusという圧縮ソフトを使用する
「.CopyHere」というメソッドを用いたWindows標準の機能でもZipファイルは作成できますが、たくさんのファイルをZipフォルダの中に入れようとするとエラーが起こり途中で止まってしまいました。
この作成方法はWindowsのサポート対象外の機能のようでうまく動作しない場合があるとMicrosoftのページでも記載されています。
そこで圧縮のフリーソフトで有名なLhaPlusというものを使用することにしました。LhaPlusは色々なところでダウンロードできますが、私は窓の杜のページからダウンロードしました。
このLhaPlusはコマンドラインで操作できるのが特徴で、VBAと組み合わせるとかなり自由な操作が可能になります。
スポンサーリンク
LhaPlusのコマンドライン
私が把握しているコマンドラインでのLhaPlusを操作するコードは以下のものです。
LhaPlusのコマンドの種類
よくあるネットで紹介されているLhaPlusの使用方法
圧縮したいファイルが複数ある場合は半角スペースを空けて記入することで一つの圧縮フォルダに複数のファイルを格納することができるようです。
このコードをそのまま使用した場合、今回の目的に対して2点問題が生じました。
1つ目は圧縮フォルダの名前が先頭のファイル名になってしまうことです。これはあとで変更しても良いので大した問題ではないですが、できれば解決しておきたい部分です。
そして2つ目が命取りの問題で、コマンドラインに出力する文字数の制限を超えることです。
電子書籍は一つのフォルダに300ページくらい入っているものがあって、全部のフルパスを指定していくとコマンドラインに出力する文字数が軽く10,000文字を超えてしまっていました。
Microsoftのサポートページによるとコマンドラインで使用できる文字数は8,191文字で、超えた分がエラーになってしまいます。
出力できない場合があるのでこのコードは使用できず他の方法を検討しました。
私がLhaPlusを操作するのに使用したコード
私がVBAに組み込んだコマンドラインのコードは以下の通りです。
「/n:」を使用して圧縮フォルダの名前を指定して、圧縮したいファイル名の一覧を記載したテキストファイルを「/l:」を用いて呼び出すことにしました。
圧縮したいファイル名の一覧はテキストファイルで、1行に1つのファイル名を記載しておくと呼び出して使用できるようになります。
私はデスクトップに「圧縮リスト.txt」というファイルを作成してする手順でVBAコードを作りました。
VBAコード紹介
私が作成したVBAコードは以下の通りです。
デスクトップの「前」の中にあるフォルダをすべて「後」というフォルダに圧縮ファイルとして出力するコードです。
圧縮ファイルの中にはダイレクトにファイルが入っていて、通常のフォルダとほとんど同じ扱いで処理できるようになっています。
VBAでコマンドラインを操作する方法はこちらの記事を参考にしてください。
br>
Dim FSO As Object, WSH As Object
Dim Cmd(4) As String
br>
Dim 前FoldPath As String, 後FoldPath As String
Dim FolderName As String, FileName As String
br>
Dim ArrFileName As String, ArrFolderName() As String
Dim DesktopPath As String
br>
Dim i As Long, k As Long
br>
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Set WSH = CreateObject(“Wscript.Shell”)
br>
WSH.CurrentDirectory = “C:Program Files (x86)Lhaplus” ’LhaPlusがあるフォルダをカレントディレクトリに指定する
br>
DesktopPath = WSH.SpecialFolders(“Desktop”)
前FoldPath = “C:UsersmasahDesktop前” ’圧縮したいフォルダを格納するフォルダを決定する。今回はデスクトップの「前」フォルダ
後FoldPath = “C:UsersmasahDesktop後” ’圧縮したZipファイルを作成するフォルダをデスクトップの「後」に指定する。
br>
If FSO.Folderexists(後FoldPath) = False Then
FSO.CreateFolder 後FoldPath ’「後」フォルダが存在しなければ作成する
End If
br>
If FSO.Fileexists(DesktopPath & “圧縮リスト.txt”) = True Then
FSO.DeleteFile DesktopPath & “圧縮リスト.txt” ’デスクトップに圧縮リスト.txtというファイルがあれば削除する
End If
br>
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
br>
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
br>
With FSO.CreateTextFile(DesktopPath & “圧縮リスト.txt”) ’圧縮リスト.txtにArrFileNameを記載する
br>
.WriteLine ArrFileName
.Close
End With
br>
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” ’圧縮リストを削除する
br>
Next k ’最後のフォルダまで繰り返す
br>
Set wdApp = Nothing
Set FSO = Nothing
Set WSH = Nothing
br>
End Sub
デスクトップにもともと「圧縮リスト.txt」というファイルが存在していると強制的に削除してしまうので、その点だけは注意です。
指定するパスを変更すると出力前のフォルダ、出力後のフォルダなどを簡単に変更できます。
コメント