• ベストアンサー

エクセルVBAの構文についての質問です

ちょっと前から勉強しはじめた超超初心者なんですが、オブジェクトやプロパティといった概念がちょっと理解できないでくるしんでいます 1、 Sub 図形非表示() ActiveSheet.Shapes("図形").Visible=False End Sub これは本にのっていた例文でアクテブシートの「図形」という名前のオートシェイプを非表示にする文なのですが本には「Visible プロパティ」 「Shapes プロパティ オートシェイプを返します」とありますがこれはつまり「Shapesプロパティ自体がオブジェクトになっている」ということなのでしょうか?「Shapes プロパティ」とかいてあるのでただのプロパティなのではないか???とおもってしまうのですが・・・ 2、 1と同じ感じなのですが Sub ワークシートに色を設定()   Worksheets("メニュー").Cells.Interior.ColorIndex=11 End Sub もInteriorプロパティ自体がオブジェクトになっているのでしょうか?? だとしたら全てのプロパティもオブジェクトになれるのでしょうか? 是非どなたか教えてください、よろしくお願いします

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

こんにちは。KenKen_SP です。 VBAは独学なので自己流解釈です。以下の内容に間違いがあれば指摘願います。 VBA は基本的には [オブジェクト].[プロパティー] という文法で成り立って います(メソッドが来ることもありますが)。 プロパティーの機能は次の2点。  ・オブジェクトの属性値を【取得】する ex) A = ActiveSheet.Name  ・オブジェクトの属性値を【設定】する ex) ActiveSheet.Name = "TEST" プロパティーはあくまで、オブジェクトの属性値の取得・設定しかできません。 したがって、プロパティーがオブジェクト自体にはなり得ません。 ご質問の例では、下記の様に分割して考えると理解し易いかもしれません。 (注)あくまで説明のためで、本来のVBAの文法とは違います。   ※{ActiveSheet.Shapes("図形")}.Visible = False まず{}内から見てみます。 Shapes プロパティーはオブジェクト(ここでは ActiveSheet )内の 「Shapes コレクション(=Shapeオブジェクトの集合)への参照」という値 (=リンクと考えて下さい)を返します。  ・ Shapes プロパティーは()で Shape オブジェクトの集合から「どの    Shape か」を指定することができます。 したがって、{ActiveSheet.Shapes("図形")}で「図形という名を持つ シェープオブジェクトへの参照」という値を返し、プロパティーはあくまで 値しか返していませんが、結果として、シェープオブジェクトを構成しています。 基本文法どおり [オブジェクト].[プロパティー] という構文になっています。 この様に読み解けば、※ を次の様に解釈することができます。   {ActiveSheet.Shapes("図形")}=シェープオブジェクトへの参照=シェープオブジェクト   {シェープオブジェクト}.Visible = False 同様に、Worksheets("メニュー").Cells.Interior.ColorIndex=11 は   {Worksheets("メニュー").Cells}=Range オブジェクトへの参照=Rangeオブジェクト   {(Rangeオブジェクト).Interior}=Interior オブジェクトへの参照=Interiorオブジェクト   {Interiorオブジェクト}.ColorIndex = 11 と解釈すれば全ての構文は [オブジェクト].[プロパティー] という基本文法 どおりです。 つまり、[オブジェクト].[オブジェクトへの参照を返すプロパティー]となって 初めて[オブジェクト]を構成します。

その他の回答 (5)

  • hiro-ss
  • ベストアンサー率15% (3/19)
回答No.5

