MENU

メール送付時に添付するデータの圧縮とパスワード付与

たとえば、温暖化対策報告書の案内メール作成に関するマクロ開発のためのプロンプト例をご紹介します。

以下のプロンプトをお使いください。

以下のポイントを押さえてプロンプトを組み立てると、Lhaplus(cud.exe)へのコマンド渡しミスによる「アーカイブファイルではありません」エラーを防ぎやすくなります。

⸻

1. フォルダ圧縮時はワイルドカード指定を明示する
	•	理由:cud.exe にフォルダを直接与えると「ファイル指定」として解釈され、アーカイブでないと判断されることがあります。
	•	改善策:「対象フォルダ*」や「対象フォルダ*.*」など、圧縮対象をワイルドカードで指定するようプロンプトに明記します。

2. スペースを含むパスは必ず二重引用符で囲む
	•	理由:Program Files や顧客名フォルダなど、パス中の空白でコマンドが分断されるとエラーの元になります。
	•	改善策:プロンプト内で「”C:\Program Files (x86)\Lhaplus\cud.exe”」や「”” & TargetFolder & “*””」のように、コマンド全体と引数をクォートすることを指示します。

3. Exec の同期実行・ステータスチェックを厳格に
	•	理由:非同期実行だと圧縮が終わる前に次ステップへ進み、ファイル未完成で「アーカイブではない」と判断されます。
	•	改善策:
	1.	Set proc = wsh.Exec(cmd)
	2.	Do While proc.Status = WshRunning: Loop
	3.	If proc.ExitCode <> 0 Then …
のパターンを、プロンプトに明確に書いてもらいます。

4. ワイルドカード適用/存在チェックのエラー処理
	•	理由:フォルダが空、またはパスが間違っているとワイルドカードが展開されず、アーカイブ対象がなくエラーになります。
	•	改善策:「FolderExists」「FileExists」で事前にチェックし、空フォルダの場合はスキップまたはメッセージを出すロジックを入れるようお願いしましょう。

⸻

サンプル改善プロンプト

以下の文章をそのままプロンプトとして投げてみてください:

**「Excel VBA で指定フォルダをパスワード付き ZIP 圧縮する関数を作成してください。

■前提
	•	Lhaplus のコマンドライン版(cud.exe)は C:\Program Files (x86)\Lhaplus\cud.exe にあります。
	•	圧縮対象はフォルダ単位。フォルダ内のすべてのファイルをワイルドカード(\*)で圧縮します。
	•	ファイル・フォルダのパスに空白が含まれる可能性があるため、すべて二重引用符で囲ってください。

■要件
	1.	ファイルシステムオブジェクトでフォルダ存在チェック。存在しなければ処理中断。
	2.	WshShell.Exec で ”C:\Program Files (x86)\Lhaplus\cud.exe” a -tzip -p<Password> “<ResultZipPath>” “<SourceFolderPath>\*” を同期実行。
	3.	Do While proc.Status = WshRunning: Loop で完了待機。
	4.	proc.ExitCode を確認し、0 以外ならメッセージを表示して処理を中断。
	5.	一定ループ上限(例: 3000 回)を超えたらタイムアウトとして中断。
	6.	Application.StatusBar で進捗(○件目/総件数)を表示。
	7.	関数シグネチャは

Function CompressFolderWithPassword( _
    ByVal SourceFolderPath As String, _
    ByVal ResultFolderPath As String, _
    ByVal Password As String _
) As Boolean

・戻り値:正常終了なら False、異常終了なら True

■実装時の注意点
	•	ワイルドカードを省くとフォルダ単体と見なされずエラーになる。
	•	二重引用符を忘れるとスペースで引数が切れて失敗する。
	•	ExitCode と Status プロパティのチェックを必ず入れること。
」

⸻

なぜこのプロンプトが効くのか
	1.	ワイルドカード指示 で「フォルダをそのままファイルとみなさせない」
	2.	全パスを引用符で囲む ことでスペース問題を回避
	3.	同期実行+ExitCodeチェック で「完了前進行」「異常無視」を防止
	4.	事前チェックとタイムアウト で想定外ケースの安全網を構築

これでエラー「アーカイブファイルではありません」は激減し、スムーズにフォルダ圧縮+パスワード設定が行えます。ぜひお試しください!
応援しています😊 効率化、がんばりましょう!

このプロンプトは以下の点を考慮しています:

  1. 業務内容と要件を明確に説明
  2. 必要な技術的要素(Lhaplus、ファイル選択ダイアログ)を明示
  3. 具体的なデータフォーマット(列の情報)を提供
  4. 期待する処理の流れを順序立てて説明
  5. 技術的な実装詳細を示唆

プロンプトの長さと詳細さはChatGPTが適切なコードを生成するために十分な情報を含んでいます。これで具体的で実用的なマクロコードが得られるはずです。​​​​​​​​​​​​​​​​

Option Explicit

‘——————————————

‘【汎用関数】フォルダ/ファイルを ZIP 圧縮し、パスワードを設定

‘ 引数:

‘   TargetPath  : 圧縮対象(ファイル or フォルダ)のフルパス

‘   ZipFullPath : 作成する ZIP ファイルのフルパス

‘   Password    : ZIP に設定するパスワード

‘ 戻り値:

‘   True  = 異常終了

‘   False = 正常終了

‘——————————————

