VBA-5Rangeオブジェクト関連のプロパティを使いコードを書く

Rangeオブジェクトについて考える

本記事ではRangeオブジェクトについて掘り下げていきましょう。

オブジェクトの話を少しずつ出していきます。

続いてコードの書き方についても解説していきます。

本記事を読むとオブジェクトとプロパティの関係が分かる様になります。

前回の記事

前回の記事はこちらです。コードを書きましたね。

セルに文字を表示させる、消す事が出来る様になりました。

本記事での課題

今回の課題です。難しいので弱めに設定します。

EnjoyExcel
EnjoyExcel
課題

オブジェクトとプロパティをやんわり理解しよう

初心者向けエクセルマクロ学習シリーズ

Rangeオブジェクトと関連のプロパティを使う

ここからはオブジェクトの話を混ぜながらRange("A1")について考えます。

Rangeはオブジェクトの並びによってはオブジェクトにもプロパティにもなり得る要素です。

ここではRange~でコードが始まるのでRangeはオブジェクトとして考えます。

Rangeオブジェクトはセルを指しています。

前回の記事にもありますようにRange("A1")はセルA1のことです。

Range("A1").value = "おはようございます" と書いて実行してみます。

するとセルA1におはようございますが入ります。

プロパティに値を代入するには=(イコール)を使う

何か新しいキーワードが付いてきましたね。

.value って何?と思いませんか?これはRangeオブジェクトのValueプロパティ(属性)です。

コードを日本語にしてみます。

「RangeオブジェクトのValueプロパティ におはようございますを代入してください」という意味です。

前回の記事にValueが無かったのは省略出来るので書いてなかっただけです。

省略できるキーワードについても慣れると覚えてきますので徐々にやっていきましょう。

Valueプロパティ

上の図の右のかたまりを見てください。Rangeを先頭に4つの要素がぶら下がっています。

これはRangeオブジェクトが4つのプロパティ(属性)を持っているという様にとらえてください。

実際のRangeオブジェクトはもっといろんなプロパティを持ってますが今回は4つだと思ってください。

先程の「おはようございます」のくだりでやった事を再度書きます。

「RangeオブジェクトのValueプロパティにおはようございますを代入してください」という内容でした。

オブジェクトが持っているプロパティに値を代入する」という行為を言い換えてみます。

オブジェクトが持っているプロパティを好きな値に書き換える」という事になります。

最初はRangeオブジェクトのValueプロパティは空欄という事です。

そこに「おはようございます」を代入する(書き換える)事でセルに文字が入力されるという考え方です。

Valueプロパティの説明をしてみました。

次はValueとは逆にコード内に書かないといけないプロパティはこんなものがあります。

先程の図にあるInteriorプロパティの説明をしてみましょう。

Interiorプロパティ

使い方はこんな感じです。例えば  Range("A1").Interior.CororIndex = 3 という具合です。

これを Range("A1") = 3 と書くとセルA3に3が入るだけになってしまいます。

というわけで省略せずにしっかりコードを書きましょう。

コードの書き方については上のような気まりを守ってください。

次に意味を考えます。細かく読みますと以下の様になります。

RangeオブジェクトのInteriorプロパティを使ってInteriorオブジェクトを取得しInteriorオブジェクトのColorindexプロパティに3を代入して

意味としては「セルA1の背景にインデックスNo.3(赤)を代入して」となります。

 文字だと少し分かりにくいので画像を用意してみました。

RangeオブジェクトからColerIndexプロパティに指示を出す方法

ここはコードの規則をしっかり理解しないと分かりにくいところです。

すごく難しい話になります。しかし最低限の理解は必要です。

イメージを掴むきっかけとして画像を使って解説していきます。

Rangeオブジェクト(黄)はColerIndexプロパティ(緑)を持っていません。

しかしInteriorプロパティ(緑)を持っています。

一方Interiorオブジェクト(黄)はColerIndexプロパティ(緑)を持っています。

互いの要素に共通するキーワードは「Interior」です。

要素を連結させて一連のコードを生成する

簡単にいうと「プロパティは同じキーワードのオブジェクトと連結できる」というルールがあります。