超超初心者と言うことで、Shapesがプロパティかオブジェクトかよりも「プロパティって何?プロパティとオブジェクトって正確にはどう違うの?」ってところで引っ掛かってる、と解釈してみます。 自分も始めた頃、そこで引っ掛かったんで・・。 (^_^; 私の場合、はじめは数学の公式や英語の文法の様ようなとらえ方でやってました。 英語で言えばオブジェクトが主語(目的語)でプロパティやメソッドが述語って感じです。 でも、主語+主語+述語や 主語+述語+述語 みたいなのが出てくる。 で、真ん中のを調べると ある本にはオブジェクトまたある本にはプロパティと表記してあり、訳が分からなくなる。 後で思ったのは、オブジェクトとかプロパティとかははっきりとその性質を持ったモノが有るんではなく、マクロを作る人が操作しやすい様に便宜的に分類してるに過ぎないってことです。 だから、オブジェクトとして覚えてたのにプロパティとして捉えないとスッキリしないって事も出てくるんではないでしょうか。 例えばWorksheets(1)さえ、PC内にそういう1つの物体がある訳じゃなく、HDD内にバラバラに書き込まれたセルなどのデータの1つの属性というか名札の様なもんですから、プロパティと捉える場合も出てくるかも知れません。 たぶんVBAも徹底的に奥まで行って機械言語や0と1の2進法の処まで勉強すれば完全に理屈は通るんでしょうけど。 日本語で書くと  ワークブックA . ワークシート1 . レンジA2 . フォント . 色番号3 という記述も有ります。 1つのオブジェクト+1つのプロパティ(又はメソッド) の型じゃないです。 次第に絞り込んでいって結果的に文字に色が付く感じです。 VBAを進めると、「一部を除いて」とか「基本的には」とか「例外はありますが」とかが頻繁に出てきます。 だから「どちらかハッキリさせる」より、「こちらから見ればオブジェクトで反対側から見ればプロパティ」くらいに考えて、後はたくさんの例文を覚えていくしかない思います。 はずしてたらゴメンなさい。 (^_^;

noname#79209
noname#79209
回答No.4

ご質問の例では、図形」という名前のオートシェイプがオブジェクトです。 プロパティはこのオブジェクトの設定内容と思っていただければよいでしょう。 例えば、タテ/ヨコのサイズ、表示する位置、表示するかしないか等です。 「Shapes プロパティ オートシェイプを返します」というのは、ShapeでなくShapesであることに注目してください。 これはひとつのSheetにShapesというプロパティがあり、そのSheet中にどんなシェイプが入っているかのリスト(コレクションと言います)です。 そのリスト中のどのシェイプの設定をするかを指定するわけです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。Wendy02です。 私は、あまり説明ができないのですが、プロパティのコーディングというのは、最終的なプロパティの特定化に過ぎないのではないでしょうか?(同じこどを書くようですが) 例えば、地図で、東京の秋葉原の何とかというお店で、ある部品を手に入れるっていうのは、意外に大変なことなんですね。ある部品を手に入れるために、どこそこのお店にあるというので、それが秋葉原のどこそこにあるから、そこで手に入れるというほうが楽なんです。 実は、私は、『VBA辞典』(秀和システム)は買ったのですが、なかなか使いこなせないというか、上で書いてあるとおりで、秋葉原のいろんなお店があって、いろんなものはあるようなんですが、いざ、自分の欲しいものを探すと、見つからないっていうことが良くあるのですね。 ローカルウィンドウとかあるので、それを探して決めることもありますが、ローカルウィンドウには出てこないものや、ローカルウィルンドウには見えていても、プロパティを指定できないものがあります。結局は、知らないと出来ないわけで、多くのお手本となるコードを読んで、個々のオブジェクトのプロパティやメソッドではなく、最終的な目的のステートメントとして、使い方を覚えていくほうが良いような気がしています。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 基本的には、   オブジェクト.プロパティ と考えて間違いないと思います。 オブジェクトのプロパティを指定して、オブジェクトを返すということだってありえますよね。 プロパティというのは、オブジェクトの属性・特徴を取るためのものであって、それが、構造的な構成要素を持っていれば、オブジェクトであると考えてよいと思います。例外はあるけれど、一応、そうすれば割り振りは利きます。 >「Shapesプロパティ自体がオブジェクトになっている」ということなのでしょうか? >「Shapes プロパティ」とかいてあるのでただのプロパティなのではないか??? 最終のプロパティまでは、戻り値はオブジェクトということはありえますね。つまり、上位オブジェクトのプロパティが、必ずしも Value ということはありませんね。 私は、あまり自信もって説明できませんが、通常使うときは、ステートメントのその途中の過程で、プロパティなのか、オブジェクトなのかは、その値や設定をする最終目的まではあまり考えたことがありませんね。 逆に、その上位概念のRangeオブジェクトやShapeオブジェクトのプロパティの種類から枝分かれして、覚えていくとしたら、とても覚えられません。 俗に、『下部構造が上部構造を決定する』とかいいますでしょう。(^^; 最終的な目的から、上部を決定していく考え方になるのではないかと思います。

sha-penn
質問者

お礼

ご回答ありがとうございます ちょっとまだ初心者なものでぼんやりとしかwendyさんのいっていることは わからないのですが、要するにその文の最後のう方をみて最初の方がオブジェクトなのかどうかを判断するくらいでよいということでしょうか?? 確かにそのほうがちょっと気楽ですね、ありがとうございます^^

  • shkwta
  • ベストアンサー率52% (966/1825)
回答No.1

>「Shapesプロパティ自体がオブジェクトになっている」ということなのでしょうか? プロパティはオブジェクトに関する各種の「値」を返す機構ですが、その「値」はオブジェクト(への参照)である場合も、文字列・数値である場合もあります。 >「Shapes プロパティ」とかいてあるのでただのプロパティなのではないか 「ただのプロパティ」とは文字列や数値を返すプロパティのことだと思いますが、オブジェクトを返すプロパティになにか特別の名前をつけて区別してあるわけではないので、「プロパティ」と書いてあったら、どんな型の値を返すのか確認する必要があります。 >Interiorプロパティ自体がオブジェクトになっているのでしょうか?? InteriorプロパティはInteriorオブジェクトを返します。 >全てのプロパティもオブジェクトになれるのでしょうか? 上にも書きましたが、プロパティごとに、何を返すのかを確認してください。

sha-penn
質問者

お礼

ご回答ありがとうございます なるほどいろいろプロパティにも様々な分類分けがあるようなのですね 今手元にそういう辞典はないのですが買ったらちょくちょくしらべてみよ うとおもいます

関連するQ&A

  • エクセルVBAでShapesまたはDrawingObjects

    シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub

  • エクセルVBAの記述方法の質問です。

    エクセルです。12個のセルの文字列をオートシェープの吹き出しに順に表示させるマクロをつくりました。 Sub tenki2() Dim i As Integer Dim a As String For i = 1 To 12 a = Cells(i, 2).Value ActiveSheet.Shapes("AutoShape 4").Select Selection.Characters.Text = a Application.Wait Now + TimeValue("00:00:05") Next i End Sub これで思った通り表示されるのですが、できればオートシェープをセレクトしないようにしたいのです。 (シートを保護するため) それで ActiveSheet.Shapes("AutoShape 4").Select Selection.Characters.Text = a のところを ActiveSheet.Shapes("AutoShape 4").Characters.Text = a と変えたのですが、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」という実行時エラーがでてしまいました。書き方のどこがまずかったのでしょうか?ご教示いただければ幸いです。

  • Excel2003で簡単な図形の表示と非表示のプログラムを作成したので

    Excel2003で簡単な図形の表示と非表示のプログラムを作成したのですが上手く出来ません UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1に楕円の図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1に楕円の図形2非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1に楕円の図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1に楕円の図形2表示 End Sub 上記の記述では上手くいくのですが、下記の様に ワークシート2の図形3と4も同様に表示・非表示したいため追加するとエラーになります。 UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1の楕円図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1の楕円図形2非表示 ActiveSheet.Shapes("Oval 3").Visible=True 'ワークシート2の楕円図形3表示 ActiveSheet.Shapes("Oval 4").Visible=False 'ワークシート2の楕円図形4非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1の楕円図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1の楕円図形2表示 ActiveSheet.Shapes("Oval 3").Visible=False 'ワークシート2の楕円図形3非表示 ActiveSheet.Shapes("Oval 4").Visible=True 'ワークシート2の楕円図形4表示 End Sub VBAの勉強中の初心者です。教えて頂けないでしょうか。

  • excel VBA 作成したUserFormにoptionButton

    excel VBA 作成したUserFormにoptionButtonを多数配置しています。このUserFormをワークシート上に再表示すとる、チェック項目に入力したチェックが消えてしまいます。消えない方法が解りません。 private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=False '図形1表示 End sub private sub OptionButton1_Click() Activesheet.Shapes("図形1").Visible=True  '図形1非表示 End sub  同様な書式で数項目あります。 又、保存したワークシートを読み込んだ場合も同様に出来ないでしょうか。optionButtonのチェック項目が多数あります。チェック項目は図形を表示と非表示です。何方か良い方法がありましたら教えて頂けないでしょうか。宜しくお願いします。

  • [エクセル2007] 図形を非表示にするマクロ

    図形「図A」を非表示にするマクロがあります。 Sub 図削除() ActiveSheet.Shapes("図A").Visible = False End Sub これを図A、図B、図C・・・・・・と増やしていく場合はどうすれば良いのでしょうか? Sub 図削除() ActiveSheet.Shapes("図A").Visible = False ActiveSheet.Shapes("図B").Visible = False ActiveSheet.Shapes("図C").Visible = False            ・            ・             ・ End Sub とするしかないのでしょうか?

  • EXCELVBAで同じフォームボタンで表示のON/OFFをする。

    EXCELVBA初心者です。 図形描写の”表示”、”非表示”はできたのですが 同じボタンをクリックしてON/OFFする方法を教えてください。 ボタンが2個だといまいちなので、よろしくお願いします。 Sub 図形_del() ActiveSheet.Shapes("daily7").Visible = False End Sub Sub 図形_add() ActiveSheet.Shapes("daily7").Visible = True End Sub

  • エクセルVBAの構文。 どこが間違っているのでしょうか?

    以下の2つは同じ意味だと思うのですが、test2はエラーになります。どうしてなのでしょうか? Sub test1() ActiveSheet.Shapes.AddShape(msoShapeRectangle, 300#, 100#, 140#, 80#).Select Selection.Formula = "$A$1" End Sub Sub test2() With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 300#, 100#, 140#, 80#) .Formula = "$A$1" End With End Sub

  • VBAでオートシェープのテキストを取得の際、ShapesとDrawingObjects?

    エクセル2003です。 オートシェープの基本図形の「額縁」に以下のマクロを登録しました。 マクロを呼び出したオートシェープに表示してあるテキストを取得しようとするものです。 Sub test() x = Application.Caller MsgBox ActiveSheet.Shapes(x).Characters.Text End Sub ところが実行時エラーとなってしまいます。 試行錯誤の結果、ShapesをDrawingObjectsに変えるとうまくいきます。 なぜでしょうか?

  • EXCEL VBA これであっていますか?

    エクセルに地図を貼り付け、その中のある地点Aから半径1キロ、2キロ、3キロといった具合に円を描いています。ある地点B、Cも同様に円があります。セルに“A” と入力した際に該当する地点の円(1キロ、2キロ、3キロの3種類)を赤く表示し、終了すると円が消える(線なしに変わる)ようにするために以下のようなVBAを組みました。が、円が2つしか赤くならなかったり、 ばあいによっては「インデックスが境界を超えています」とエラーが出たりします。 どうしたら良いか教えてください。 Sub iro() Dim i As Variant i = InputBox("表示する地点を指定してください", "地点指定") If i = "A" Then ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False modosu ElseIf i = "B" Then ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False Else MsgBox "指定した地点がありません", vbOKOnly End If End Sub Sub hyoji() Selection.ShapeRange.Line.Visible = msoTrue '「線なし」に設定されている場合、線を表示 Selection.ShapeRange.Line.ForeColor.SchemeColor = 10 Range("A1").Select End Sub Sub modosu() Selection.ShapeRange.Line.Visible = msoFalse '「線なし」に設定 Range("A1").Select End Sub

  • Excelのマクロを使用してオートシェイプ図形の色を変えたいのです。

    Excelのマクロを使用してオートシェイプ図形の色を変えたいのです。 オートシェイプ図形を50個ならべて、マウスでクリックしてものは色が変わるようにしたいと思います。 マクロ記録をすると以下のようになりました。 Sub Macro1() ActiveSheet.Shapes("AutoShape 1").Select Selection.ShapeRange.Fill.ForeColor.SchemeColor = 45 Selection.ShapeRange.Fill.Visible = msoTrue Selection.ShapeRange.Fill.Solid End Sub このプログラムを50個書くわけにはいかないのですが、プログラムで処理するのに問題点が2つ出てきました。 ・オートシェイプ図形の名前が"AutoShape 1"となっていますが、これを変更したいのですが、書式設定にはありませんでした。変更するにはどうすればよいのでしょう? ・クリックしたオートシェイプ図形がどれであるかを返す関数がないと、どの図形がクリックされたかわからないのですが、これを返す関数はあるのでしょうか? よろしくお願いします。

専門家に質問してみよう