ワークシートの削除

カテゴリー名: [ExcelVBAとOLE ワークシートの操作

2016/09/03

ワークシートを削除する方法を取り上げます。

付随して、警告メッセージの抑制、エラー発生の回避にも触れます。


《このページの目次》


    

1. 概要

 ワークシートの削除は、Deleteメソッドで行います。

 Deleteメソッドの戻り値は True, False のどちらかです。
削除に成功した時は True を返します。

(1) Deleteメソッドと警告メッセージ

 ActiveSheet.Delete とすればアクティブシートが削除されます。

 Worksheets("Sheet3").Delete とすれば Sheet3 が削除されます。

 ただし、削除前に次ぎのような警告メッセージが出ます。

選択したシートに、データが存在する可能性があります。データを完全に削除するには、[削除]をクリックしてください。

 メッセージと一緒に [削除], [キャンセル] の二つのボタンが出て、[削除]をクリックすると、そこで初めてワークシートの削除が実行されます。

    

 この警告メッセージを出さずに、直ちに削除が行われるようにするには、下のようにして警告メッセージの出力を抑制します。

  Application.DisplayAlerts = False
  ActiveSheet.Delete
  Application.DisplayAlerts = True

 DisplayAlertsプロパティにFalseをセットすると警告メッセージの出力が抑制され、Trueをセットすれば再び警告メッセージが出るようになります。

    

(2) ワークシートが残り1枚の場合のエラー発生

 ワークブックにワークシートが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

 この記述方法は、様々なエラー発生に対応できるので便利ですが、避けるべきでないエラーも無視してしまい、もっと大きなトラブルにつながる危険があります。利用は最低限にしておくのが無難です。

目次に戻る


    

2. VBAマクロ

 VBAマクロの例を掲げます。

 アクティブシートを削除し、次に Sheet3 を削除します。

 最後に、アクティブシートのA1セルにそのワークシート名を書き込みます。

    

△ macro14.txt

1Sub Macro1()
2    Application.DisplayAlerts = False
3    ActiveSheet.Delete
4    Worksheets("Sheet3").Delete
5    Application.DisplayAlerts = True
6    Range("A1").Value = ActiveSheet.Name
7End Sub

目次に戻る


    

3. OLEを利用するVBScript

 先のマクロと同じ庶路を行う VBScript を掲げます。

△ vovXL14.vbs

 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 を簡単に呼び出せるようにしてあるのだと思います。

 今回、その仕様を利用しました。

目次に戻る


    

4. OLEを利用するJScript

 前述の VBScript と同じ処理を行う JScript は、下のとおりです。

△ vovXL14.js

 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();

〜 以上 〜