機能と数式 | VBA | セミナー | オンラインソフト | お問い合わせ | その他
Top > Excel > VBA

Worksheets.Addが失敗するケース



新しいワークシートを挿入するには、次のようにします。

Sub Sample1()
    Worksheets.Add
End Sub

簡単ですね。実行すると、アクティブシートの左に、1枚の新しいワークシートが挿入されます。このAddメソッドには、次の引数があります。

Before:指定したシートの左に挿入します
After:指定したシートの右に挿入します
Count:指定した枚数のシートを挿入します
Type:指定した種類のシートを挿入します

引数Beforeや引数Afterを指定しないと、アクティブシートの左に挿入されます。引数Countを指定しないと、1枚のワークシートが挿入されます。したがって、引数を何も指定しないで

Sub Sample1()
    Worksheets.Add
End Sub

のように実行すると、アクティブシートの左に、1枚の新しいワークシートが挿入されます。ということは、上記のSample1は、下記Sample2と同じ意味になります。

Sub Sample2()
    Worksheets.Add Before:=ActiveSheet, Count:=1
End Sub

同じ意味にはなりますが、両者は実行結果が異なるケースがあります。たとえば、アクティブブックに[Sheet1][Sheet2][Sheet3]と3枚のワークシートが存在したとします。ここで、[Sheet2]と[Sheet3]を選択(グループ化)します。複数のシートをグループ化するには、シート見出しを、ShiftキーやCtrlキーを押しながらクリックします。



さて、[Sheet2]と[Sheet3]をグループ化した状態で

Sub Sample1()
    Worksheets.Add
End Sub

を実行すると、挿入されるワークシートは、1枚ではなく2枚になります。



Addメソッドのヘルプには、引数Countの解説に次のように書かれています。
「既定値は1です」
省略するとどうなるか、は書かれていませんが、既定値が1と言われれば、
「省略すると1を指定したとみなされる」
と普通は思いますよね。
しかし、Addメソッドは、現在選択されているシートの数と同じ数の新シートを挿入するようです。それも「連続してグループ化されている場合」は、です。

[Sheet1][Sheet2][Sheet3]と3枚のワークシートが存在するブックで、今度は[Sheet1]と[Sheet3]を選択(グループ化)してみます。非連続のシートです。



この状態で

Sub Sample1()
    Worksheets.Add
End Sub

を実行すると、エラーになります。



エラーメッセージは、
「そのコマンドは複数の選択範囲に対して実行できません」
だそうです。何だか、分かったような分からないようなメッセージですね。
しかし、同じように[Sheet1]と[Sheet3]を選択(グループ化)した状態でも、

Sub Sample3()
    Worksheets.Add Count:=1
End Sub

のように、引数Countを指定するとエラーになりません。この場合は、もちろんアクティブシートの左側に、1枚の新しいワークシートが挿入されます。

もし「アクティブシートの左に1枚の新シートを挿入する」という動作を期待して

Sub Sample1()
    Worksheets.Add
End Sub

というコードを書いたのなら、

  • 1枚のシートが選択されているとき → 期待通りの結果
  • 連続した複数シートがグループ化されているとき → 複数枚のシートが挿入される
  • 非連続した複数シートがグループ化されているとき → エラー

となります。複数のシートがグループ化されているかどうかは次のように判定します。

Sub Sample4()
    If ActiveWindow.SelectedSheets.Count > 1 Then
        MsgBox "グループ化した状態では実行できません"
    Else
        Worksheets.Add
    End If
End Sub

もし、何らかの事情で「連続したシートがグループ化されているか」あるいは「非連続のシートがグループ化されているか」を判別したいのでしたら、たとえば、次のように調べてはどうでしょう。

Sub Sample5()
    Dim i As Long
    With ActiveWindow
        If .SelectedSheets.Count = 1 Then
            MsgBox "グループ化されていません"
        Else
            For i = 1 To .SelectedSheets.Count - 1
                If Not .SelectedSheets(i).Next Is .SelectedSheets(i + 1) Then
                    MsgBox "非連続のシートがグループ化されています"
                    Exit Sub
                End If
            Next i
            MsgBox "連続したシートがグループ化されています"
        End If
    End With
End Sub






このエントリーをはてなブックマークに追加