VBAでExcelのシートをコピーする処理を作成していると、「コンパイルエラー:修正候補:式」と表示され、コードが実行できないことがあります。特にWorksheet.Copyを使ったテンプレート複製処理では、記述ミスや変数宣言の誤りが原因で発生するケースが多くあります。この記事では、テンプレートシートを新規ブックへコピーする際に発生するエラーの原因と、正しい修正方法について解説します。
「コンパイルエラー:修正候補:式」が発生する主な原因
VBAの「コンパイルエラー:修正候補:式」は、Excelがコードを読み取った時点で、文法的に正しくない部分を発見した場合に表示されます。
今回のようなケースでは、template.Copy After:=newWB.Sheets(newWB.Sheets.Count)自体の書き方が大きく間違っているわけではありません。Worksheet.Copyの構文としては正しい形式です。
原因は、その前後にあるコードの記述ミスや、コピー処理以降の変数設定部分に問題がある可能性があります。
Worksheet.Copyの正しい使い方を確認する
Worksheet.Copyでシートをコピーする場合、コピー先を指定するにはAfterまたはBeforeを使用します。
例えば、新しいブックの最後尾へテンプレートシートをコピーする場合は、以下のように記述します。
template.Copy After:=newWB.Sheets(newWB.Sheets.Count)
この処理によって、newWBの最後のシートの後ろにtemplateシートのコピーが作成されます。
その後、コピーされたシートを取得する場合は、以下のように記述します。
Set newWS = newWB.Sheets(newWB.Sheets.Count)
提示されたコードで発生している問題点
提示されたコードでは、テンプレートコピー処理が重複しています。
以下の部分です。
' テンプレートをコピー
template.Copy After:=newWB.Sheets(newWB.Sheets.Count)
SetnewWS= daysInMonth
' テンプレートをコピー
template.Copy After:=newWB.Sheets(newWB.Sheets.Count)
SetnewWS=newWB.Sheets(newWB.Sheets.Count)
最初のSetnewWS= daysInMonthが問題です。Setはオブジェクト変数へ代入するときに使用する命令であり、daysInMonthはLong型の数値変数なので使用できません。
また、VBAではSetnewWSのようにSetと変数名を詰めて書くことはできません。正しくはSet newWSのようにスペースが必要です。
修正後のテンプレートコピー処理
For文内の処理は以下のように修正すると正常に動作します。
For dayIdx = 1 To daysInMonth
' テンプレートをコピー
template.Copy After:=newWB.Sheets(newWB.Sheets.Count)
Set newWS = newWB.Sheets(newWB.Sheets.Count)
Next dayIdx
このように、テンプレートコピーは1回だけ実行し、コピー後のシートをnewWSへ格納します。
例えば31日分の日報を作成する場合、For文が31回繰り返され、そのたびにテンプレートシートが複製される仕組みになります。
新規ブック作成時の注意点
Workbookを新規作成すると、Excelの設定によっては最初から1枚の空白シートが存在します。
Set newWB=Workbooks.Add(xlWBATWorksheet)では、空白シート1枚だけのブックが作成されます。そのため、テンプレートをコピーすると最初の空白シートが残った状態になります。
不要な空白シートを削除したい場合は、コピー処理後に削除する処理を追加すると、完成した日報ファイルをきれいにできます。
VBAで変数代入するときの基本ルール
今回のエラーでは、Setの使い方が原因の一つになっています。VBAではオブジェクトと通常の値で代入方法が異なります。
| 種類 | 代入方法 |
|---|---|
| Worksheet、Workbookなどのオブジェクト | Setを使用 |
| 数値、文字列などの値 | Setは使用しない |
例えば、Worksheetを取得する場合はSet newWS = Sheets(1)ですが、日数を保存する場合はdaysInMonth = 31のように記述します。
まとめ|Worksheet.Copyエラーは文法と変数設定を確認する
VBAの「コンパイルエラー:修正候補:式」は、指定した行だけではなく、その周辺の記述ミスが原因で発生することがあります。
今回の場合、Worksheet.Copyの構文自体は正しく、問題はSetnewWS= daysInMonthやSetの記述方法、コピー処理の重複でした。
VBAでシートを複製する場合は、コピー処理、取得処理、変数の種類を整理して記述することで、エラーを防ぎながら安定したマクロを作成できます。


コメント