Worksheet_Activateイベント2
イベントマクロ 19回
シート選択でデータをコピーしソートする
イベントは前回と同じWorksheet_Activateイベントですが、少しコードを変更したものを紹介します。
データが多かったりしたときに、同じシートではなく、別シートにコピーし、それをソートして、利用しやすくしたいと思います。
元のデータがそのままなので、加工したデータはさらに手を加えてもいいわけです。
データ範囲を並べ替える
データ範囲を並べ替えるには、その対象となるRangeオブジェクトに対し、SORTメソッドを使用します。
Range.Sort メソッド の構文
Sort (Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase , Orientation , SortMethod, DataOption1, DataOption2 , DataOption3)
Range.Sort メソッド の引数解説
引数は構文にあるように多数ありますが、実際に使うものは少ないです。
引数名 | データ型 | 説明 |
---|---|---|
Key1~3 | Variant | 並べ替えフィールドを範囲名 (文字列) またはRangeオブジェクトで指定 |
Order1~3 | XlSortOrder | Key1~3で指定した値の並び替え順序を指定 |
Header | XlYesNoGuess | 最初の行にヘッダー情報が含まれているかどうかを指定、xlNo は既定値 |
Sub 構文マクロ() 'A1をキー1にB1をキー2に、昇順で並べ替えます ActiveCell.Sort Key1:=Range("A1"), Order1:=xlAscending, _ Key2:=Range("B1"), Order2:=xlAscending, Header:=xlYes End Sub
イベントにCOPYとSORTを使う
1. 考え方は
Worksheet_Activateイベントに、特定のシートの範囲をコピーして、
指定シート(イベントを記述したシートオブジェクト)に張り付けたあと、
SORTメソッドで並べ替えるという手順になります。
サンプルは、購入した本のリストという設定です。
Private Sub Worksheet_Activate() ’処理したい内容をここに記述 End Sub
2. イベントの間に書くコードを考えましょう。
まず、Sheet1のCurrentRegionをコピーします。
Sheets("Sheet1").Range("B1").CurrentRegion.Copy
つづいて引数で、Sheet2のRange(”B1”)に張り付けると指定してやります。
Destination:=Sheets("Sheet2").Range("B1")
Private Sub Worksheet_Activate() Sheets("Sheet1").Range("B1").CurrentRegion.Copy _ Destination:=Sheets("Sheet2").Range("B1") End Sub
3. Sheet2にコピーしたデータが張り付けられました。
つづいてデータをSORTします。というのは、シリーズものの本をどこまで購入しているかチェックをしたいからです。
RangeオブジェクトのSORTメソッドを使います。
SORTメソッドでは、
はりつけたデータのある範囲を特定しなくても、単一のアクティブセルをひとつ指定すれば、対象範囲が自動的にそのアクティブセル領域に拡張されるという特徴があります。
ですからSORTメソッドを使うときの指定は、
Range("B1").CurrentRegionでもRange("B1")でも、結果は同じになります。
Private Sub Worksheet_Activate() Sheets("Sheet1").Range("B1").CurrentRegion.Copy _ Destination:=Sheets("Sheet2").Range("B1") Range("B1").Sort Key1:=Range("D1"), Order1:=xlAscending, Header:=xlYes End Sub
4. ただ張り付けたのでは、列幅が規定値のままですので、列幅を自動調整します。 Columns("B:D").EntireColumn.AutoFit
5. 次に使うことを考えて、シート上のデータをクリアするコードを加えます。
データをソートしたいときに、シートを選択すると、データがコピーされて、
選択したシートにソートされたデータが表示されるというマクロの完成となります。
Private Sub Worksheet_Activate() Range("B1").CurrentRegion.Clear Sheets("Sheet1").Range("B1").CurrentRegion.Copy _ Destination:=Sheets("Sheet2").Range("B1") Columns("B:D").EntireColumn.AutoFit Range("B1").Sort Key1:=Range("D1"), Order1:=xlAscending, Header:=xlYes End Sub
今回のイベントマクロは、わざわざイベントを使わなくても、通常のマクロとして使えばいいのではないかという、内容のコードです。
しかしイベントにすることで、ボタンやマクロのショートカットキーなどを作成する手間がないという便利さがあります。