プロパティとメソッドが混乱してくる

このQ&Aのポイント
  • プロパティとメソッドの区別がつかない場合、特にドットが連なると混乱します。例えば、ActiveSheet.Cells.SpecialCells(xlLastCell).Addressのステートメントでは、どれがメソッドで、どれがプロパティで、どれがオブジェクトで、どれがコレクションかわかりにくくなります。
  • 混乱を避けるためには、オブジェクト.メソッドやオブジェクト.プロパティという形式で記述されているか確認することが重要です。たとえば、ActiveSheetオブジェクトのCellsメソッドのSpecialCellsプロパティのAddressプロパティは、オブジェクト.メソッド.プロパティの順番で記述されています。
  • メソッドとプロパティの違いを理解している場合でも、ドットが連なると意味がわかりにくくなります。見分けるためには、コードのドキュメンテーションやマニュアルを参照することが役立ちます。また、コードエディタの補完機能やツールチップを活用して、適切なメソッドやプロパティを選択することもオススメです。
回答を見る
  • ベストアンサー

プロパティとメソッドが混乱してくる

ActiveSheet.Cells.SpecialCells(xlLastCell).Addressというステートメントがあるとします。 このどれがメソッドで、どれがプロパティでどれがオブジェクトで、どれがコレクションでと わからなくなってきます。特にメソッドとプロパティは"."で区切られるので混乱してきます。 ActiveSheetオブジェクトのCellsメソッドのSpecialCellsプロパティのAddressプロパティに なるんでしょうか?これは一例ですが、ドットが沢山連なるにつれて意味がわからなくなってきます。 どれがプロパティでどれがメソッドでなどです。どのように見分ければいいでしょか?一応は メソッド、プロパティの違いは理解しているつもりです。

質問者が選んだベストアンサー

  • ベストアンサー
  • KI401
  • ベストアンサー率53% (44/82)
回答No.1

先に言っておくが、VBAは全然詳しくない。 > メソッド、プロパティの違いは理解しているつもりです。 理解できてない。 obj.fizz(buzz)ならfizzはobjのメソッド。 obj.hogeならhogeはobjのプロパティ。 fizz,hogeはどちらも、objのメンバ。 カッコがついていればそれは明らかにメソッドで、関数適用している。 VBAで関数オブジェクトとか存在するのかどうか知らないが、 メソッドなんていうのは普通オブジェクトの特殊なメンバに対する呼び名でしかない。 メソッドとプロパティの差異がハッキリと出る言語も存在するが、どちらもオブジェクトの メンバであるという点に関しては同じで、ただメソッドは「動く」ってだけのこと。 だから普段メソッドとして使っている"Cells"という名前だろうとなんだろうと、 それが動くか否かでメソッドかプロパティかは決まる。結局カッコがあるかないかに帰着するわけだ。 0: ActiveSheet [オブジェクト] 1: .Cells [0のメンバ(型は関数オブジェクト?)] 2: .SpecialCells(xlLastCell) [1のメソッド] 3: .Address [2の返り値のプロパティ] 1については、ひょっとしたらVBA的にはプロパティと呼ばないかもしれないと思ったので 一応「メンバ」と呼んでおいたが、Cellsはただのオブジェクトのようなので、 プロパティと呼んでも構わないと思う。 もしかするとVBAの専門家からするとチグハグなこと言ってるかもしれないけれど、 JavaScriptみたいな関数型言語を一度でも扱ったことがあれば自然とこういう考え方になると思う。 参考になれば幸い。では。