Public Function CompressWithPassword( _

    ByVal TargetPath As String, _

    ByVal ZipFullPath As String, _

    ByVal Password As String _

) As Boolean

    Dim wsh   As Object

    Dim exec  As Object

    Dim cmd   As String

    Dim cnt   As Long, maxCnt As Long

    Dim fso   As Object

    On Error GoTo ErrHandler

    Set fso = CreateObject(“Scripting.FileSystemObject”)

    ‘ 1) 対象ファイル/フォルダの存在チェック

    If Not fso.FileExists(TargetPath) And Not fso.FolderExists(TargetPath) Then

        MsgBox “圧縮対象が見つかりません: ” & TargetPath, vbExclamation

        CompressWithPassword = True

        Exit Function

    End If

    ‘ 2) 出力先フォルダの存在チェック

    If Not fso.FolderExists(fso.GetParentFolderName(ZipFullPath)) Then

        MsgBox “出力先フォルダが存在しません: ” & fso.GetParentFolderName(ZipFullPath), vbExclamation

        CompressWithPassword = True

        Exit Function

    End If

    ‘ 3) コマンドライン組立

    ‘    Lhaplus の CLI 実行ファイルを使用

    cmd = “””” & “C:\Program Files (x86)\Lhaplus\lplz.exe” & “””” & _

          ” -ep1 -p ” & Password & _

          ” -o ” & “””” & ZipFullPath & “””” & _

          ” ” & “””” & TargetPath & “”””

    ‘ 4) 同期実行

    Set wsh = CreateObject(“WScript.Shell”)

    Set exec = wsh.Exec(cmd)

    ‘ 5) タイムアウト設定(例:5秒 × 20ループ = 100秒)

    maxCnt = 20 * 5   ‘ 5 秒を 20 ループで

    cnt = 0

    Do While exec.Status = 0  ‘ 0=WshRunning

        DoEvents

        cnt = cnt + 1

        If cnt > maxCnt Then

            MsgBox “圧縮がタイムアウトしました。無限ループと判断し中断します。”, vbCritical

            CompressWithPassword = True

            Exit Function

        End If

        Application.StatusBar = “圧縮中: ” & ZipFullPath & ” (” & cnt & “秒経過)”

        Application.Wait Now + TimeValue(“0:00:01”)  ‘ 1秒待機

    Loop

    ‘ 6) 終了コード確認

    If exec.ExitCode <> 0 Then

        MsgBox “Lhaplus の実行でエラーが発生しました。コード=” & exec.ExitCode, vbCritical

        CompressWithPassword = True

        Exit Function

    End If

    ‘ 正常終了

    CompressWithPassword = False

    Application.StatusBar = False

Cleanup:

    On Error Resume Next

    Set exec = Nothing

    Set wsh  = Nothing

    Set fso  = Nothing

    Exit Function

ErrHandler:

    MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical

    CompressWithPassword = True

    Resume Cleanup

End Function

‘——————————————

‘【メイン処理】顧客リストを読み取り、一括で圧縮&パスワード設定

‘——————————————

Public Sub BatchCompress()

    Dim srcFolder    As String

    Dim outFolder    As String

    Dim wb           As Workbook

    Dim ws           As Worksheet

    Dim lastRow      As Long

    Dim i            As Long

    Dim custName     As String

    Dim password     As String

    Dim zipName      As String

    Dim targetPath   As String

    Dim zipFullPath  As String

    Dim resultErr    As Boolean

    On Error GoTo ErrHandler

    Set wb = ThisWorkbook

    Set ws = wb.Sheets(“環境Z番号、xI5X”)

    ‘ 1) 保存先フォルダ選択

    With Application.FileDialog(msoFileDialogFolderPicker)

        .Title = “圧縮ファイルの保存先フォルダを選択してください”

        If .Show <> -1 Then Exit Sub

        outFolder = .SelectedItems(1)

    End With

    ‘ 2) 元データフォルダ選択

    With Application.FileDialog(msoFileDialogFolderPicker)

        .Title = “元データフォルダを選択してください”

        If .Show <> -1 Then Exit Sub

        srcFolder = .SelectedItems(1)

    End With

    ‘ 3) データ最終行取得(D列が顧客名、E列がパスワード(Z番号))

    lastRow = ws.Cells(ws.Rows.Count, “D”).End(xlUp).Row

    ‘ 4) ループ処理

    For i = 2 To lastRow

        custName = Trim(ws.Cells(i, “D”).Value)

        password = Trim(ws.Cells(i, “E”).Value)

        If custName <> “” And password <> “” Then

            ‘ ZIP 名を作成

            zipName = “【説明資料】” & custName & “様.zip”

            targetPath  = srcFolder

            zipFullPath = outFolder & “\” & zipName

            ‘ ステータス表示

            Application.StatusBar = “【” & i – 1 & “/” & lastRow – 1 & “】” & custName & ” を圧縮中…”

            ‘ 圧縮関数呼び出し

            resultErr = CompressWithPassword(targetPath, zipFullPath, password)

            If resultErr Then

                MsgBox “処理を中断します。顧客:” & custName, vbExclamation

                Exit Sub

            End If

        End If

    Next i

    Application.StatusBar = False

    MsgBox “すべての圧縮処理が完了しました!”, vbInformation

    Exit Sub

ErrHandler:

    MsgBox “バッチ処理でエラーが発生しました: ” & Err.Description, vbCritical

    Application.StatusBar = False

End Sub

よかったらシェアしてね!
  • URLをコピーしました!
目次