Excel VBA | 実務用 VBA コード集(テンプレ付き)

Excel VBA VBA
スポンサーリンク

VBA拡張版:ZIPファイルにパスワードを設定してセキュアに送信

ここまでで「複数ブックをZIP圧縮してメール添付」する方法を紹介しました。今回はさらに拡張して、ZIPファイルにパスワードを設定してセキュアに送信するテンプレートです。これにより、受信者以外がファイルを開けないようにセキュリティを強化できます。


注意点

  • Windows標準のZIP機能(Shell.Application)ではパスワード設定ができません。
  • 外部ツール(例:7-Zip, WinRAR, PowerShellのCompress-Archiveでは不可)を利用する必要があります。
  • VBAからは Shellコマンドで7-Zipを呼び出すのが一般的です。

サンプルコード(7-Zipを利用)

以下は、7-Zipをインストール済みで 7z.exe が利用可能な環境を前提としています。

Option Explicit

Sub SendSecureZipMail()
    Dim zipFilePath As String
    Dim filesToZip As Variant
    Dim password As String
    Dim sevenZipPath As String
    Dim cmd As String
    
    '=== ZIPファイルパス ===
    zipFilePath = ThisWorkbook.Path & "\secure_report.zip"
    
    '=== 対象ファイル ===
    filesToZip = Array( _
        ThisWorkbook.Path & "\Sales.xlsx", _
        ThisWorkbook.Path & "\Error.xlsx", _
        ThisWorkbook.Path & "\Stock.xlsx")
    
    '=== パスワード設定 ===
    password = "Secret123!"
    
    '=== 7-Zipのパス(環境に合わせて変更) ===
    sevenZipPath = """C:\Program Files\7-Zip\7z.exe"""
    
    '=== コマンド生成 ===
    ' a = add to archive, -p = password, -y = overwrite without prompt
    cmd = sevenZipPath & " a -tzip """ & zipFilePath & """ -p" & password & " -y"
    
    Dim i As Integer
    For i = LBound(filesToZip) To UBound(filesToZip)
        cmd = cmd & " """ & filesToZip(i) & """"
    Next i
    
    '=== ZIP作成実行 ===
    Shell cmd, vbHide
    
    '=== メール送信 ===
    Dim objMsg As Object, objConf As Object
    Set objMsg = CreateObject("CDO.Message")
    Set objConf = CreateObject("CDO.Configuration")
    
    ' SMTP設定(例:Office365)
    With objConf.Fields
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
        .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "your_account@domain.com"
        .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "your_password"
        .Update
    End With
    
    With objMsg
        Set .Configuration = objConf
        .From = "your_account@domain.com"
        .To = "admin@domain.com"
        .Subject = "【VBAタスク通知】セキュアZIPレポート(パスワード付き)"
        
        ' ZIPファイルを添付
        .AddAttachment zipFilePath
        
        ' HTML本文
        .HTMLBody = _
            "<html><body>" & _
            "<h2 style='color:red;'>🔒 セキュアZIPレポート</h2>" & _
            "<p>Sales.xlsx・Error.xlsx・Stock.xlsx をパスワード付きZIPにまとめました。</p>" & _
            "<p>パスワードは別途安全な方法でお知らせします。</p>" & _
            "</body></html>"
        
        .Send
    End With
    
    MsgBox "パスワード付きZIPを添付したメールを送信しました", vbInformation
End Sub
VB

この拡張版のポイント

  • 7-Zipを利用 → VBA単体ではパスワード付きZIP不可
  • ShellコマンドでZIP作成7z.exe a -tzip -pPASSWORD
  • メール送信時はパスワードを別経路で通知 → セキュリティ強化

実務でのメリット

  • セキュリティ強化 → ZIPにパスワードを設定して情報漏洩を防止
  • 柔軟性 → 元ファイルをそのまま配信可能
  • 完全自動化可能 → タスクスケジューラと組み合わせれば「毎月のセキュアZIPレポート」を自動送信

✅ まとめ

  • VBA単体では不可 → 7-Zipなど外部ツールを利用
  • Shellコマンドでパスワード付きZIPを作成
  • メール添付してセキュアに配信
タイトルとURLをコピーしました