即効テクニック |
Excelでは複数のシートを同時に操作する「シートのグループ化」という機能があります。 たとえば、Sheet1とSheet2をグループ化した状態でアクティブセルに何かデータを入力すると、入力したデータはSheet1とSheet2の両方に入力されます。 もちろんデータの入力だけでなく、セルの書式設定や行列の挿入/削除などワークシートに対するほとんどの操作を複数シートに一括して行えます。 手作業でシートをグループ化するときは、グループ化したシート見出しを、Ctrlキーを押しながらクリックします。 しかし、この機能をマクロから実行しようとすると問題が生じます。 たとえば、Sheet1とSheet2をグループ化した状態で、シート見出しの色を赤色に変えてみましょう。 この操作をマクロ記録すると、次のようなコードが得られます。Sub Macro1() Sheets(Array("Sheet1", "Sheet2")).Select Sheets("Sheet1").Activate ActiveWorkbook.Sheets("Sheet1").Tab.ColorIndex = 3 ActiveWorkbook.Sheets("Sheet2").Tab.ColorIndex = 3 End Sub ※注意※ シート見出しの色は、Excel 2002以降のバージョンで変更できます。マクロ記録では、実際の操作が忠実に記録されます。上記の場合Sheet1とSheet2をグループ化していたのですから、それぞれのシート名が記録されています。 毎回Sheet1とSheet2を操作するマクロならこれでも良いのですが「現在グループ化されているシート」を操作したいときには、どうしたらいいのでしょう。 そのような汎用的なコードは、マクロ記録だけでは作成できません。現在選択されているシートは、SelectedSheetsプロパティで取得できるのですが、このSelectedSheetsプロパティはマクロ記録では記録されないからです。 シートを限定せず、現在選択されているシートのシート見出しを変更するには、次のようにします。Sub Sample1() Dim s As Worksheet For Each s In ActiveWindow.SelectedSheets s.Tab.ColorIndex = 3 Next s End Subシートのグループ化を解除するには、任意のシートだけを選択状態にします。 上記のコードで、グループ化の解除まで行いたい場合は次のようにしてください。Sub Sample2() Dim s As Worksheet For Each s In ActiveWindow.SelectedSheets s.Tab.ColorIndex = 3 Next s ActiveWindow.SelectedSheets(1).Select End Sub SelectedSheets(1)は、グループ化されているシートの左端(1枚目)を表します。さて、グループ化の解除はわかりましたが、任意のシートをグループ化するマクロはどのように書けばいいのでしょう。 グループ化の操作をマクロ記録するとSheets(Array("Sheet1", "Sheet2"))のようなコードが得られます。 もちろんこの方法でも可能ですが、実はもっと簡単なやり方もあります。 たとえば、Sheet1とSheet2をグループ化するには次のように書けます。Sub Sample3() Sheets("Sheet1").Select Sheets("Sheet2").Select False End Subあまり知られていませんが、Selectメソッドには「Replace」という引数を指定できます。 引数ReplaceにFalseを指定すると、直前の選択状態を解除しないで、新しいオブジェクトが選択状態になります。 つまり、アクティブシートがSheet1の状態でSheets("Sheet2").Select Falseを実行すると、 Sheet1の選択が解除されないでSheet2も選択されるわけです。 これは、Sheet1とSheet2をグループ化したのと同じ結果になります。 Selectメソッドの引数Replaceは、指定できるオブジェクトが限定されています。 残念ですがセルの選択では使用できません。詳しくはヘルプをご覧ください。