今回は案件で実際に使ったマクロのコードについて紹介します。
VBAの本やサイトだと仮にB2セルを指定する場合
ActiveSheet.Range("B2").Select
と記載される場合が多いですが、今回
ActiveSheet.Cells(2,2).Select
とRangeのところをCellsで記載しています。
この違いと便利な使い道について紹介します。
■Rangeオブジェクト
Excelの標準の表記(列をA~XFD、行を1~1048576で表した形式)なります。
ActiveSheet.Range("B2").Select
となる場合は、
”B"列目の"2"行目
を表すことになります。
ダイレクトにセルを指定する場合にはわかりやすいので便利ですが、For文等で各行・列を周回する場合などセルの位置が可変である場合にはあまり適しません。
例えばA1セルからD1セルまでそれぞれ連続で選択していくとすると、
ActiveSheet.Range("A1").Select ActiveSheet.Range("B1").Select ActiveSheet.Range("C1").Select ActiveSheet.Range("D1").Select
と記載するか、Offsetを利用して
For x = 1 To 3 ActiveSheet.Range("A1").Offset(0, x).Active Next x
と記載する必要があり、少々面倒です。
そこで使用するのがCellsオブジェクトによる記載方法になります。
■Cellsオブジェクト
こちらはExcelのオプションで設定できるR1C1参照形式による表記になります。
Excelの[ファイル]-[オプション]-[数式]から選択できます。
だったものが
R1C1形式では
”2"行目の"2"列目
と行列が逆になります。
CellsオブジェクトはこのR1C1形式での表記となりますので、先ほどのA1~D1セルを連続で選択数場合
For x = 1 To 4 ActiveSheet.Cells(1, x).Select Next x
で良くなります。
このように、セル番地が可変になる場合にはCellsオブジェクト、不変の場合はRangeオブジェクトを使用するのが良いと思います。
※正直、Cellsで統一したほうがきれいなのは確かですが。
■範囲の指定
マクロで罫線を引いたり、セルを塗りつぶしたりする場合があります。
しかもセルの位置が可変の場合はどうすればよいか?
そう、そんなときはRangeとCellsの合わせ技です。
例えばB2~C3セルを範囲で選択したい場合、Rangeオブジェクトであれば
ActiveSheet.Range("B2:C3").Select
で良いのですが、Cellsオブジェクトだと
ActiveSheet.Cells(2,2).Select
だとB2セルしか選択できず、複数範囲の選択ができません。
Cellsオブジェクトを使用して複数範囲を選択する以下の場合は
範囲選択できるRangeオブジェクトの中にCellsオブジェクトを入れることで範囲が表現できます。
ActiveSheet.Range(Cells(2,2),Cells(3,3)).Select
このCellsの部分を変数で可変にすることで、範囲指定を複数回実施したりすることが可能になります。
DXを進めるうえで、自動で表を作ったり、自動でグラフを作ったり、自動でやる部分が多くなってきます。
そういったときにこの可変でも範囲指定ができることを知っているかどうかで、仕事の質が変わってきますので、ぜひ覚えておいてください。
■関連ページ
【マクロVBA】VBA_TIPS-02 Select文とIf文
0 件のコメント:
コメントを投稿