画像ではRangeオブジェクトのInteriorプロパティ(緑)とInteriorオブジェクト(黄)が繋がって1つのコード(黄緑)になる事でRangeオブジェクトからColerIndexプロパティまでを繋いでいます。

全部こうではないのですがイメージとしてはオブジェクトに紐付いたプロパティを使って次のオブジェクトを関連付けているということになります。

こうやってオブジェクトを繋いでコードを作っていきます。

Rangeオブジェクトの使い時

オブジェクトとプロパティを用いてRangeというキーワードについて考えてみました。

一旦このぐらいにして次にRangeオブジェクトを使ったコードの書き方について考えてみましょう。

  • セルの番地が決まっている時
  • セルの番地が決まっていない時

2つの環境をもとに勉強していきます。

セルの番地が決まっている時

Excelは文字列を書く時はダブルクォーテーションで挟むと伝えましたね。

ってことは("A1")も A1 は文字列として書くのでダブルクォーテーションで挟まれています。

1回書いてしまうとコード内で書き直すことは基本的には出来ません

(頑張れば出来ますがやりにくいという事です)

よってこのコードの書き方をする時はこのセルに対する仕事が明確に決まっている時に使う書き方になります。

Range("セルの番地")という書き方は「コード内で値や数値が不変」の時に使います

範囲指定のコードを生成する時も同じことが言えます

範囲指定するときも上記の書き方を応用して範囲指定します。

セルA1からセルE5までを指定したいときは以下のようにコードを書きます。

例を紹介します
  • Range("A1","A5") 'セルA1~A5
  • Range("A:C") 'A列からC列
  • Range("1:5") '1行目から5行目

この書き方も上記同様基本的には1回コードを書いたら範囲が固定となります。

一度指定したセルはコード内で変える事ができる

変えられないというのを強調するのは理由があります。値が変えられる書き方もあるという事です。

むしろ値が変えられる書き方の方がメジャーな使い方です。

詳細は次の記事で説明したいと思います。

今回は上記方法ではコード内で数値や値を変えられないと思っておいてください。

セルの番地が決まっていない時

「セルの番地が決まってない時」というのが良く分かりませんね。

コードの実行時に「どのセルに対して仕事をするのか決まってない時」なんてあるのかを考えてみましょう。

パッと出てくる事は無いですがゆっくり考えると結構あるんですよ。

セルの番地が決まってない時 具体例
  • 最終行が毎回分からないデータを使って仕事をしているとき
  • 飛び地になってるデータの最終行が知りたいとき
  • 画面より大きいテーブルの最終行と最終列が知りたいとき

2つ目はデータの最終行が分かってないとデータにフィルタを設定する時に困ります。

テーブルの作りによっては空欄が居る行から下はフィルタにかからなくなります。

VBAでコードを用意する際は作業範囲を指示する必要があります。

「○○から△△の範囲でフィルターをかける」というコードを書くには最終行の行番号は絶対に必要です。

しかし往々にしてデータの最終行は変わります。

毎回同じ量のデータなら良いのですがそうではない時の方が多いです。

実務では毎回最終行が変わるデータを相手に仕事をします。

こういったケースでは仕事をする範囲を都度決める必要があります。

セルの番地が決まっていない時」というのはこのような事例を指しています。

次の記事でセルの番地が決まっていない時のコードの書き方を紹介していきます。

まとめ

冒頭にオブジェクトとプロパティの話を少し入れました。

?がいっぱい出たと思いますがだんだん分かってきますので少しずつやっていきましょう。

私は慣れるまで数ヵ月かかりましたよ。

言語は積み上げるとどこかのタイミングで劇的に書けるようになります。

いきなり出来るものではなく積み重ねが大事です。引き続き勉強していきましょう。

本日勉強したこと
  1. オブジェクトとプロパティの関係
  2. プロパティによって省略可否がある
  3. Range(**)は範囲が固定される
少し難しくなりました

Enjoy Excel

次は作業範囲が不確定の際はどうするのかという案件に対して対策していきます。

事例を使って出来るだけ分かりやすく説明します。

タイトルとURLをコピーしました