【VBA】Lhaplusのパスワード付きファイルを解凍

フリー写真素材ぱくたそ 

あまりに苦労したので、覚書。

IE利用のツールにログインして、
遷移したページで一括ダウンロードしたファイルを解凍して、
各々のエクセルファイルからIDを抜き出して、
Accessに入っているデータと結び付けて、
また別のIDのフォルダに格納するコードを書いていたのだが、
意外なところでつまづいた。

コマンドラインでパスワードをつけて圧縮するやり方があるのは知っていたが、
解凍ができないのは知らなかった。

まあ、なんとなくセキュリティとかの観点でわからないでもないが、
解凍を自動でできないと、
色々な自動化でつまづくのよ、実際。
で、とりあえずネットで検索。
すぐ出てくるのがこのタイプ。

Set zipObj = shellObj.Namespace(fileObj.Path).Items
 Application.SendKeys strPass & "{Enter}"
 ret = shellObj.Namespace("C:").CopyHere(zipObj)

標準機能でSendkeys利用のこのタイプ。
最初は普通に解凍できたので、
いいやこれで、とか思ってたら、
ある日から、何度やってもエクセルに「予期しないエラー」が出てしまう結果に。

埒が明かないので、コードを変更。
とりあえず、Lhaplusをコマンドラインから実行させるコードにする。

 Shell ("C:\Program Files\Lhaplus\Lhaplus.exe /o:C: C:\zipFile\" & honjitu & "\" & fileObj.Name)

ただやはり、PWが入れられない。
コマンド使って、Sendkeys使っているコードも見つからない。

試行錯誤して書く。

Sub Zip解凍()

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
 
   'ファイルオブジェクトの作成
    Dim fileObj As Object
 
    '本日の日付をyyyymmdd形式にする
    Dim honjitu As String
    honjitu = Format(Date, "yyyymmdd")
 
    'フォルダ内の全てのファイルを調べる
    For Each fileObj In fso.GetFolder("C:\zipFile\" & honjitu).Files
 
        '拡張子のチェック
        If fso.GetextensionName(fileObj) = "zip" Then
     
'       Lhaplusのコマンド方法
        SendKeys "pass" & "{Enter}",True
     
        Sleep (2000)

        Shell ("C:\Program Files\Lhaplus\Lhaplus.exe /o:C: C:\zipFile\" & honjitu & "\" & fileObj.Name)

        Sleep (5000)

        End If
 
    Next fileObj
 
    '後処理
    Set fso = Nothing
    Set fileObj = Nothing

End Sub

ただ、どうしても最後のファイルだけ、パスワードを入れるボックスが出た時点で終わる。(解凍されない)

ここから、
改めてSendkeysを調べると、
「False (既定値) の場合は、キーが送信された直後のプロシージャに制御が戻されます。 True の場合、キーボード操作は制御がプロシージャに戻される前に処理されている必要があります。」
と書いてあったので、
もしかしてFalse?と思い、
[,True]を削除。

SendKeys "pass" & "{Enter}",True

SendKeys "pass" & "{Enter}"

DoEventsで戻すと書いてあったので、End Ifの前と後ろにDoEvents
途中で、End Ifのあとはいらないんじゃないかと思って、
消したら動かなかったので、訳わかってないけど、両方にしている。

Sleep (5000)

        End If

    Next fileObj


Sleep (5000)

  DoEvents
        End If
   DoEvents

    Next fileObj

今のところ、安定して動いている。
(上のコードの赤い部分を下の青いコードに取り換えた)

おそらく、
環境に左右されるので、
Sleepの秒数とかは変えてみて、しっくりくる秒数にしてください。

あと、Format関数はAccessしか使えません。
ExcelやVBSの時は使えませんので、他の方法に直してください。