セルの操作~初級編~
エクセルVBAを学習する際に、是非覚えておきたいのがセルの操作です
業務レベルでマクロが組めるようになるためにも、きちんと理解しておきましょう
そんなわけで、今回はセルの操作~初級編~でございます
先ずはじめに、エクセルVBAでセルを操作する方法は2通り存在します
RangeプロパティとCellsプロパティです
それぞれのプロパティの特性を見ていきましょう
Rangeプロパティ
・単体のセルを選択※この場合A1セル
Range("A1").select
・範囲のセルを選択※この場合A1~C3セル
Range("A1:C3").select
Range("A1","C3").select
上記2つのコードは同じ動きをします。上が一般的です
・非連続の複数セルを選択
Range("A1,B2,C3").select※この場合A1,B2,C3セル
Range("A1:A3,C4:D5").select※この場合A1~A3セルとC4~D5セル
・行、列全体を選択
Range("1:1").select※この場合1行目を選択
Range("A:A").select※この場合A列を選択
Cellsプロパティ
Cellsプロパティを学習する上で、重要になってくるのが"行"と"列"の関係性である
Cells(行,列)と確実に覚えておこう
Cells(行,列)
重要ですよ?
ついでに英語表記も覚えておきましょう
Row:行
Column:列
この覚え方大好き(/・ω・)/
・単体のセルを選択
Cells(2,1).select※この場合A2セル
Cells(3,3).select※この場合C3セル
・セル全体を選択
Cells.select
RangeとCellsの使い分け
Cellsプロパティには制限があり、参照できるのは「単一のセル」もしくは「全てのセル」です
Rangeプロパティのような複数セルや範囲を参照することはできません
じゃあRangeプロパティだけでよくないか?という疑問を持たれる方も多いと思うが、Cellsプロパティ最大の利点が存在する
Cellsプロパティはその引数に"変数"を取ることができるのだ!
イメージ沸くでしょうか
実際のコードを見てみましょう
ここまで学習してきたのであれば、このマクロを実行したときにどのセルが選択されるかわかるはず
答えは2行目3列目のセルである"C2"セルですね
上記マクロでは引数が変数である利点が全く感じられないのだが、後々For文を学習した際に一気に使い勝手がよくなるので覚えておきましょう
RangeプロパティとCellsプロパティの使い分けであるが、以下の使い分けで大体いいんじゃないかな
単一のセル操作の場合:Cellsプロパティ
範囲セル操作の場合:Rangeプロパティ
慣れてくるとCellsプロパティでも範囲セルを参照したくなる時がくる
つまり、Rangeプロパティで引数に変数を使いたくなる時が来る
だが安心して欲しい
Cellsプロパティで範囲セルを参照する場合は、Rangeプロパティと組み合わせて使います
Range(Cells(行,列),Cells(行,列))
Range(Cells(1,1),Cells(3,3)).select※この場合A1~C3セル
もちろん引数には変数を使うことができます
これを知っているのと知らないのでは組めるマクロに大きな違いが生まれてきます
これはセルの操作初級編ではありますが、何事も基本が大事
しっかりと理解しておきましょう
特殊な範囲セルの取得
RangeプロパティやCellsプロパティ以外にもセル情報を取得するプロパティは様々存在する
中でも特によく出てくるのが、「UsedRangeプロパティ」、「CurrentRegionプロパティ」である
この2つの違いについて解説する
UsedRange
シート内で使用されているセルの範囲全てを取得する
CurrentRegion
指定したRangeオブジェクトのアクティブセルを取得する
言葉尻ではよくわからないので、実際の動きを見ていきましょう
以下の表があるとする
シートの名前は"sheet2"である
以下のマクロ(UsedRange)を実行してみる
結果選択されるセルはこう
次に以下のマクロ(CurrentRegion)を実行してみる
結果選択されるセルはこう
同じ結果が得られる
次はもっと違いを分かりやすくしてみる
7月はまだまだ続くので先に罫線だけ表に用意しておいた場合
UsedRangeマクロを実行した時の結果は、以下の通りとなる
一方、CurrentRegionマクロを実行した時の結果は、以下の通りとなる
この違いおわかりでしょうか?
UsedRangeプロパティは罫線含め使用しているセル範囲を取得してくるのに対し、CurrentRegionはセルが空白だと取得範囲に含めない性質があります
UsedRangeプロパティは罫線だけでなく、書式全般に影響されるので例えば文字色や文字サイズ、文字の大きさ等セルに設定してる場合、使用しているセルであるとみなされます
さらに応用編として
7月22日に何かがあり、欠番になってしまった表を用意する
ここでCurrentRegionマクロを実行するとどうなるのか?
結果はこの通り
また、指定Rangeを"A1"から別のRangeに変えることで得られる結果もまた変わってくる
指定Rangeを"A1"→"G1"へと変更してみる
実行して得られる結果はこう
この特性を是非とも覚えてもらいたい