VBARangeオブジェクトと、Rangeプロパティの違いを解説します。同じところどちらも「セル」または「セル範囲」を扱います。違うところ一言で言ってしまえば、「Rangeオブジェクトを取得する、たくさんあるプロパティの中のひとつがRangeプロパティ」です。詳しく説明していきます。分からない部分は読み飛ばしながら、気楽に読んでください。難しい話なので、見通しが立てやすいように先に最終目標から。1これってRangeオブジェクトですか?それともRangeプロパティですか?というのを説明するために、順を追って説明していきますね。オブジェクト.プロパティまずはオブジェクトとプロパティが何なのかを簡単に。このコードを見てください。"集計表"何の変哲もない、シート名を変更するコードです。このコード中の「.」に注目してください。「.」は「の」と読むと理解しやすいです。実際に↑の例でも、「第1シートの名前」と訳すことができます。"集計表"という風に書けるように、すべての機能が整備されています。プログラミングの世界では、この「誰」をオブジェクト、「何」をプロパティと呼びます。「Nameプロパティ」に"集計表"を代入した。ここまではOKですかね?プログラミングをやる上では、この「オブジェクト」と「プロパティ」は重要なので、この機会に覚えてしまってください。別に難しく考えなくていいです。「誰の何」を、オブジェクト.プロパティと書けるように、多くのプログラミング言語は作られていますよ。Rangeオブジェクトここで本題のRangeに移りましょう。「Range("A1")」がオブジェクトで、「Value」がプロパティですね。さっきの「ワークシート」は「Worksheetオブジェクト」という名前のオブジェクトでしたよね。「セル」ってなんていう名前のオブジェクトなんでしょう?この答えがまさに「Rangeオブジェクト」です。「Cellオブジェクト」が集まって、「Cellsコレクション」ではないのです。「Cellオブジェクト」が集まって、「Rangeオブジェクト」でもないのです。1個のセルでも、長方形のセル範囲でも、飛び飛びのセルをカンマでつないだ複数セルでも、どれも「Rangeオブジェクト」なのです。「Rangeオブジェクト」が集まったものも、「Rangeオブジェクト」なわけです。「Rangeオブジェクト」の中には、たくさんの「Rangeオブジェクト」がいます。いうことで、ひとまず「セルやセル範囲ならなんでもRangeオブジェクト」です。1)もRangeオブジェクトですし、Range("A1")Range("A1:C3")も、もちろんRangeオブジェクトです。これでひとつ謎が解けましたね。)この関数っぽいものがRangeプロパティです。Rangeプロパティの引数に、"A1"を渡して取得したA1セルが、Rangeオブジェクトと言うことです。ここがめっちゃ紛らわしいんですよ。名前が一緒だから最初はすごい混乱するんです。これは↓の例を見ると、ちょっと整理できるかもしれません。パスタを料理する料理を運ぶお母さんに電話するお母さんの電話を買うなどと同じだと思ってください。「名詞」と「動詞」に同じ単語が使われるのは珍しくないですよね?それと一緒のことです。料理する(Rangeプロパティ)というわけです。セルを扱うオブジェクトはRangeオブジェクトしかありませんが、そのRangeオブジェクトを取得するプロパティは、↓の通りたくさんあります。2)これらはみんな、Rangeオブジェクトを取得するプロパティたちです。「料理」を作る方法がたくさんあるような感じです。↑のプロパティを全部自分でやってしまいます。Range("A1")Range("1:1")Range("A:A")Range("A1:B2")これだけ万能だと仕方がないですね。紛らわしいですが「料理する」という、名詞そのものを名乗ることを許してあげましょう。「一番万能だったからRangeを名乗るのを許された」は私の妄想というか例えです。実際にMicrosoftさんがどう思ってRangeを名付けたのかなんて、もちろん私にはわかりません。プロパティって右側なんじゃないの?さて、これでRangeオブジェクトとRangeプロパティの説明はできたわけですが、まだ一つ謎が残っています。これをRange「プロパティ」と呼ぶのでしょうか。「プロパティ」というからには「何」にあたるわけです。1を見ると、Rangeはプロパティなのに左側にあります。?答えは単純で、「ActiveSheet.」が省略されているからです。Rangeプロパティは、より正確には「WorksheetオブジェクトのRangeプロパティ」ということです。これが紛らわしいポイント最終章ですね。オブジェクト.プロパティと、事は単純な話ではないのです。「オブジェクトA.○○○○○B.プロパティC」とつながっているときは、BはAにとってはプロパティBはCにとってはオブジェクトというわけなんですよ。これは家族に例えるとわかりやすいのですが、オブジェクトとプロパティは、親子と表現されることもあります。いうか実際に、Parent(親)を使うと、Range("A1").Parentで親オブジェクトであるワークシートを取得できます。それで、オブジェクトをプロパティのお父さんだとするじゃないですか。お父さんだって、おじいちゃんから見れば息子ですよね?それとおんなじ話です。Valueのお父さんであるA1セルも、Worksheetの息子ですからね。Worksheetおじいちゃんだって、Workbookひいおじいちゃんの息子です。最終的には、家系図をたどったご先祖様である、Excel藩のApplicationオブジェクト大名から続く由緒正しいお家柄なわけです。今回の話では、Worksheetオブジェクトの子であるRangeオブジェクトの、さらにその子であるValueプロパティに値を代入していたということです。その上で、Worksheetオブジェクトの子であるRangeオブジェクトを取得するために、Rangeプロパティを使っているということですね。これですべての謎は解けたでしょうか?まとめセルやセル範囲を扱うオブジェクトを「Rangeオブジェクト」と呼ぶRangeオブジェクトを取得するためのプロパティが、親であるWorksheetオブジェクト内にたくさん用意されているその中で一番万能なのが、オブジェクトと同じ名前のRangeプロパティというお話でした。逆にこれさえわかれば、VBAのオブジェクトはオールOKみたいなものです。初読で完全に理解するのは難しいかもしれませんが、まあ気長に付き合っていきましょう。́∀`)おまけ:ひとつ嘘をついてるので訂正しますさて、今回の話は難しすぎて、どうしても簡単にせざるを得ない部分で、ひとつ嘘をついています。今までの話をすべて終えた今なら、なんとなくわかると思うので、一応訂正しておきますね。一応というくらいなので、実務には全く関係ない、厳密な用語の定義の話です。適当に読み流してください。「このプロパティによって取得されるオブジェクトがRangeオブジェクト」です。実際にコードが実行され、ActiveSheetがどのシートかわかるまでは、どのオブジェクトを指すのかすら決まっていませんし、もしからしたらできないかもしれません。これと同じ話で、あたかも「プロパティ」という実物があるかのように「家族の話」をしましたが、実際に家族をなしているのは「オブジェクト」です。「親オブジェクトと子オブジェクトが親子」です。この親子の間で「子オブジェクトを取ってくるための方法≒関数」が、プロパティということです。「シートの名前を格納している実際の値にアクセスするための関数」と表現した方が正しいです。話をまとめると、コード上に、Workbooks("テスト.xlsx").Worksheets("集計表").Range("A1").Valueこう書いてあるとします。この式中にオブジェクトは無く、すべてプロパティです。「オブジェクトを返すプロパティ.オブジェクトを返すプロパティ.オブジェクトを返すプロパティ.値を返すプロパティ」です。コードの段階では全部プロパティで、実行して初めてオブジェクトになるという解釈がわかりやすいでしょうか。「オブジェクトA.○○○○○B.プロパティC」とつながっているときは、BはAにとってはプロパティBはCにとってはオブジェクトとも書いていましたが、Bは生まれも育ちもオブジェクトであり、そのBを取得するプロパティがAに用意されているというのが厳密な説明です。まあ一応訂正はしましたが、普通に話をしている上では、Range("A1")これはもうオブジェクトでいいと思いますよ。これをオブジェクトを返すプロパティって言う必要があるかというと...この話は、厳密な用語の定義の話です。原子は物質の最小単位とか言っておきながら、電子とか陽子とか出てきて、最後はリプトンだかレプトンだか紅茶が出てくるみたいな話に近いと思います。プロパティで、実務上はOKだと思います。この違いを認識できることは、ちゃんと実務に役立ちます。本題と関係ないので、書くか迷ったのですが、この話を最後まで読んでくださった方のために書いておきます。実はActiveSheetではありません。Worksheets("Sheet2").Range("A1")Range("Sheet2!A1")これはどっちも「Sheet2」のA1セルを取得します。Rangeプロパティを省略した場合は、親はApplicationオブジェクトです。その上で、Applicationさんが、省略時の親シートを補完してくれる感じです。引数で渡すStringやObjectで指定があるときは、その指定シートからRangeオブジェクトを取得します。それが無いときは、ActiveSheet(シートモジュールならそのシート)を補完します。なんて万能なやつなんだ。これは掛け値なしにActiveSheetを親とするプロパティこれと一緒と思っていても、何ら問題は発生しませんし、これと一緒だと思って使い分けた方が、間違いなくわかりやすいです。20:25Tweet関連記事2021-09-27Endによる最終行取得は非表示の行を検知できない知らずに落ちると抜け出せなくなるVBAの落とし穴です。最終行が...2021-09-25オートフィルターの最終行を取得するオートフィルターの最終行を取得するコードを解説します。これ...2021-09-24指定のセル範囲(Range)の最終行を取得するあるセル範囲(Rangeオブジェクト)があったとき、その最終行はセ...2021-01-29セル範囲を縮小する/見出し行を除外するセル範囲を縮小する方法(見出し行を除外する方法)を紹介しま...2021-01-14シート名をセル値から取得してWorksheetを指定する方法セルの値からシート名を取得したくなることがあります。「日本語の変数でプログラミングすれば、みんなが幸せになれる」という思想の元、主にExcelVBAのマクロやコードを解説しているブログです。この思想については↓の記事をご覧ください。変数を日本語にすればプログラミングが上達する記事の更新通知や質問の回答はTwitterでも行っております。お気軽にフォローください。12はてなブログをはじめよう!LimeCodeさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。