2022年11月27日日曜日

【マクロVBA】VBA_TIPS-01 RangeとCells

 今回は案件で実際に使ったマクロのコードについて紹介します。


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"行目

を表すことになります。

RangeオブジェクトのB2セル

ダイレクトにセルを指定する場合にはわかりやすいので便利ですが、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形式の設定方法

こちらをチェックするとExcelの表示がこう変わります。
R1C1形式のExcel

で、こちらはR1C1形式(R:Rows=行、C:Columns=列)となりますので、RagngeオブジェクトでB2を表現する場合は

”B"目の"2"

だったものが

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オブジェクトを使用して複数範囲を選択する以下の場合は

Cellsオブジェクトを使って範囲指定する場合のイメージ

範囲選択できるRangeオブジェクトの中にCellsオブジェクトを入れることで範囲が表現できます。

ActiveSheet.Range(Cells(2,2),Cells(3,3)).Select

このCellsの部分を変数で可変にすることで、範囲指定を複数回実施したりすることが可能になります。


DXを進めるうえで、自動で表を作ったり、自動でグラフを作ったり、自動でやる部分が多くなってきます。

そういったときにこの可変でも範囲指定ができることを知っているかどうかで、仕事の質が変わってきますので、ぜひ覚えておいてください。


TOPページに戻る


■関連ページ

【マクロVBA】VBA_TIPS-02 Select文とIf文

【マクロVBA】VBA_TIPS-03 マクロの可読性


0 件のコメント:

コメントを投稿