神Excelの雑記

闇Excelでバックオフィスの人です。メモ帳的な。

ファイルの暗号化・圧縮①方法編

VBAによるファイルの簡単な暗号化

Wordファイルにパスワードをかけて送りたいという要望があったときに思いついたもの。 結論としては、顧客が許すなら、7-zip入れてパスワード付き圧縮しちまえ。

Wordファイルを暗号化する方法もないわけじゃないが、圧縮の方が楽だし、他のファイル形式でも使える。標準機能でも圧縮はできるが、コードが長くてうんざりする。簡潔さと応用を考えると、7-Zipを使う方法がベストプラクティスだ。

7-Zipの準備

7-Zipをインストールしよう

sevenzip.osdn.jp

コマンドラインバージョンもあるが、exeやmsiファイルを普通にインストールすればOK。インストールフォルダは確認しておくこと。今回というか、既定では以下だろう。

C:\Program Files\7-Zip\

7-Zipによるコマンドラインによる圧縮方法

sevenzip.osdn.jp

公式のマニュアルがあるので、軽く見ておこう。簡単!

圧縮ツールの概要

UI概要

基本のUIはざっと以下のようなものだろう。今回は、圧縮方法を紹介するだけなので、流し見ておいてもらいたい。

圧縮ツールUI(簡易版)
圧縮ツールUI(簡易版)

以下については、後日紹介する。

  • 圧縮ツールのUI
  • 実際に対象レポート名を特定する方法
  • パスワードの生成

【共通プロシージャ】コマンド実行

まずはテスト用にコマンドを実行するプロシージャを作ろう。
ShowPromptはウィンドウを出すかどうか。デバッグ用に残したが、いらないかもしれない。少なくとも、意味が直感的に分かる変数名にしておくこと。

Sub CmdExe(ByVal CmdStc As Variant, Optional ByVal ShowPrmpt As Long)
    Dim WSH As Object
    Set WSH = CreateObject("WScript.Shell")
    WSH.Run CmdStc, ShowPrmpt, True
End Sub

「テスト用に」の意味だが、大量のファイルを処理するなら、batファイルに書きだした方が効率が良いからである。バッチ処理の方法は「ファイルの暗号化・圧縮②」以降に記載する。

【ツール専用プロシージャ】圧縮コマンドを投げる

次に、設定シートから必要な変数を拾ってきて、投げるだけのコードを書こう。
bat出力を含む、後の拡張性を考えれば、以下のようなものだろう。

Sub ZipFile()
    Call SetHack
    Select Case GetVal_Dft("実行タイプ")
        Case 0
            CmdStc = GetVal_Dft("単体コマンド")
            Call CmdExe(CmdStc)
    End Select
End Sub

god-of-excel.hateblo.jp

これは、以前の記事で紹介したSetHackプロシージャ(固定値の設定)、GetVal_Dft関数(変数取得)などを使っている。
ワークシートを有効活用すれば、ここまでVBAを簡略化できるのだ。

エラーが発生したとき、確認するのは自分ではないかもしれない。いかなる場合もエラーが発生しないように膨大なコードを組むこともまた、エラーの温床となる。スタッフ自身が「ツールの実行時、エラー時、どこを確認すべきかがわかる」状態にしておくことが重要だ。


思いつきだが、ツール化するときは、以前の記事に書いたAddin_Switchのように、ExeFuncのような名前で呼び出し関数を作っても良いと思う。あらかじめCmdExeの内部にOptionalでNameProcとMemoProcを持っておいて、エラートラップをかければ、説明が出てくる。で、実行したければApplication.Run ExeFuncする。自作関数には、変数で説明を持っておくのが、保守性も可読性も維持されやすくおすすめだ。 要するに、このままコピペしてもツールとしては分かりづらいから、アレンジして使ってな、と言いたかった。 あとで書きなおす。