カテゴリー名: [ExcelVBAとOLE ワークシートの操作]
ワークシートを削除する方法を取り上げます。
付随して、警告メッセージの抑制、エラー発生の回避にも触れます。
ワークシートの削除は、Deleteメソッドで行います。
Deleteメソッドの戻り値は True, False のどちらかです。
削除に成功した時は True を返します。
ActiveSheet.Delete
とすればアクティブシートが削除されます。
Worksheets("Sheet3").Delete
とすれば Sheet3 が削除されます。
ただし、削除前に次ぎのような警告メッセージが出ます。
選択したシートに、データが存在する可能性があります。データを完全に削除するには、[削除]をクリックしてください。
メッセージと一緒に [削除], [キャンセル] の二つのボタンが出て、[削除]をクリックすると、そこで初めてワークシートの削除が実行されます。
この警告メッセージを出さずに、直ちに削除が行われるようにするには、下のようにして警告メッセージの出力を抑制します。
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
DisplayAlertsプロパティにFalseをセットすると警告メッセージの出力が抑制され、Trueをセットすれば再び警告メッセージが出るようになります。
ワークブックにワークシートが1枚しかない状態で、そのワークシートを削除しようとするとエラーメッセージが出ます。
ワークブックには、少なくとも1枚のワークシートが所属していなければならないためです。
この時のメッセージは、警告メッセージではなくエラーメッセージです。なので、DisplayAlertsプロパティをFalseにしていてもエラーメッセージは出ます。
このエラーを回避するには、Worksheets.Count でワークシートの枚数をみて、それが2以上であるとの条件の下で ActiveSheet.Delete
などと実行してやればいいことになります。
エラーを回避するためのコードを掲げてみます。条件分岐のIf文を用います。
If Worksheets.Count >= 2 Then
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
End If
上のコードだと、ワークシートが残り1枚の時に何もしません。
ユーザーからすれば「削除しようとしてもできない」と戸惑うかもしれません。
Else文を追加して、「残り1枚なので削除できません」といったメッセージを出す方が新設でしょうか。
エラー発生を回避する方法をもう一つ書いておきます。
On Error Resume Next
という1行を記述すると、その次のステップでエラーが発生してもそれを無視して、更にその次のステップに進みます。
具体的な記述としては下のようになります。
Application.DisplayAlerts = False
On Error Resume Next
ActiveSheet.Delete
Application.DisplayAlerts = True
この記述方法は、様々なエラー発生に対応できるので便利ですが、避けるべきでないエラーも無視してしまい、もっと大きなトラブルにつながる危険があります。利用は最低限にしておくのが無難です。
VBAマクロの例を掲げます。
アクティブシートを削除し、次に Sheet3 を削除します。
最後に、アクティブシートのA1セルにそのワークシート名を書き込みます。
先のマクロと同じ庶路を行う VBScript を掲げます。
1' ワークシートの削除 2Option Explicit 3Dim FSO, BookPath 4Dim EXLapp, WBobj 5Const xlWorkbookNormal = -4143 6 7Set FSO = CreateObject("Scripting.FileSystemObject") 8BookPath = FSO.GetAbsolutePathName("Book1.xls") 9If (FSO.FileExists(BookPath) = True) Then FSO.DeleteFile(BookPath) 10Set EXLapp = CreateObject("Excel.Application") ' Excelの起動 11EXLapp.Visible = True ' Excelを見える状態に 12Set WBobj = EXLapp.Workbooks.Add() ' Workbookの新規作成 13With WBobj 14 .Application.DisplayAlerts = False 15 .ActiveSheet.Delete 16 .Worksheets("Sheet3").Delete 17 .Application.DisplayAlerts = True 18 .ActiveSheet.Range("A1").Value = .ActiveSheet.Name 19End With 20WBobj.SaveAs BookPath, xlWorkbookNormal 21EXLapp.quit
上のVBScriptの中で .Application
というのが出てきます。
これは WBobj.Application
の意味です。
ほんとは Application の方が WBobj(ワークブックオブジェクト)よりも上位にあるので、WBobj.Application
という記述は奇妙な感じです。
ただ、Application がいろいろな場面で必要になるため、便宜上、様々なオブジェクトから Application を簡単に呼び出せるようにしてあるのだと思います。
今回、その仕様を利用しました。
前述の VBScript と同じ処理を行う JScript は、下のとおりです。
1// ワークシートの削除 2var fso, bookPath; 3var ExlApp, wb; 4var xlWorkbookNormal = -4143; 5 6fso = WScript.CreateObject("Scripting.FileSystemObject"); 7bookPath = fso.GetAbsolutePathName("Book1.xls"); 8if (fso.FileExists(bookPath)) fso.DeleteFile(bookPath); 9ExlApp = WScript.CreateObject("Excel.Application"); // Excelの起動 10ExlApp.Visible = true; // Excelを見える状態に 11wb = ExlApp.Workbooks.Add(); // Workbookの新規作成 12with (wb) { 13 Application.DisplayAlerts = false; 14 ActiveSheet.Delete(); 15 Worksheets("Sheet3").Delete(); 16 Application.DisplayAlerts = true; 17 ActiveSheet.Range("A1").Value = ActiveSheet.Name; 18} 19wb.SaveAs(bookPath, xlWorkbookNormal); 20ExlApp.Quit();
〜 以上 〜