長崎の仙人-時間があれば釣りにいきたい-

佐世保市を中心に釣れない釣りブログをやってます。釣れないので時事ネタなんかも扱ってます。

セルの操作~初級編~

エクセル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:列

f:id:nagasaki_hermit:20190711204236p:plain

この覚え方大好き(/・ω・)/

一目でわかる行・列の覚え方

 

・単体のセルを選択

Cells(2,1).select※この場合A2セル

Cells(3,3).select※この場合C3セル

 

・セル全体を選択

Cells.select

 

RangeとCellsの使い分け

Cellsプロパティには制限があり、参照できるのは「単一のセル」もしくは「全てのセル」です

Rangeプロパティのような複数セルや範囲を参照することはできません

じゃあRangeプロパティだけでよくないか?という疑問を持たれる方も多いと思うが、Cellsプロパティ最大の利点が存在する

Cellsプロパティはその引数に"変数"を取ることができるのだ!

イメージ沸くでしょうか

実際のコードを見てみましょう

f:id:nagasaki_hermit:20190711205553p:plain

ここまで学習してきたのであれば、このマクロを実行したときにどのセルが選択されるかわかるはず

答えは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"である

f:id:nagasaki_hermit:20190722205217p:plain

 以下のマクロ(UsedRange)を実行してみる

f:id:nagasaki_hermit:20190722210710p:plain

結果選択されるセルはこう

f:id:nagasaki_hermit:20190722210914p:plain

 

次に以下のマクロ(CurrentRegion)を実行してみる

f:id:nagasaki_hermit:20190722211107p:plain

結果選択されるセルはこう

f:id:nagasaki_hermit:20190722210914p:plain

同じ結果が得られる

 

次はもっと違いを分かりやすくしてみる

f:id:nagasaki_hermit:20190722211543p:plain

7月はまだまだ続くので先に罫線だけ表に用意しておいた場合

 

UsedRangeマクロを実行した時の結果は、以下の通りとなる

f:id:nagasaki_hermit:20190722210710p:plain

f:id:nagasaki_hermit:20190722211753p:plain

 

一方、CurrentRegionマクロを実行した時の結果は、以下の通りとなる

f:id:nagasaki_hermit:20190722211107p:plain

f:id:nagasaki_hermit:20190722211953p:plain

 

この違いおわかりでしょうか?

UsedRangeプロパティは罫線含め使用しているセル範囲を取得してくるのに対し、CurrentRegionはセルが空白だと取得範囲に含めない性質があります

UsedRangeプロパティは罫線だけでなく、書式全般に影響されるので例えば文字色や文字サイズ、文字の大きさ等セルに設定してる場合、使用しているセルであるとみなされます

 

さらに応用編として

f:id:nagasaki_hermit:20190722212349p:plain

7月22日に何かがあり、欠番になってしまった表を用意する

ここでCurrentRegionマクロを実行するとどうなるのか?

f:id:nagasaki_hermit:20190722211107p:plain

f:id:nagasaki_hermit:20190722212752p:plain

結果はこの通り

 

また、指定Rangeを"A1"から別のRangeに変えることで得られる結果もまた変わってくる

指定Rangeを"A1"→"G1"へと変更してみる

f:id:nagasaki_hermit:20190722212927p:plain

実行して得られる結果はこう

f:id:nagasaki_hermit:20190722213034p:plain

この特性を是非とも覚えてもらいたい