- ベストアンサー
エクセル2003VBA ワークシートオブジェクト名でオブジェクトを取得する記述について
いつも勉強させていただいております。 こちらの掲示版に以下の質問の回答がとても興味を引いたので その件について、更にご質問させていただきたいと思います。 http://oshiete1.goo.ne.jp/qa3595532.html ご回答では、シートのオブジェクト名の変更のやり方等が 回答されておられました。 で、シートオブジェクト名の変更については理解できたのですが、 このオブジェクト名を用いてそのオブジェクトをどのように取得すれ ばいよのか、コードの記述の仕方がわかりません。 VBE画面でシートの表示名が Test(Sheet1)とした場合、シートオブジェクトを取得するコードは どのように記述するのでしょうか。 宜しくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>このオブジェクト名を用いてそのオブジェクトをどのように取得すれ >ばいよのか、コードの記述の仕方がわかりません。 「このオブジェクト名を用いて」、「オブジェクトをどのように取得」 となってるので、当方は、「このオブジェクト名をどのように使うのか」と取りましたが。 mySheet(Sheet1)なら mySheet.Range("A1").Value = 5555 勘違いでしたらご容赦願います。
その他の回答 (5)
- onlyrom
- ベストアンサー率59% (228/384)
No3、onlyromです。 >With ActiveWorkbook.WorkSheets("AAA") >処理 >End With >を >With Test >処理 >End With >と記述しなおす上で問題等無いか 問題ありません。 >シートオブジェクト名で記述していく場合に注意することなど A.xlsからB.xlsのシートを操作することはありませんか? その時、B.xlsのシートをオブジェクト名で操作することは? この機会にそこらあたりも考えてみるといいのではないでしょうか。
お礼
onlyrom様、ご返答ありがとうございます >A.xlsからB.xlsのシートを操作することはありませんか? >その時、B.xlsのシートをオブジェクト名で操作することは? >この機会にそこらあたりも考えてみるといいのではないでしょうか。 なんですが、そうなんですよね。 A.xlsからB.xlsを操作することがあるんです。 (A.xlsがVBA記述シート) 今までは、ブックをオブジェクトにセットして、そこから、シート名で シートを取得してたのですけど、今後、シートオブジェクト名(ご回答 頂いた表記だとシートコードネームの方が正しい表現?)で使っていく 時とかはどうなるのかな、と考えたりしております。 その辺り、現在は緊急に必要に迫られていないので、色々試してみてい きたいと思います。その時、また判らなくなってしまったときはご質問 させていただきたいと思います。 今回、皆様に、色々ご意見やアドバイスをいただけ、とても勉強になり ました。また、今後とも宜しくお願いいたします。
- KenKen_SP
- ベストアンサー率62% (785/1258)
> ThisWorkbook.Sheet1.Range("A1").Value > Workbooks("Test1.xls").Sheet1.Range("A1").Value 説明のため...とは思いますが、このような書き方はできません。 > シートオブジェクト名を用いる場合、親オブジェクトはbookでは無い > と言うことでいいのでしょうか? 違います。どのような場合も Book -- Sheet というツリー構造が崩れることはありません。 下記コードでイメージし易いと思います。 Dim Sh As Worksheet Set Sh = ThisWorkbook.Worksheets("Sheet1") ' ※ MsgBox Sh.Parent.Name ' // <-- OK MsgBox ThisWorkbook.Sh.Parent.Name ' // <-- NG この例でオブジェクト(変数) Sh は、 ※部分で既に親オブジェクト である BOOK を含めてシートを参照しています。※部で親オブジェクトを 明示的に装飾していないコード、 Set Sh = Worksheets("Sheet1") であっても、単に ActiveWorkbook が省略された形に過ぎませんから、 やはり BOOK を親オブジェクトとしてシートを参照しています。 以上を踏まえ、NG コードを考えますが ThisWorkbook.Sh.Parent.Name は親オブジェクトを2重装飾していることになり、過装飾でエラーです。 身近な例で言えば、 東京都 -- 新宿区 東京都 -- 東京都 -- 新宿区 のような違いですね。人間には2番目に市町村名がくることがわかり ますので、多少イレギュラーな書き方でも理解はできますが、VBA は この原則が崩されると理解不能に陥ります。 コードネームを使うということは、これと考え方は同一です。つまり、 コードネームで呼びだす場合、親オブジェクトである BOOK を 改めて装飾する必要はない。 ということです。
お礼
KenKen_SP様、ご返答ありがとうございます。 今回ご説明いただいた内容で、自分のコードの記述の エーラーの原因がはっきり理解できました。 このように判り易い例までだしていただき誠に感謝です。 いままで、気づかなかった事などいろいろな事がこの事に より理解できました。 今後ともいろいろご質問させていただく事があるかと思います が宜しくお願いいたします。
- Wendy02
- ベストアンサー率57% (3570/6232)
#1です。 #3さんの内容で、お話は分かりましたが、私が詳しく書かなかったのがいけなかったかもしれませんが、前の書き込みの意味を取り違えていらっしゃるようです。前回の内容は、あくまでも、変更した理由のこちらの推測なのです。別に変えなくても済むものだったかもしれないのです。 >ActiveWorkbook.Test.Range("A1").Value = 5555 >親オブジェクトはbookでは無いと言うことでいいのでしょうか? このような質問が出てくるというのでは、実際に、コンテナ(上位オブジェクトから)の概念とか、オブジェクトの構造が分かっていらっしゃらないように思えます。これらは、基本的なことですから、ローカルウィンドウで、まず、シート・オブジェクトや、その上のParent やオブジェクト名で表されているものは、どういうものか、とか、ご自身で見て研究してください。そうすれば分かります。 ただ、あくまでも、既存のオブジェクト名にすると、シート名と混乱させられるから、ユニークな名前で混乱しないようにしているわけで、シート名"Sheet1"を、"Sheet4"に換えられたからといっても、元のオブジェクト名のSheet1 は替えられてはいないのです。これは、そのブックの中のシートの固有(ユニーク)なオブジェクトの名称です。 実際に、オブジェクトを、そのままSheet1 にしても問題はありません。シート名は、任意で変えられますが、オブジェクト名は、明示的に替えなければ、替えられないということです。それを押さえておいてください。 ThisWorkbook.Sheet1.Range("A1").Value でも、Workbooks("Test1.xls").Sheet1.Range("A1").Value でも、良いわけです。つまり、オブジェクト名(CodeName)自体に気づけば、それはそれで用件は済んでいるわけで、あえて名前を変更する必要などはありません。 最終的には、今度は、プロジェクト名自体をユニークなものにするというのが、システム設計のひとつになっていくのです。これらは、開発の実践のテクニックで、別に、一般的には必要のないのです。 なお、マクロとしては、#2のzap35さんご指摘の、VBComponentsのコレクションに属しているという考え方で操作するほうが、今度は、シートオブジェクト全体(シートモジュールとシート両方)として捉えるには適していると思います。
お礼
wendy02様いつもご返答ありがとうございます。 ご指摘の通り、まだまだ理解しないままVBAコードを記述している事 が多々あります。こういったご意見をお伺いでき、更にスキルアップ に繋げていきたく思います。 今回ご指摘いただいた、コンテナの概念やオブジェクトの構造について も、最近やっと少しづつ理解できるようになって来たところです。 ご回答で VBComponents と言う言葉がありますが、このこと自体、???であり、ご回答いただ いた内容がつかみきれていないというのが素直な感想であります。 しかしながら、キーワードとして今後自分の勉強に活かしていきたいと 思います。 今後もいろいろご質問することが在ると思いますが宜しくお願い いたします。
- zap35
- ベストアンサー率44% (1383/3079)
私も先日試して見ました。意味が多少異なるかもしれませんが ThisWorkbook.VBProject.VBComponents(n).Name でも取得できるみたいです。(nはインデックス値を示します) インデックス「1」は「ThisWorkbook」、インデックス「2」が最初のシートみたいですね。 ただし「マクロ」→「セキュリティ」→「信頼する発行元タブ」で「VBA Projectへのアクセスを信頼する」にチェックが必要です。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 その回答者です。本来は、その件は、書くべきかなってちょっとは思っていたのです。 Test で、オブジェクト自体は取れているのですが、オブジェクト名の名称は、以下のようにシート名から、CodeName を使い、 objName =Worksheets("Sheet1").CodeName で、取れます。ただし、値の取得のみで、変更は利きません。 少し、研究してみてください。
お礼
onlyrom様ご返答ありがとうございます。 ご質問の内容はご指摘の通りです。 コードの記述のやり方が理解できました。 ありがとうございます。 で、onlyrom様のお礼文面上で申し訳ないのですが、 今回このご質問になった原因が 自分は以下の記述をしてエラーになったためであります。 Sub test2() ActiveWorkbook.Test.Range("A1").Value = 5555 End Sub 以下の記述だとエラーが出ないと言うことだと、シートオブジェクト名 を用いる場合、親オブジェクトはbookでは無いと言うことでいいのでしょうか? Sub test1() Test.Range("A1").Value = 5555 End Sub Sub test3() Test.Cells(1, 1).Value = 5555 End Sub もしお手数でなければ、皆様の意見をお聞かせいただきたいと思います。 また、ご回答いただきました皆様にはとても感謝です。 おかげさまで、この記述の仕方だと、シート名が変更されても、問題 無くコードが作動するので、シート名に気を使う必要がなくなりました。 誠にありがとうございます。
補足
下記のお礼での文面での質問内容の補足をさせていただきます。 ご意見をお聞かせいただきたいと言うのは、 With ActiveWorkbook.WorkSheets("AAA") 処理 End With を With Test 処理 End With と記述しなおす上で問題等無いかという事などであります。 シートオブジェクト名で記述していく場合に注意することなど ございましたら、ご意見を伺いたいと思いました。