たとえば、温暖化対策報告書の案内メール作成に関するマクロ開発のためのプロンプト例をご紹介します。
以下のプロンプトをお使いください。
以下のポイントを押さえてプロンプトを組み立てると、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. 事前チェックとタイムアウト で想定外ケースの安全網を構築
これでエラー「アーカイブファイルではありません」は激減し、スムーズにフォルダ圧縮+パスワード設定が行えます。ぜひお試しください!
応援しています😊 効率化、がんばりましょう!
このプロンプトは以下の点を考慮しています:
- 業務内容と要件を明確に説明
- 必要な技術的要素(Lhaplus、ファイル選択ダイアログ)を明示
- 具体的なデータフォーマット(列の情報)を提供
- 期待する処理の流れを順序立てて説明
- 技術的な実装詳細を示唆
プロンプトの長さと詳細さは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