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

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

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

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

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

EnjoyExcel
EnjoyExcel

オブジェクトとプロパティを意識しながらコードを書いてみましょう

続いてRangeオブジェクトを使ってコードの書き方について解説していきます。

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

前回の記事

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

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

本記事での課題

今回の課題です。

EnjoyExcel
EnjoyExcel
課題

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

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

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

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

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

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

先回の記事の様にRange(“A1”).value = “おはようございます” と書いて実行してみます。

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

プロパティに値を代入する

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

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

Range(“A1”).value = “おはようございます”を日本語にしてみます。

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

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

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

オブジェクトとプロパティの関係

以下画像をご覧ください。。Rangeと書いてあるブロックがRangeオブジェクトです。

Rangeオブジェクトを先頭に4つの要素がぶら下がっていますね。

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

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

Valueプロパティを深堀りする

画像をもとに先程のRange(“A1”).value = “おはようございます”のコードで何が起きているのかを再度考えます。

このコードではRangeオブジェクトでセルA1を取得した後にセルのValueプロパティに文字を代入しています。

文字を代入する前のRangeオブジェクトのValueプロパティは空欄です。

空欄のValueプロパティに「おはようございます」を代入する事でセルに文字が入力されるという建付けです。

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

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

一連の行為はA1セルのValueプロパティを空欄から「おはようございます」に書き換えたという事です。

その結果セルA1に「おはようございます」という文字が入力されたという考え方になります。

Valueプロパティの注意点

ご注意下さいValueプロパティは慣習上書かない事の方が多いです。ご注意ください。

実はValueプロパティはコード上で省略できます。Range(“A1”) = “おはようございます” でもコードは通ります。

ひとまずここでは「Rangeオブジェクトに続くValueプロパティは省略できる」と考えてください。

Interiorプロパティ

Valueプロパティとは逆にコード内に書かないといけないプロパティを1つ紹介します。

先程の画像の中にあるInteriorプロパティの説明をします。

使い方はこうです。 Range(“A1”).Interior.CororIndex = 3 という具合です。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

RangeオブジェクトのInteriorプロパティはInteriorオブジェクトを返します。

Interiorオブジェクトが用意された時点では中身は空なのですが重要なのはそこではないです。

ポイント

InteriorオブジェクトはRangeオブジェクトのInteriorプロパティと連動しています。

これでRangeオブジェクトに紐付いたInteriorオブジェクトを用意する事ができます。

あとはInteriorオブジェクトが持っているColorIndexプロパティに値を代入するだけです。

Interiorという要素を介してRangeオブジェクトからColorIndexプロパティを指示する事ができました。

何が起きているのか?

オブジェクトに紐付いたプロパティを使って次のオブジェクトを関連付けられています。

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

オブジェクト、プロパティの関係性を調べる方法

VBEでF2を押下。オブジェクトブラウザーが起動します。

ここで調べることは可能ですが初心者向けではないです。理由は一言で書くと「難しい」からです。

初心者のうちは高い確率で使いこなせないです。

インターネット等で調べていただいてもおそらく分からないです。よってこうしてください。

コードを書いている際に補助機能で使えるプロパティ、メソッドが表示されます。

以下画像のような機能です。

最初のうちはここに表示されるプロパティとメソッドを使ってコードを書いてください。

裏を返せばここに表示されてないプロパティとメソッドを使うとエラーになります。

表示されない方へお知らせ

設定を変える事で表示されるようになります

VBEで「実行」タブ内の「オプション」を押下すると以下ダイアログが起動します。

ここで「自動メンバー表示」にレ点を付けたあと「OK」ボタンで閉じます。

これでコードを書いてみると上の画像の様にプロパティとメソッドが表示されるはずです。

ある程度コードを書いたらコードをそのまま各種ブラウザの検索窓に入れて検索してください。

そうするとその後に続くコードやどんな引数を用意したら良いのかがある程度出てきます。

少し乱暴な書き方ですがこの様に最初は出来る範囲で試行錯誤しながらコードを書いていきましょう。

「分かる人に聞く」以外の独学ではそうするしか方法はないです。

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回コードを書いたら範囲は固定となります。

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

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

むしろ値が変えられる書き方の方がメジャーな使い方です。詳細は次の記事で説明します。

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

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

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

言い換えるとコードの実行時までに「どのセルに対して仕事をするのか決まってない時」です。

そんな事なんてあるのかを考えてみましょう。

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

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

この中で1番最初に提示した最終行が毎回分からないデータを・・・という事例を使い説明していきます。

実務ではこんな事があります

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

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

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

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

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

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

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

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

まとめ

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

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

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

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

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

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

Enjoy Excel

ひとまず今回の記事でわかった事を整理します。

作業範囲が決まっている時はRangeオブジェクトを使ってコードを書く事です。

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

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

参考:関連記事

本シリーズはこちらの記事とも連携しています。

マクロ勉強の道筋マクロは何から勉強するのか|学習をサポートするためのロードマップを作成

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