以下のような名簿があります。
こちらの名簿には、A~Cの複数のクラスが含まれます。
この表をクラス分けして、以下の別々のシート(A~C)に表示させる機能の開発方法について解説していきます。
今回、こちらでは「マクロの記録」という機能を活用して開発していきます。
解説する流れは以下になります。
・手順の確認
・「マクロの記録」の実行
・記録内容の確認と修正(修正後のファイルも配布)
実際に、「マクロの記録」にて開発したファイルは以下になります。
※こちらのファイルは、記録後の未修正ファイルです。
では、順番に解説していきます。
・手順の確認
「マクロの記録」を上手く活用するには、無駄な手順を無くし、尚且つ、繰り返し実行できる手順を考える必要があります。
今回は、以下の手順で記録することで実現していきます。
① 表にフィルターを設定(ショートカット:Ctrl+Shift+L)
② Aクラスで絞る
③ A~B列をコピー(ショートカット:Ctrl+C)
④ シート「A」のセルA1を選択して貼り付け(ショートカット:Ctrl+V)
⑤ シート「A」のセルA1を選択
⑥ ②~⑤の手順を、Bクラス、Cクラスでも実行する
⑦ 表のフィルターを解除(ショートカット:Ctrl+Shift+L)
この手順のポイントは、③でコピーする際に列全体をコピーしているというところです。
列全体を選択することで、今後、データ数が増えてきた場合にも対応することができます。
・「マクロの記録」の実行
では、先ほどの手順を記録していきます。
[開発]タブの中の[マクロの記録]を選択し、好みの名前で作成します。
[作成]を選択した後は、以下のように[記録終了]という文字に切り替わり、記録が開始します。
記録が開始すると、その後の操作は、すべて記録されてしまうため、無駄な操作なく、先ほどの手順を行います。
※記録される操作は、「マクロの記録」に対応している操作のみになるため、Windowsの操作などは記録されません。
先ほどの①~⑦の操作が完了したら、上記の[記録終了]を選択することで完成です。
実行は、[マクロ]の中の作成した名前を選択することで行えます。
・記録内容の確認と修正
記録された内容を確認します。
記録されたコードは、[VisualBasic]を選択することで確認することができます。
記録されたコードは以下になります。
こちらには、無駄なコードが多く存在します。
[マクロの記録]を活用するデメリットはここにあります。
[マクロの記録]を活用した後は、中身を確認し、無駄な処理を修正した方が、保守的になります。
では、無駄な処理を確認していきます。
まずは以下の内容です。
Selection.AutoFilter
ActiveSheet.Range("$A$1:$C$51").AutoFilter Field:=3, Criteria1:="A"
この処理は、「選択したセルを基準にフィルターを設定し、その後にセルA1~C51が含まれるフィルターの3列目が「A」のもので絞り込む」という内容になっています。
ここの無駄なポイントは、以下になります。
・フィルターの設定と絞り込みを分ける必要がない
・フィルターの範囲を指定するには、設定が含まれるセルであればよいので、A1~C51などの指定が不要
・ActiveSheet(現在選択されているシート)というのが抽象的で、別のシートを選択して実行すると不具合を起こす
こちらを改善すると、以下のようになります。
Sheets("学年").Range("A1").AutoFilter Field:=3, Criteria1:="A"
この処理は、「シート「学年」のセルA1を基準にフィルターを設定し、設定したフィルターの3列目が「A」のもので絞り込む」という内容になっています。
このように、無駄な処理を修正し、より不具合が起こりにくい処理にすることができました。
次に、以下の処理です。
Columns("A:B").Select
Range("B1").Activate
Selection.Copy
Sheets("A").Select
ActiveSheet.Paste
Range("A1").Select
この処理は、「現在選択されているシートのA列とB列を選択し、セルB1をアクティブにしてコピーし、シート「A」を選択し、貼り付けて、セルA1を選択する」という内容です。
ここの無駄なポイントは、以下になります。
・コピー対象は選択されている範囲であり、現在、どのセルが選択されているのかは関係ない
・シート情報が省略されているため、別のシートを選択して実行すると不具合を起こす
こちらを改善すると、以下のようになります。
Sheets("学年").Columns("A:B").Copy
Sheets("A").Range("A1").PasteSpecial
Sheets("A").Select
Range("A1").Select
この処理は、「シート[学年」のA~B列をコピーし、シート「A」のセルA1を基準に貼り付け、シート「A」のセルA1を選択する」という内容です。
Pasteメソッドはシートに対してしか使えないため、セルに対して直接貼り付けできるPasteSpecialメソッドを使用しています。
この流れで他も修正すると、以下のようになります。
これだけでも、かなり見やすくなったかと思います。
こちらのファイルは以下になります。
「マクロの記録」は、とても便利な機能ですが、無駄な処理も多く記録されてしまいます。
また、中身の確認が出来ない場合は、機能の仕組みはブラックボックスとなり、どのタイミングで不具合を起こすのかが予測できません。
その状態での業務での運用は、かなり危険になります。
初めは大変ですが、「マクロの記録」を活用した場合は、コードの内容を確認することを推奨します。