• ベストアンサー

エクセル2003VBA ワークシートオブジェクト名でオブジェクトを取得する記述について

いつも勉強させていただいております。 こちらの掲示版に以下の質問の回答がとても興味を引いたので その件について、更にご質問させていただきたいと思います。 http://oshiete1.goo.ne.jp/qa3595532.html ご回答では、シートのオブジェクト名の変更のやり方等が 回答されておられました。 で、シートオブジェクト名の変更については理解できたのですが、 このオブジェクト名を用いてそのオブジェクトをどのように取得すれ ばいよのか、コードの記述の仕方がわかりません。 VBE画面でシートの表示名が Test(Sheet1)とした場合、シートオブジェクトを取得するコードは どのように記述するのでしょうか。 宜しくお願いいたします。

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

>このオブジェクト名を用いてそのオブジェクトをどのように取得すれ >ばいよのか、コードの記述の仕方がわかりません。 「このオブジェクト名を用いて」、「オブジェクトをどのように取得」 となってるので、当方は、「このオブジェクト名をどのように使うのか」と取りましたが。  mySheet(Sheet1)なら   mySheet.Range("A1").Value = 5555 勘違いでしたらご容赦願います。  

tmgolf
質問者

お礼

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 もしお手数でなければ、皆様の意見をお聞かせいただきたいと思います。 また、ご回答いただきました皆様にはとても感謝です。 おかげさまで、この記述の仕方だと、シート名が変更されても、問題 無くコードが作動するので、シート名に気を使う必要がなくなりました。 誠にありがとうございます。

tmgolf
質問者

補足

下記のお礼での文面での質問内容の補足をさせていただきます。 ご意見をお聞かせいただきたいと言うのは、 With ActiveWorkbook.WorkSheets("AAA") 処理 End With を With Test 処理 End With と記述しなおす上で問題等無いかという事などであります。 シートオブジェクト名で記述していく場合に注意することなど ございましたら、ご意見を伺いたいと思いました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.6

No3、onlyromです。 >With ActiveWorkbook.WorkSheets("AAA") >処理 >End With >を >With Test >処理 >End With >と記述しなおす上で問題等無いか 問題ありません。 >シートオブジェクト名で記述していく場合に注意することなど A.xlsからB.xlsのシートを操作することはありませんか? その時、B.xlsのシートをオブジェクト名で操作することは?   この機会にそこらあたりも考えてみるといいのではないでしょうか。    

tmgolf
質問者

お礼

onlyrom様、ご返答ありがとうございます >A.xlsからB.xlsのシートを操作することはありませんか? >その時、B.xlsのシートをオブジェクト名で操作することは? >この機会にそこらあたりも考えてみるといいのではないでしょうか。 なんですが、そうなんですよね。 A.xlsからB.xlsを操作することがあるんです。 (A.xlsがVBA記述シート) 今までは、ブックをオブジェクトにセットして、そこから、シート名で シートを取得してたのですけど、今後、シートオブジェクト名(ご回答 頂いた表記だとシートコードネームの方が正しい表現?)で使っていく 時とかはどうなるのかな、と考えたりしております。 その辺り、現在は緊急に必要に迫られていないので、色々試してみてい きたいと思います。その時、また判らなくなってしまったときはご質問 させていただきたいと思います。 今回、皆様に、色々ご意見やアドバイスをいただけ、とても勉強になり ました。また、今後とも宜しくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

> 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 を   改めて装飾する必要はない。 ということです。

tmgolf
質問者

お礼

KenKen_SP様、ご返答ありがとうございます。 今回ご説明いただいた内容で、自分のコードの記述の エーラーの原因がはっきり理解できました。 このように判り易い例までだしていただき誠に感謝です。 いままで、気づかなかった事などいろいろな事がこの事に より理解できました。 今後ともいろいろご質問させていただく事があるかと思います が宜しくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#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のコレクションに属しているという考え方で操作するほうが、今度は、シートオブジェクト全体(シートモジュールとシート両方)として捉えるには適していると思います。

tmgolf
質問者

お礼

wendy02様いつもご返答ありがとうございます。 ご指摘の通り、まだまだ理解しないままVBAコードを記述している事 が多々あります。こういったご意見をお伺いでき、更にスキルアップ に繋げていきたく思います。 今回ご指摘いただいた、コンテナの概念やオブジェクトの構造について も、最近やっと少しづつ理解できるようになって来たところです。 ご回答で VBComponents と言う言葉がありますが、このこと自体、???であり、ご回答いただ いた内容がつかみきれていないというのが素直な感想であります。 しかしながら、キーワードとして今後自分の勉強に活かしていきたいと 思います。 今後もいろいろご質問することが在ると思いますが宜しくお願い いたします。