関連するQ&A

  • VBA プロパティについて

    仕事で必用になり、プログラミングを学んでいる者です。 VBAでの基本的なことですが、教えていただきたいことがあります。 例えば・・・ Cells(i, j).value = "あああ" のようなステートメントがあったとき Cells(i, j) の部分をオブジェクト .value の部分をプロパティと考えていいですか? もしそうだとすると、 Cells(i, j).Interior.ColorIndex = i のようなステートメントは Cells(i, j) オブジェクト .Interior プロパティ .ColorIndex プロパティのプロパティ?? ということになるのでしょうか? ちょっと概念が整理できていません。 よろしくお願い致します。

  • cellsプロパティ列名をアルファベットに変える

    ●質問の主旨 cellsプロパティで表された列名をアルファベットに 変えるためにはどのようなコードを使えばよいでしょうか? 例)cells(4,5)→E列 ●質問の補足 cellsプロパティで取り出された行数を Rangeプロパティを表したいと考えております。 上記の例を使うと、 Range("cells(4,5)→E列 & 4")というプロパティを作成し、 Setステートメントを使用した「Rangeオブジェクト」に したいと考えております。 ご存知のかたご教示よろしくお願い申し上げます

  • エクセルVBA CellsとRangeの違い

    CellsとRangeの違いが分りません。違いを明確にするために以下の説明文を書きましたが、正しいでしょうか? ---------------------- Cellsはセルを表すコレクションである。Cell(s)と複数形になっている。コレクションはオブジェクトの集合体なので、コレクションCellsはセルオブジェクトの集合体である。Cellsはあくまでコレクションであってオブジェクトではない。 一方、Rangeはセルを表すオブジェクトである。 ---------------------- CellsがコレクションならばCells(Range("A10"))の表記があってもいいと思いますが、実際にはありません。Cells(1,10)です。なぜですか? コレクションCellsとオブジェクトRangeの違いを明確に示す例はありませんか?

  • VBAのRange()ってオブジェクトですか、プロパティですか、メソッドですか?

    最近VBAを勉強しはじめました。 基本的なことだとは思いますが、なかなかネットで検索していても頭が混乱してしまうので、こちらで質問させてください。 Range("A1")という記述は、VBAでは何を意味しているのでしょうか? Range("A1")というのは、Rangeオブジェクトそのものではないらしいことはわかったのですが、そこから先はなんだかチンプンカンプンで。 色々、見ていると、 オブジェクトを返すメソッド?? オブジェクトを返すプロパティ?? 四苦八苦しながら、結果的に動くプログラムは書けることは書けるのですが、どうにも、自分が何やっているのかわからないのは気持ちが悪くて。 あと、気になる言葉でアクセッサってのが見つかりました。 もはや、何をどう質問していいのかすらわからないレベルです。 VBAについて、少しずつ、体系的に学びたいと思ってます。 この本を読むとわかりやすいとかそんなアドバイスでもいただけたら、とても助かります。

  • オブジェクト、プロパティ、メソッドの関係

    環境:OS.Win2000、Excel2000VBA プロパティやメソッドの呼び出し方法に疑問があります。 ExcelのVBAで以下の動作は確認しています。(例1) Dim xlApp As Application Dim xlBook As Worksheet '置換 xlApp.ActiveCell.Replace what:="A", replacement:="B", LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, MatchByte:=False '検索 Set Oret = xlBook.Application.Cells.Find(what:="A", After:=ActiveCell, _ LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False) 疑問に思っているのは「xlApp.ActiveCell.Replace」の”Replaceメソッド”を オブジェクトブラウザで調べるとRangeオブジェクトと、WorksheetFunctionオブ ジェクトにしか含まれないように受け取れます。またヘルプの「対象」を見ても Replaceが含まれているのは二つしかありません。ようするに以下の二通りでし か使えないように思えるのです。 Dim A As Range Dim B As WorksheetFunction A.Replace ~ B.Replace ~ しかし実際には(例1)のようにApplicationオブジェクトでも”Replaceメ ソッド”を使えます。”Replace関数”を見てみても引数を見ると”Replace メソッド”です。いまひとつ理解が浅いため目的の動作をさせるのにどのオ ブジェクトからメソッドを呼べば良いのか分かりません。基本的な事なのか もしれませんが、ぜひご回答くださいよろしくお願いします。

  • ExcelVBAで最終行を誤認する問題の回避方法

    いつもお世話になります。 ActiveSheet.Cells.SpecialCells(xlLastCell).Rowなどのコードで 最終行を取得しようとするとき、縦スクロールバーを下端まで下げた 時に空行を表示してしまうなどをすると正しく取得できなくなると いったことが起こります。現在では保存すれば修正されるみたい ですが、保存をせずに正しく取得できるようにするための方法は ありますでしょうか。 宜しくお願いいたします。

  • クラス、オブジェクト、インスタンス、メソッドについて。

    クラス、オブジェクト、インスタンス、メソッドに ついて教えていただけないでしょうか? 今現在の自分の認識では、乗り物を例にすると、 「乗り物」という大枠がクラス。それを、たとえば 飛行機なり電車なり船なり、より具体的にした ものがインスタンス=オブジェクト。 その具体化したものの挙動、動作(走るとか飛ぶとか) がメソッド、という理解です。 ただ、これだとオブジェクトとインスタンスを 同じものとして見てしまっているので、この2つの 違いを明確に説明しろと言われると困ってしまいます。 インスタンスとオブジェクトの違いを明確にした上で うまく伝えられる方法があれば、ご教授ください。

  • エクセルVBA:軸の設定でエラー、どこが悪いのか教えて下さい!

    エクセルVBAでグラフ(散布図)を作成しました。データ範囲がワークシート上の3列で最左列をx軸に指定しようとしましたが、エラーが出てしまいました。エラーコードを示します。 ActiveSheet.Chart.SeriesCollection(1).XValues = Range(Cells(4, 4), Cells(4 + h - ErrFCount, 6)) h - ErrFCount=整数値なので気にしないで結構です。 「このオブジェクトは、このコレクションまたはメソッドをサポートしていません。」と出てきます。

  • EXCEL VBAのRangeプロパティについて

    EXCEL VBAのRangeプロパティについて 下の2つのプログラムで表示されるメッセージは、 プロシージャAは"$B$1" プロシージャBは"$A$1" なのですが、Rangeプロパティはどういう使われ方をしているのでしょうか? お教えくださいませ。 ・プロシージャA Sub test1() Cells(1, 2).Activate MsgBox ActiveCell.Range("A1").Address End Sub ・プロシージャB Sub test2() Cells(1, 2).Activate MsgBox ActiveSheet.Range("A1").Address End Sub

  • メソッドの作成方法

    メソッドの作成方法に関して不明な点がありますので教えてください。 次の例はExcel VBAで作成したものです。 ---- Class Point ---- Public x As Integer, y As Integer ---- Class Line ---- Public FromPoint As Point, ToPoint As Point Sub Clear() Set FromPoint = New Point ToPoint.x = 0 ToPoint.y = 0 End Sub ---- テスト用プログラム ---- Sub test() Dim a As New Point, b As New Point, c As New Line a.x = 1 a.y = 2 b.x = 3 b.y = 4 Set c.FromPoint = a Set c.ToPoint = b c.Clear End Sub -------- 以上のプログラムにおいて test を実行すると c.Clear を実行したとき a の内容は変化しませんが b の内容は変化してしまいます。 これは Clearメソッドにおいて FromPoint のように新しいオブジェクトで設定するか、ToPoint のようにオブジェクトはそのままで内容を変更するかの違いです。 メソッドの作り方としてはどちらの方法を採用すべきでしょうか。 Class を使う側からすれば、各Classごとに副作用が異なるのは困るので同じ基準でメソッドを作りたいのですが。 一般的にはメソッドを実行するたびに新しいオブジェクトを作るわけではないので(上記の例でいえば Clearメソッドで新しい Lineオブジェクトを作成するわけではない)下位レベルのオブジェクトについても新たにオブジェクトを作らないほうが考え方が統一されてよいとは思いますが。 しかし、下位レベルのオブジェクトを Nothing にする場合などはどうしても動作が異なってしまうので、どうすべきか混乱しています。

専門家に質問してみよう