全文を見る
すると、全ての回答が全文表示されます。
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

私も先日試して見ました。意味が多少異なるかもしれませんが  ThisWorkbook.VBProject.VBComponents(n).Name でも取得できるみたいです。(nはインデックス値を示します) インデックス「1」は「ThisWorkbook」、インデックス「2」が最初のシートみたいですね。 ただし「マクロ」→「セキュリティ」→「信頼する発行元タブ」で「VBA Projectへのアクセスを信頼する」にチェックが必要です。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 その回答者です。本来は、その件は、書くべきかなってちょっとは思っていたのです。 Test で、オブジェクト自体は取れているのですが、オブジェクト名の名称は、以下のようにシート名から、CodeName を使い、 objName =Worksheets("Sheet1").CodeName で、取れます。ただし、値の取得のみで、変更は利きません。 少し、研究してみてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAでオブジェクト名を変更する方法

    Excelでシートを新規追加するマクロを作っています。この時、下記のようなコードでシート名を変更するのですが、同時にオブジェクト名も変更する事は可能でしょうか? Sheets.Add ActiveSheet.Name = "テスト" なぜオブジェクト名も変更したいのかと言いますと、動的にイベントプロシージャを作成する際、下記のようなコードを記述してるのですが、シート名とオブジェクト名が一致してないとエラーが出てしまうんです。 Dim cdMoj as CodeModule Dim Ln as Long Set cdMoj = ThisWorkBook.VBProject.VBComponents(ActiveSheet.Name).CodeModule Ln = cdMoj.CreateEventProc("Click", "Command1") cdMoj.InsertLines Ln + 1, "MsgBox ""VBAで追加したマクロです。""" なにか良い方法がありましたらご教授下さい。どうぞ宜しくお願いします。

  • ExcelVBAでワークシートのオブジェクト名を調べ、「Sheet(何番)」まであるか調べる方法

    Excelのプログラムで、新規作成の初期段階ではワークシートのオブジェクト名は「Sheet1」とか「Sheet2」とかなってると思うのですが、そのオブジェクト名を調べ、ワークシートの数を調べるコードが分かる方がいれば教えてください。 具体的には書けないのですが、1から順に2、3……とワークシート番号があるかどうか調べ、オブジェクト名とワークシート番号が一致しない、つまり、もうこれ以上ワークシートが存在しない場合、その判定を終了させるようなコードだとは思うのですが…。 回答よろしくお願いします。

  • Access VBAよりシート名を取得したい

    お世話になります。 現在、Accessにてツールを作成しておりますが、VBAより 特定のパスにあるExcelファイルのシート名を取得する必要が あります。 ※当該ツールはRuntime環境にて利用するため、CreateObject  が利用できません。 取得はDAO.Tabledefs を使って取得できましたが、GetObjectを 使って取得する方法をご教授頂けると幸いです。 シート名を取得するExcelファイルが、 C:\test\テスト.xlsxの場合 どのような記述になりますでしょうか。 勉強不足で大変恐縮ですが、ご教授のほど宜しくお願い致します。

  • EXCELでシート名を変更できなくしたい。(VBAです)

    こんにちは。 タイトルの通りなのですが、EXCELでセルの内容の変更はOKで シート名のみ変更できなくしたいのです。 もしくは変更されたら「シート名は変更できません」等のメッセージを出して、元のシート名に戻すと言うのでも結構です。 どのように、またどこに(それぞれのシートのオブジェクトのところ???)書けばいいのか教えて下さい。

  • Excel VBA:ひとつ前に開いていたシート名の取得

    Sheet1,2,3があり、全て同じ種類の「表」が書かれているとします。 例えばクラス名簿だとして、 Sheet1には出席番号1~10の生徒のデータ、 Sheet2には出席番号11~20の生徒のデータ、のように。 各シートのうち、違うのはデータの中身であって、 [出席番号][生徒氏名]などの項目は同じです。 この時、 Sheet1で項目名を変更した時、Sheet2、Sheet3の項目名も同時に変更させたいです。 Sheet1の[出席番号]を[No.]に変更したら、Sheet2,3の[出席番号]も自動的に[No.]に変更させたいです。 また、変更可能なのはSheet1だけでなく、Sheet2の項目を変更した時もSheet1,3の項目を自動的に変更したいです。 常にSheet1の項目を参照するのであれば、 Private Sub Workbook_SheetActivate(ByVal ActSheet As Object) SName = "Sheet1" Sheets(SName).Range("A4:G4").Copy 'Sheet1の項目をコピー Sheets(ActSheet.Name).Range("A4").Select ActiveSheet.Paste '現在アクティブなシートにSheet1の項目をコピー End Sub で可能でした(諸事情によりセル内に「=Sheet1!A4」等と書きたくないです)。 このコードで、 参考するシート名を入れる変数SNameに「1つ前に開いていたシート名」を入れることができれば可能だと思うのですが、 そのようなデータを取得することはできるでしょうか? よろしくお願いします。

  • Excel VBA オブジェクトの指定方法と速度

    Excel VBAについて質問です。 ワークシートを指定するときの書き方には色々ありますが、1~3の速度の順番はどうなりますか? オブジェクトは、変数に入れて使用したほうが速度が速くなるそうなので、 1より2のほうが速いと思いますが、3はどうでしょうか? 1.Worksheets("sheet1") 2.Dim ws As Worksheet   Set ws = Worksheets("sheet1") 3.Sheet1 (VBE画面で表示されるシートのプロパティのオブジェクト名) Excelのオブジェクトについて詳しいかたがいらっしゃいましたら教えてください。 よろしくお願いいたします。

  • EXCEL2007 VBA アクティブでないワークシートの名前を取得したい

    Sheet1とSheet2の【A1セル】【B1セル】には以下の処理が入っています。また2つのシートにはVBAを使って、再計算がされるたびに自身のシート名を表示するメッセージボックスを出力する処理を記述しています。 【A1セル】  リアルタイムで値が送られてくる。 【B1セル】  A1セルの値を使った式 【VBA】  Private Sub Worksheet_Calculate()   MsgBox **************  End Sub ここからが質問なんですが、Sheet3をアクティブシートにしている場合、VBAの「*****」の部分に何と記述すれば、再計算されたシート名を取得できますか?

  • 【Excel】シート名の取得

    Excel2003を使用しています。 シート名をそのシート内のセルに入力する数式に使いたいのですが、関数でシート名を取得することは可能でしょうか? イメージ的には、ヘッダーやフッターにシート名を表示させるような感じで、シート名を変更したら、セルの表示も変更できるようにしたいのですが… 以前、別件で同様のことを質問したことがあり、マクロでなら可能という回答をいただいて、参考のURLも記載していただいていたので、URLを見ようとしたのですが、これが数ヶ月前のことでして、URLを見ることができなくなっていました。 よろしくお願いします。

  • シート名を変更してもVBAでエラーにならないように

    VBA初心者です。 VBAで複数のシートを選択するという動作を行う時、シート名を変更するとエラーになってしまうのですが、どうすれば回避できるのでしょうか?オブジェクト名?が使用できるらしいのですが、エラーになってうまく動作しません。指定の仕方を変える必要があるのでしょうか? 例えば、  Sheets(Array("第1週", "第2週", "第3週", "第4週", "第5週")).Select  Sheets("第1週").Activate と記述してあって、シート名の"第1週"を"9月1日"とかに変更したら、当然エラーになりますが、 左のプロジェクトエクスプローラにある、Sheet1(第1週)の名前の変わらないオブジェクト名"Sheet1"の方で指定したいと思うのですが、単純に名前を置き換えても動作しません。どのように指定すればよいのでしょうか?

  • EXCELのシート名を取得して計算式を入れると

    下記のモジュールでBOOK内のシート名を取得して 一番最初のシートに計算式を入れようとしているのですが シート名が上手く取得できずに困っています. シート名が 「シート名1」,「シート名2」 ならOKですが シート名が 「シート名1-1」,「シート名1-2」,「シート名2-3」 このようにシート名に「-」が含まれると 上手く計算式が入らず セルを見ると =シート名1-'1'!$A$1 と変な所にシングルクオーテーションが挿入されてしまいます。 どのように記述したらいいのでしょうか? For Each objSheet In ActiveWorkbook.Sheets     Worksheets("総表").Cells(1, 1).Value = "=" & objSheet.Name & "!$A$1" Next ご教授ください  、よろしくおねがいします。

専門家に質問してみよう